golang kafka Shopify/sarama 消费者重置新增分区偏移量并进行重新消费

文章讨论了在Kafka中,当新增分区时,消费者组由于lastoffset策略可能导致的消息丢失问题。提出了两种解决方案:一是通过手动调整消费者偏移量,二是通过消费者客户端代码维护分区信息并在重平衡时重置新分区的偏移量。同时,代码示例展示了如何使用Redis来协助处理这个问题,确保幂等性并避免数据覆盖。

当我们使用kafka的时候存在这样一个场景:

有一个消费组正在正常消费中并且消息偏移量策略为lastoffset(最新偏移量),这个时候在kafka服务器中为当前主题下新增了一个分区,各个生产者纷纷将消息投递到了这个新增分区中。当然我们知道针对于这种场景消费者方可以触发重平衡回调方法,不过需要注意的一点是这个过程并非即时触发,它中间是会有一段时间的空档期,这个空档期决策与消费者刷新kafka集群元数据时间参数有关,一般都会设置为分钟级。那么问题就来了,在空档期中新分区的消息没有任何消费者接管,这就导致了即使过了这个空档期触发了重平衡机制也无法消费到之前的消息,因为我们的偏移量策略为lastoffset(最新偏移量)。

针对于这个场景我个人给出的一些解决方案和思路,供大家参考:

我的实现思路:

一、操作kafka系统命令实现(简单暴力,需要手动启停相关消费者进程):

1. 执行强行重置某个主题下某个分区的消费者组消息偏移量为0的命令:

需要注意的是如果当前myGroup消费者组处于活跃状态(有消费者进程运行)的情况,该命令会报错,所以需要停止掉当前消费者组下的所有消费者进程。

kafka-consumer-groups.sh --bootstrap-server kafka-kraft:9092  --group myGroup --reset-offsets --topic myTopic:1 --to-offset 0 --execute

2. 启动当前这个消费者组下的消费者进程,这个时候消费者组检测当前分区偏移量为0,自然就会重头开始消费这个分区的所有消息。

二、消费者客户端代码层实现(无需启停相关消费者进程):

  1. 自行维护当前主题的某个消费者组的分区数;

  1. 需要知道本次周期新增了哪些分区;

  1. 在重平衡方法中将这个新分区的offset置为0,也就是重头消费这个新分区的所有消息;

我的实现方案:

在重平衡回调方法中使用redis的无序集合储存当前主题、当前消费者组下的全部分区信息,然后在根据当前消费者会话去和上一代的全部分区信息进行差集对比,对比的结果就是新增的分区。得到新增的分区后将这些分区的偏

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值