2017-02-10 40 views
1

我在堆栈溢出的一些答案和一般在网络中看到卡夫卡不支持消费确认或一次消费很难实现的想法。卡夫卡只有一次消费保证

在下面的条目作为样本 Is there any reason to use RabbitMQ over Kafka?,我可以阅读以下声明:

的RabbitMQ将保留所有州大约消耗/确认/未确认的消息,而卡夫卡不

确切地说一次保证很难与卡夫卡得到。

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

以前的文档指出卡夫卡不使用传统的承认执行(如RabbitMQ的)。相反,他们依靠关系分区消费者和偏移......

这使得消息确认很便宜相当于

可能有人请解释为什么“只有一次消费保障”卡夫卡难实现?以及这与Kafka与其他更传统的Message Broker作为RabbitMQ有何不同?我错过了什么?

+0

可能的[Apache Kafka:0.10版本中的一次]的重复(http://stackoverflow.com/questions/38884267/apache-kafka-exactly-once-in-version-0-10) –

+0

你的意思是“只有一次消费保证”通常被称为“正好一次”。 –

+0

1。AFAIK,**正好消耗**一次就是消费者的问题。 Apache Kafka是支持pub-sub范式的经纪人。所以它传统上不会跟踪消费者的抵消。管理如何消费取决于消费者。例如对于流处理,[Apache Storm](http://storm.apache.org/releases/2.0.0-SNAPSHOT/Guaranteeing-message-processing.html)至少保证一次[Apache Trident](http:// storm.apache.org/releases/2.0.0-SNAPSHOT/Trident-tutorial.html)恰好就是一个对应.... contd。 – Confused

回答

5

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

消费者轮询消息,并得到与偏移= 1

A)消息,如果消费者提交这个偏移处理立即消息之前,那么它可能会崩溃,并再次,因为它已经承诺将永远不会收到该消息,在下一次调查中,Kafka将返回offset = 2的消息。这是他们一次语义上最多称呼的内容。 B)如果消费者首先处理消息,然后提交偏移量,则可能发生的是在处理消息之后但在提交消息之前消费者崩溃,所以在这种情况下,下次轮询将再次得到相同的消息,偏移量= 1并且该消息将被处理两次。这是他们至少称呼一次。

为了实现一次,您需要处理消息并在原子操作中提交该偏移量,在这种操作中,您始终都执行这两个操作,或者都不执行任何操作。这并不容易。执行此操作的一种方法(如果可能的话)是将处理结果与生成该结果的消息的偏移量一起存储。然后,当消费者开始时,它会查找Kafka以外的最后一次处理的偏移量,并寻找该偏移量。