三:Kafka消费者(2)

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)

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值