查看: 1355|回复: 3

kafka consumer的理解

[复制链接]
论坛徽章:
1
spark徽章
日期:2019-08-01 16:31:52
发表于 2019-5-16 07:29 | 显示全部楼层 |阅读模式

管理 Zookeeper

1Consumer Group topic 订阅
每个Consumer 进程都会划归到一个逻辑的Consumer Group中,逻辑的订阅者是Consumer Group。所以一条message可以被多个订阅message 所在的topic的每一个Consumer Group,也就好像是这条message被广播到每个Consumer Group一样。而每个Consumer Group中,类似于一个QueueJMS中的Queue)的概念差不多,即一条消息只会被Consumer Group中的一个Consumer消费。
       
1.1 Consumer partition
    其实上面所说的订阅关系还不够明确,其实topic中的partition被分配到某个consumer上,也就是某个consumer订阅了某个partition。 再重复一下:consumer订阅的是partition,而不是message。所以在同一时间点上,订阅到同一个partitionconsumer必然属于不同的Consumer Group
1.2 Consumer Consumer Group
Consumer GroupConsumer的关系是动态维护的:
当一个Consumer 进程挂掉 或者是卡住时,该consumer所订阅的partition会被重新分配到该group内的其它的consumer上。当一个consumer加入到一个consumer group中时,同样会从其它的consumer中分配出一个或者多个partition 到这个新加入的consumer
    当启动一个Consumer时,会指定它要加入的group,使用的是配置项:group.id
为了维持Consumer Consumer Group的关系,需要Consumer周期性的发送heartbeatcoordinator(协调者,在早期版本,以zookeeper作为协调者。后期版本则以某个broker作为协调者)。当Consumer由于某种原因不能发Heartbeatcoordinator时,并且时间超过session.timeout.ms时,就会认为该consumer已退出,它所订阅的partition会分配到同一group 内的其它的consumer上。而这个过程,被称为rebalance
那么现在有这样一个问题:如果一个consumer 进程一直在周期性的发送heartbeat,但是它就是不消费消息,这种状态称为livelock状态。那么在这种状态下,它所订阅的partition不消息是否就一直不能被消费呢?
1.3 Coordinator
    Coordinator 协调者,协调consumerbroker。早期版本中Coordinator,使用zookeeper实现,但是这样做,rebalance的负担太重。为了解决Scalable的问题,不再使用zookeeper,而是让每个broker来负责一些group的管理,这样consumer就完全不再依赖zookeeper了。
1.3.1 Consumer连接到coordinator
    Consumer的实现来看,在执行poll或者是join group之前,都要保证已连接到Coordinator。连接到coordinator的过程是:
    1)连接到最后一次连接的broker(如果是刚启动的consumer,则要根据配置中的borker)。它会响应一个包含coordinator信息(host, port)response
    2)连接到coordinator
1.4 Consumer Group Management
    Consumer Group 管理中,也是需要coordinator的参与。一个Consumerjoin到一个group中,或者一个consumer退出时,都要进行rebalance。进行rebalance的流程是:
1)会给一个coordinator发起Join请求(请求中要包括自己的一些元数据,例如自己感兴趣的topics
2Coordinator 根据这些consumerjoin请求,选择出一个leader,并通知给各个consumer。这里的leaderconsumer group 内的leader,是由某个consumer担任,不要与partitionleader混淆。
3Consumer leader 根据这些consumermetadata,重新为每个consumer member重新分配partition。分配完毕通过coordinator把分配情况同步给每个consumer
4Consumer拿到的分配后,继续工作。
回复

使用道具 举报

论坛徽章:
1
spark徽章
日期:2019-08-01 16:31:52
发表于 2019-5-16 17:30 | 显示全部楼层
感谢分享,解释的很详细,很受用
回复 支持 反对

使用道具 举报

论坛徽章:
1
spark徽章
日期:2019-08-01 16:31:52
发表于 2019-5-16 17:33 | 显示全部楼层
感谢分享,解释的很详细,很受用
回复 支持 反对

使用道具 举报

论坛徽章:
13
数据陷阱解读徽章
日期:2016-03-10 10:18:46spark徽章
日期:2019-08-01 16:31:52区块链徽章
日期:2018-05-24 16:10:38python徽章
日期:2017-12-07 16:06:27R研习者高级
日期:2016-09-01 10:04:51spark徽章
日期:2016-07-14 11:05:11Oracle研习者初级
日期:2016-06-16 10:32:31Oracle研习者中级
日期:2016-06-02 10:27:16Hadoop研习者初级
日期:2016-05-19 11:28:49R研习者中级
日期:2016-05-19 11:14:29数据治理徽章
日期:2016-04-22 17:30:46DB2徽章
日期:2016-04-07 10:58:04
发表于 2019-5-19 21:38 | 显示全部楼层
谢谢分享,很有用的内容,值得学习
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2019-10-15 07:31 , Processed in 0.138492 second(s), 38 queries .

关闭

扫一扫加入
本版微信群