Kafka(七)深入原理--消费者consumer

一、消费方式

只要提到消息队列,必然会涉及到其推模式(push)和拉模式(pull),在kafka中,同样会涉及到。

consumer采用的时pull模式,从broker中去拉取消息。

为什么采用pull模式?
如果采用push模式,很容易造成消息的堆积,因为broker控制消息的推送速率,消息数量大的话,很难使每个消费者很难适应消息推送速率。
采用pull模式则可以使每个消费者以自身的消费能力去消费。

pull模式有什么不足?kafka如何解决这一问题?
如果kafka没有消息,则每次消费者拉去的都是空的数据,会使得其陷入循环,一直返回空数据。针对这一情况,每次消费数据的时候,消费者会带有一个时长参数timeout,当返回空数据时,消费者会等待timeout的时间,再去消费

二、分区分配策略

一个topic有多个partition,所以必然会涉及到partition的分配问题,即确定那个 partition 由哪个 consumer 来消费。
Kafka 有两种分配策略,一是 Range,一是 RoundRobin

有以下情况会导致消费者分区的重新分配
1) 当consumer group的成员数量增加或者减少。
2) 当消费者订阅的主题的partition数量变更。

2.1 Range

Range策略是对每个主题而言的。它会将每个topic的分区从0往后一次排列。

其分配算法是用topic分区的总个数除以消费者个数(这里指的消费者是同一个消费者组内的,因为不同组会得到topic的全量消息),除尽的话则消费者均匀分配,除不尽的话,在前面的消费者会多消费一个分区

我们列举三种情况来说明它:
1)有一个topic,有6个partition,有两个消费者,则经过首次分区分配后,会形成如下的形式:

Range策略-1.png

如上所示,将6个分区均匀的分给了两个消费者,6除以三除尽了,所以前三个属于consumer1,后三个属于consumer2。

2)有一个topic,有7个partition,有两个消费者,则经过首次分区分配后,会形成如下的形式:

Range策略-2.png

如上所示,consumer1比consumer2多消费了一个分区的数据。

3)有两个topic,每个有5个partition,有两个消费者,则经过首次分区分配后,会形成如下的形式:

Range策略-3.png

如上所示,发现consumer1总共消费6分区,而consumer2只消费4个。

综上所述,能够看出Range一个较为明显的弊端。

2.2 RoundRobin策略

将所有topic的partition组成TopicAndPartition列表,然后对TopicAndPartition列表按照hashCode进行排序。

使用RoundRobin策略必须满足以下条件:

1.同一个Consumer Group里面的所有consumer的num.streams必须相等(关于这个num.streams我还不知道是什么东西,知道的可以帮忙解答下)。
2.每个consumer订阅的topic必须相同。

分以下三种情况展示:
1)假设有个topic,有六个分区,假设6个分区经过hashcode的排序后顺序是5,0,4,3,2,1, 两个消费者:consumer1,consumer2,分配结果如下所示:

RoundRobin策略 (1).png

2)假设有个topic,有7个分区,假设6个分区经过hashcode的排序后顺序是6,5,0,4,3,2,1, 两个消费者:consumer1,consumer2,分配结果如下所示:

RoundRobin策略 (2).png

如上所示,consumer1会比consumer2多消费一个分区,但是也仅会多一个。没有range策略的问题。

2)假设有两个topic,每个有5个分区,假设6个分区经过hashcode的排序后顺序是topic1-0,topic1-4,topic1-3,topic1-2,topic1-1,topic2-0,topic2-4,topic2-3,topic2-2,topic2-1 ,两个消费者:consumer1,consumer2,分配结果如下所示:

RoundRobin策略-3.png

综上所述,RoundRobin与Range最大的区别
Range是为某个topic完成了分区分派以后,再进行下一个topic的分区分派;
RoundRobin是首先将这个group中的所有consumer订阅的所有的topic-partition按顺序展开,依次对于每一个topic-partition,在consumer进行round robin,为这个topic-partition选择一个consumer。

三、offset

由于 consumer 在消费过程中可能会出现断电宕机等故障,consumer 恢复后,需要从故障前的位置的继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费。

Kafka 0.9 版本之前,consumer 默认将 offset 保存在 Zookeeper 中,从 0.9 版本开始,consumer 默认将 offset 保存在 Kafka 一个内置的 topic 中,该 topic 为__consumer_offsets

当有消费者第一次消费kafka数据时就会自动创建,它的副本数不受集群配置的topic副本数限制,分区数默认50(可以配置),默认压缩策略为compact。

kafka-tool

使用以下的命令可以查看__consumer_offsets:

[root@localhost kafka_2.12-2.7.0]# bin/kafka-consumer-groups.sh --bootstrap-server 192.168.184.134:9092 --describe --group test

查看结果如下所示:

[root@localhost kafka_2.12-2.7.0]# bin/kafka-consumer-groups.sh --bootstrap-server 192.168.184.134:9092 --describe --group test

Consumer group 'test' has no active members.

GROUP           TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID     HOST            CLIENT-ID
test            test-kafka1     9          0               0               0               -               -               -
test            test-kafka2     9          0               0               0               -               -               -
test            test-kafka2     2          0               0               0               -               -               -
test            test-kafka1     0          0               0               0               -               -               -
test            test-kafka2     4          0               0               0               -               -               -
test            test-kafka1     2          0               0               0               -               -               -
test            test-kafka2     6          0               0               0               -               -               -
test            test-kafka1     4          0               0               0               -               -               -
test            test-kafka      3          202             203             1               -               -               -
test            test-kafka2     8          0               0               0               -               -               -
test            test-kafka1     6          0               0               0               -               -               -
test            test-kafka      1          74              75              1               -               -               -
test            test-kafka      7          73              74              1               -               -               -
test            test-kafka      5          74              75              1               -               -               -
test            test-kafka2     0          0               0               0               -               -               -
test            test-kafka      9          75              76              1               -               -               -
test            test-kafka1     8          0               0               0               -               -               -
test            test-kafka1     1          0               0               0               -               -               -
test            test-kafka      0          75              76              1               -               -               -
test            test-kafka2     1          1               1               0               -               -               -
test            test-kafka1     3          0               0               0               -               -               -
test            test-kafka2     3          0               0               0               -               -               -
test            test-kafka1     5          0               0               0               -               -               -
test            test-kafka      4          75              76              1               -               -               -
test            test-kafka2     5          0               0               0               -               -               -
test            test-kafka1     7          0               0               0               -               -               -
test            test-kafka      2          75              76              1               -               -               -
test            test-kafka2     7          0               0               0               -               -               -
test            test-kafka      8          74              75              1               -               -               -
test            test-kafka      6          73              74              1               -               -               -

GROUP:消费者组的id
TOPIC:主题
PARTITION:分区
CURRENT-OFFSET:当前消费的offset
LOG-END-OFFSET:最后一个offset

当CURRENT-OFFSET与LOG-END-OFFSET相等时,表示当前分区的所有消息都被消费了。

四、消费者组

kafka区别于其他的消息队列,有着自己的特性,由于消费者组的引入,使得一条消息不但能够一对一的被消费者组内的唯一消费者消费,也可以被不通消费者组的消费者同时消费。

总结起来这个消费者组和消费者的关系:如果应用需要读取全量消息,那么请为该应用设置一个消费组;如果该应用消费能力不足,那么可以考虑在这个消费组里增加消费者

通过下图举例:
消费者组 (1).png

在springboot中使用以下方式配置:

spring:
    kafka:
      consumer:
        group-id: test
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容