在不同的机器上运行的kafka消费群体能收到唯一的消息吗?

2nbm6dog  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(298)

为了避免消费者崩溃和恢复时出现冗余消息,我禁用了偏移量的自动提交和手动提交。
现在的问题是,如果不同机器上的使用者进程访问同一主题,它们会收到唯一的消息吗?从理论上看,手动提交将导致在不同的机器上接收到冗余消息。
在我的本地机器上,我运行了两个java消费者订阅同一主题的示例,它们得到了重复的消息。怎么解决这个问题?我使用的是高级消费者

hsgswve4

hsgswve41#

因为kafka的消息传递语义至少是一次的,所以您应该实现自己的代码来保证kafka中的语义是一次的。
最多一次:消息可能会丢失,但永远不会重新发送。
至少一次:消息不会丢失,但可以重新发送。
只有一次:这是人们真正想要的,每一条信息只传递一次。
来自kafka文档中的4.6消息传递语义:
那么,精确一次语义(即你真正想要的东西)呢?这里的限制实际上不是消息传递系统的一个特性,而是需要协调消费者的位置和实际存储为输出的内容。实现这一点的经典方法是在使用者位置的存储和使用者输出的存储之间引入两阶段提交。但这可以更简单、更普遍地处理,只需让消费者将其偏移量存储在与其输出相同的位置。这更好,因为使用者可能想要写入的许多输出系统将不支持两阶段提交。作为一个例子,我们在hdfs中填充数据的hadoop etl使用它读取的数据将其偏移量存储在hdfs中,这样就可以保证数据和偏移量都被更新,或者两者都没有更新。对于许多其他数据系统,我们遵循类似的模式,这些系统需要这些更强大的语义,并且对于这些系统,消息没有允许重复数据消除的主键。
还有一个问题在Kafka常见问题解答中也有类似的答案:我如何从Kafka那里得到一次准确的信息?

相关问题