sarama-cluster消费kafka从最新offset开始

本文介绍了一个Kafka消费者在rebalance之后如何更新偏移量的方法。通过获取最新的偏移量并将其设置为当前消费者的偏移量,确保消息不会被重复消费。此过程包括使用Sarama库来与Kafka交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var highWaterMarksBool = false
//在Kafka consumer rebalance成功以后进行调用,highWaterMarksBool主要保证成功进行了设置offset
func highWaterMarks() {
	if highWaterMarksBool {
		return
	}
	HighWaterMarks := consumer.HighWaterMarks() //这个要rebalance完毕以后才能生效
	for topic, partitions := range HighWaterMarks {
		for partition, _ := range partitions {
			offset, _ := client.GetOffset(topic, partition, sarama.OffsetNewest)
			consumer.MarkPartitionOffset(topic, partition, offset, "")
			app.Logger.Info("MarkPartitionOffset", topic, partition, offset, "")
		}
		highWaterMarksBool = true
	}
}


func consume() {
	defer consumer.Close()
	for {
		select {
		case msg, more := <-consumer.Messages():
			if more {
				requestFileBeat := &adcontext.FileBeat{}
				err := json.Unmarshal(msg.Value, requestFileBeat)
				if err == nil {
					adcontext.ContextMsg.KafkaMsgNew = append(adcontext.ContextMsg.KafkaMsgNew, requestFileBeat)
				} else {
					app.Logger.Errorf("Unmarshal ERR :%s", msg.Value)
				}
				consumer.MarkOffset(msg, "")
			} else {
				app.Logger.Infof("Kafka No More")
			}
		case err, more := <-consumer.Errors():
			if more {
				app.Logger.Infof("Kafka consumer error: %v", err.Error())
			}
		case ntf, more := <-consumer.Notifications():
			if more {
				app.Logger.Infof("Kafka consumer rebalance: %v", ntf)
				highWaterMarks()
			}
		}
	}

}

原理就是在rebalance以后获得当前offiset数据,然后根据获得的数据对MarkPartitionOffset进行设置,设置为最新的offiset

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值