2017-02-10 37 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以外的最後一次處理的偏移量,並尋找該偏移量。