批量提交偏移量,而不是在消费时逐一提交

问题描述 投票:0回答:1

假设 1 个线程正在处理 msg0,第 2 个线程正在处理 msg1。现在,由于并行性性质,msg2 已得到处理并提交其从 0->1 的偏移量。但是,当由于任何原因或服务中断而消耗 msg0 时,它无法处理,因此它是 0->0。当服务启动一段时间后,它将检查来自 msg1 的最后一个偏移量并从 msg2 开始处理。因此我的 msg0 丢失了。

现在,我不想逐一提交,而是希望批量地可能一次性全部提交,并保持小批量的组分区。可以吗?

尝试过->我实现了断路器,为了安全起见,它将停止消耗事件一段时间,但之前的数据丢失仍然是一个问题。

期待->我不想丢失任何数据。

apache-kafka spring-kafka kafka-consumer-api
1个回答
0
投票

在 Apache Kafka 中,您一开始就不需要单独提交每个偏移量。 Kafka 的工作方式与传统消息队列不同,因为它不是队列...(而是构建在“日志”上的流平台)。

提交偏移量X意味着,我已经阅读了直到X-1的所有内容,并且X是我想要消耗的下一个偏移量。因此,提交偏移量已经隐式“批量”了。

因此,将处理分散到多个线程实际上是一个问题,因为如果您收到偏移量为 O 和 O+1 的消息,并且 O 由线程 1 处理,O+1 由线程 2 处理,即使线程 2 首先完成,它也不能只提交 O+2,因为它也会将 O 标记为已成功处理。 -- 两个线程都完成处理后才能提交 O+2。

© www.soinside.com 2019 - 2024. All rights reserved.