2017-02-10 4 views
1

私は、スタックオーバーフローや一般的にウェブでは、カフカが消費認知をサポートしていないという考え方、まったく1回の消費は達成するのが難しいと答えています。サンプル Is there any reason to use RabbitMQ over Kafka?として次のエントリでカフカ一度の消費保証

、私は次の文を読むことができます:カフカはない

を行いながら

のRabbitMQは、消費/認知/未確認のメッセージに関するすべての状態を維持しますまたは

カフカでは一度の保証が厳しいです。

これは私が公式カフカのマニュアルを読むことによって理解するものではありません。 https://kafka.apache.org/documentation/#design_consumerposition

以前のドキュメントカフカは(RabbitMQのような)伝統的な承認の実装を使用していないと述べています。その代わりに、カフカの「一度だけ消費保証は」困難である理由を誰かが説明してもらえ

これは、メッセージの確認応答の同等は非常に安いなり

関係パーティション-消費者に依存しており、オフセット...

達成するために?そしてこれはKafkaとRabbitMQのような他のより伝統的なメッセージブローカーとの違いはどうですか?私は何が欠けていますか?

+0

[Apache Kafka:バージョン0.10に完全一致する](http://stackoverflow.com/questions/38884267/apache-kafka-exactly-once-in-version-0-10) –

+0

どういう意味ですか? 「一回のみの消費保証」は、通常「正確に1回」と呼ばれます。 –

+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)消費者がメッセージを最初に処理してからオフセットをコミットすると、メッセージを処理した後にコミットする前に消費者がクラッシュするため、次のポーリングでoffset =そのメッセージは2回処理されます。これは彼らが少なくとも一度呼び出すものです。

正確に1回実行するには、メッセージを処理してアトミック操作でそのオフセットをコミットする必要があります。これは簡単ではありません。これを行うための1つの方法(可能な場合)は、処理の結果をその結果を生成したメッセージのオフセットとともに格納することです。その後、消費者が開始すると、カフカの外で最後に処理されたオフセットが検索され、そのオフセットが検索されます。

関連する問題