消费者启动的时候,主要是初始化几个核心的组件。
反序列器,主要是生产者发送的消息是序列化到broker的,所以这边要反序列化进行处理。
NetworkClient之前在生产者已经讲过了,用于网络通讯。
ConsumerCoordinator是协调器,如果同一个group进行消费的时候,需要进行协调,这里和rocketmq不同,rocketmq是消费者自己来协调的(RocketMQ -- 写在消息拉取前),kafka是通过broker来协调。相同的是,消费者需要发送心跳给broker,broker才知道哪些消息费需要消费。
Fetcher主要是用来拉取消息的。
Consumer在初始化后,就开始拉取消息,但是在拉取消息之前,还需要确定Coordinator。
在没有Coordinator的时候,不如consumer1,他会随机的找到broker的地址,比如broker1。
调用broker1的接口,请求相关数据。
broker1接收到请求后,就会对groupid进行hash,并根据__consumer_offsets的topic数据进行取模,__consumer_offsets数量为50。
假设hash的值是10,而__consumer_offsets的partition为10在broker2上,那这个broker2就是Coordinator服务器。
consumer1知道broker2是Coordinator服务器后,就开始向broker2进行注册并发送心跳。
同理,consumer2由于groupid是一样的,所以计算结果也是broker2,最终也向broker2进行注册并发送心跳。
broker2就会把相关consumer信息进行保存,并选择leader consumer。
谁先注册上来,谁就是leader consumer。
注册成功后,如果是leader consumer,就会制定分区方案,发送给broker2,broker2再把这个分区方案发给其他consumer。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。