1.消费者拉取消息之前,一定要保证已经分配了分区,步骤如下:
1)消费者向协调者申请加入消费组;
2)服务端存在管理消费组的协调者,协调者将消费者加入消费组;
3)触发消费组再平衡操作,协调者为所有消费者分配分区;
4)消费者从协调者获得分配的分区;
5)从协调获取偏移量,然后开始拉取分区的消息;
2.消费者执行再平衡和提交偏移量都是直接与协调者交互:
1)每个消费者触发再平衡的时候,都和协调者联系,由协调者执行全局的分区分配;
2)协调者分配完成后,将分区分配给每个消费者;
3)每个消费者收到任务列表后,启动拉取钱程,拉取对应分区的消息,并更新拉取状态。
4)消费者周期性提交分区的偏移量给协调者,协调者将分区偏移量写到内部主题。
3.协调者分配分区
1)需要等待所有的消费者假如消费者之后,才能执行分区分配算法;
2)消费者加入消费组的请求,得到的是异步对象;
4.消费消息
1.超时;
2.多次异步拉取消息;
3.为防止消息处理不及时,超时导致协调者误以为消费者挂掉,设置拉取大小阈值
4.上一次拉取没处理完成,不处理下一次的;
5.消费者的心跳任务
消费者的协调者通过发送心跳任务,来确保客户端的消费者和服务端的协调者之间的正常通信;
1)消费者发送心跳任务的时候,并为返回的异步请求,添加一个监听器;
2)心跳任务的信息:回话超时时间、定时任务间隔时间,最近的回话充值时间、最近的心跳发送时间、接收时间;
3)心跳任务,座位延时任务,被放置在延迟队列中,客户端轮询,去除可以调度的任务,执行其;
4)创建流程:在发送心跳请求钱,记录最近发送时间,在收到心跳响应结果后,记录最近心跳接收时间,然后计算下一次心跳发生时间,新建一个延迟心跳任务
5)心跳延迟任务通过客户端的轮询来触发;
6)客户端调用心跳的reset来创建第一个延迟任务:需确保连接上协调者,且消费组是活动的,即需获取协调者和接入消费组
7)对错误的处理:协调者挂掉了,消费组重新请求“获取协调者”,协调者没挂掉,客户端重新发送“假如消费者”请求;
如果发生了这些错误,心跳任务会修改状态,客户端轮询的时候,会去处理;
6.消费者提交偏移量
1)自动提交任务:定时将分区偏移量保存到服务端;
2)每次任务完成后,像心跳任务一样创建下一次延迟任务;
3)第一个任务:加入消费者之后,调用自动提交任务的enable()创建第一个延迟的自动提交任务;
4)也是采用异步加上回调方法的形式;
5)异步定时提交任务为什么用“拉取偏移量”:定时提交任务执行是发生在上一次kafka轮询都全部执行完成之后,上一次更新了拉取偏移量,也处理了上一次拉取的记录集;
6):同步提交偏移量:阻塞,这个一般发生在消费者需要精确控制提交偏移量的时机
7:提交偏移量 -> 消费者消息处理语义
1)至多一次:先保存消费进度,再处理消息;自动提交,间隔很短;
2)至少一次:先处理消息,最后才保存消费进度;可以将自动提交的时间间隔设长,手动调用提交偏移量;
3)正好一次:在保存消费进度和保存消费结果之间,引入两阶段提交协议;或者让消费者将消费进度和处理结果保存在同一存储介质中。
设置消费者不自动提交偏移量,订阅主题时设置自定义的消费者再平衡监听器。监听器会在分区变化时,分别从外部系统写入或者读取偏移量,只要能保证消费者处理和写入偏移量到存储系统是一个原子操作,可以实现正好一次的语义;
4)