消费者启动的时候,主要是初始化几个核心的组件。

反序列器,主要是生产者发送的消息是序列化到broker的,所以这边要反序列化进行处理。

NetworkClient之前在生产者已经讲过了,用于网络通讯。

ConsumerCoordinator是协调器,如果同一个group进行消费的时候,需要进行协调,这里和rocketmq不同,rocketmq是消费者自己来协调的(RocketMQ -- 写在消息拉取前),kafka是通过broker来协调。相同的是,消费者需要发送心跳给broker,broker才知道哪些消息费需要消费。

Fetcher主要是用来拉取消息的。

image.png

Consumer在初始化后,就开始拉取消息,但是在拉取消息之前,还需要确定Coordinator。

在没有Coordinator的时候,不如consumer1,他会随机的找到broker的地址,比如broker1。

调用broker1的接口,请求相关数据。

image.png

broker1接收到请求后,就会对groupid进行hash,并根据__consumer_offsets的topic数据进行取模,__consumer_offsets数量为50。

假设hash的值是10,而__consumer_offsets的partition为10在broker2上,那这个broker2就是Coordinator服务器。

image.png

consumer1知道broker2是Coordinator服务器后,就开始向broker2进行注册并发送心跳。

同理,consumer2由于groupid是一样的,所以计算结果也是broker2,最终也向broker2进行注册并发送心跳。

image.png

broker2就会把相关consumer信息进行保存,并选择leader consumer。

谁先注册上来,谁就是leader consumer。

image.png

注册成功后,如果是leader consumer,就会制定分区方案,发送给broker2,broker2再把这个分区方案发给其他consumer。


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆