gpt4 book ai didi

apache-kafka - Kafka只消费一次保证

转载 作者:行者123 更新时间:2023-12-04 22:42:30 30 4
gpt4 key购买 nike

我在一些关于堆栈溢出的答案中看到了,一般在网络中,卡夫卡不支持消费确认或很难实现一次消费的想法。

在以下条目中作为示例
Is there any reason to use RabbitMQ over Kafka? ,我可以阅读以下语句:

RabbitMQ will keep all states about consumed/acknowledged/unacknowledged messages while Kafka doesn't



或者

Exactly once guarantees are hard to get with Kafka.



这不是我通过阅读官方 Kafka 文档所理解的:
https://kafka.apache.org/documentation/#design_consumerposition

之前的文档指出 Kafka 不使用传统的确认实现(如 RabbitMQ)。相反,他们依赖于分区-消费者和偏移量的关系......

This makes the equivalent of message acknowledgements very cheap



有人可以解释为什么Kafka中的“仅一次消费保证”难以实现?以及这与 Kafka 与其他更传统的 Message Broker(如 RabbitMQ)有何不同?我错过了什么?

最佳答案

如果您的意思是恰好一次,问题就是这样。
您可能知道 Kafka 消费者使用轮询机制,即消费者向服务器询问消息。此外,您需要记住消费者提交消息偏移量,即它告诉集群下一个预期的偏移量是什么。所以,想象一下会发生什么。

消费者轮询消息并获取偏移量为 1 的消息。

A)如果消费者在处理消息之前立即提交该偏移量,那么它可能会崩溃并且永远不会再次收到该消息,因为它已经提交,在下一次轮询时,Kafka 将返回偏移量 = 2 的消息。这是他们最多调用一次语义。

B)如果消费者先处理消息然后提交偏移量,可能发生的情况是在处理消息之后但在提交之前,消费者崩溃,因此在这种情况下,下一次轮询将再次获得偏移量= 1的相同消息和该消息将被处理两次。这是他们至少一次的称呼。

为了只实现一次,您需要处理消息并在原子操作中提交该偏移量,您总是两者都做或不做。这不是那么容易。执行此操作的一种方法(如果可能)是存储处理结果以及生成该结果的消息的偏移量。然后,当消费者启动时,它会在 Kafka 之外查找最后处理的偏移量并寻找该偏移量。

关于apache-kafka - Kafka只消费一次保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42165726/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com