为避免消费者崩溃并重新启动时出现冗余消息,我已禁用自动提交偏移并手动提交。
现在的问题是,如果不同机器上的消费者进程访问相同主题,它们是否会收到唯一消息?从理论上讲,手动提交将导致在不同机器上收到的冗余消息。
在我的本地计算机上,我运行了两个java用户订阅相同主题的实例,并且他们收到了重复的消息。如何解决这个问题?我正在使用高级消费者
答案 0 :(得分:2)
由于Kafka的消息传递语义 at-least-once ,您应该实现自己的代码以保证Kafka中一次语义。
来自Kafka文档中的4.6 Message Delivery Semantics:
那么一次语义(即你真正想要的东西)呢?这里的限制实际上并不是消息传递系统的一个特征,而是需要协调消费者的位置与实际存储为输出的内容。实现这一目标的经典方法是在消费者位置的存储和消费者输出的存储之间引入两阶段提交。但是这可以通过简单地让消费者将其偏移存储在与其输出相同的位置来更简单地处理。这是更好的,因为消费者可能想要写入的许多输出系统将不支持两阶段提交。作为一个例子,我们在HDFS中填充数据的Hadoop ETL将其在HDFS中的偏移量与它读取的数据一起存储,以确保数据和偏移都被更新或两者都不更新。我们遵循许多其他数据系统的类似模式,这些数据系统需要这些更强大的语义,并且消息没有主键来允许重复数据删除。
还有一个问题在卡夫卡常见问题解答中有类似的答案:How do I get exactly-once messaging from Kafka?