そして、カフカRabbitMQのメッセージの信頼性の比較

RabbitMQのとカフカは、持続的なメッセージを確実にするために設けられています。どちらも、少なくとも一つの保証を提供し、他のまで、いくつかのケースではカフカは(正確に-1回)を保証し、正確な定義された時間を提供しています。

のは、最初の何上記の用語の意味を理解してみましょう:

高々一回配信:メッセージの配信が繰り返されることはありませんが、メッセージが失われる可能性があります

少なくとも一つの配信:メッセージが失われることはありませんが、消費を繰り返してもよいです

正確な納期:メッセージシステムの聖杯。すべてのメッセージは正確に一度だけ配信されます。

「配達」一見ではない正確な記述言語、「治療」です。どんなに説明した方法を、私たちは、消費者がメッセージを処理できることを懸念していない、そしてプロセスの数。しかし、「プロセス」を使用して、問題がより複雑になります。たとえば、メッセージを一度に処理するために二回送達されなければなりません。別の例として、ダウンタイムを処理中に消費者は、メッセージが(別の消費者に)第二の時間に配信される場合。

第二に、「治療」は部分的な障害(部分的な障害)が問題となるようなものであろう使用して表現されます。それは一般的に、メッセージの処理ステップを複数備えます。処理を終了する起動し、通信アプリケーションロジックおよびアプリケーションメッセージングシステムを含みます。部分的な障害のアプリケーションロジックは、アプリケーションによって処理されます。トランザクションは、論理的なアプリケーション処理であれば、結果はオール・オア・ナッシングで、その後、アプリケーションロジックは、いくつかの失敗を防ぐことができます。しかし、実際には、多くの場合、異なるシステムは、そのような取引不可能の複数のステップを伴います。私たちは、アカウントの通信、アプリケーション、キャッシュ、データベースに取るならば、我々は精密(正確にワンス処理)との契約に到達することはできません。

したがって、唯一以下の場合には正確:唯一のメッセージは、メッセージ処理システム自体を含み、処理システム自体は、メッセージトランザクションです。この限定されたシナリオでは、メッセージ、処理するメッセージを送信するACK、トランザクションのすべてを書き、メッセージを処理することができます。提供することができるカフカストリーム。

メッセージ処理は冪等(冪等)である場合は、私たちは、取引の正確な時間に基づいて保証をバイパスすることができます。メッセージ処理は冪等であれば、我々は安全に重複したメッセージを処理することができます。もちろん、すべてではないメッセージ処理は冪等です。

 

責任の連鎖

基本的に、プロデューサーは、メッセージが消費されているかどうかを知ることができません。彼らは、メッセージが安全な配信のために保存されているかどうか、メッセージをメッセージングシステム受信するかどうかということを知っています。ここでは責任の連鎖があり、生産者が消費者に最終的には、メッセージングシステムに移行し始めた、と。各リンクが適切に実行されなければならない、リンク間の転送が正しく実行されなければなりません。これは、アプリケーション開発者として、あなたが失ったメッセージ、またはメッセージの乱用を防ぐために、正しい手順を書きたい、ということを意味します。

メッセージシーケンス

この記事では、少なくとも一回と最大で配信一回のRabbitMQとカフカをどのように提供するかに焦点を当てています。ただし、メッセージも配列を含みます。単にFIFO順をサポートし、どちらも、置きます。このレベルでのRabbitMQのキュー、被験者におけるカフカ・パーティション・レベル。

RabbitMQの

配達保証はに依存しています。

永続的なメッセージ - 保存されたら、それが失われることはありません

ACKメッセージ - プロデューサ、コンシューマの間のRabbitMQと信号

ミラーリングキュー

キューは、ノード間でミラーリング(複製)することができます。各キューについて、単一のノード上の一つのメインキューがあります。我々は3つのノード、10個のキュー、各二つのミラーがあるとします。メインキュー10及びミラー20は、3つのノード間に分散されます。メインキュー分布がどのように構成することができます。ノードがダウンした場合には、

他の鏡像キューノードがメインキューに昇格したノードにおけるメインキューの各々は、ダウンしています

他のノード上のミラー・キューは、複製因子(複製因子)を維持するようにノードの鏡像キューが、ダウンしている代わりに、それのために作成され

耐久性のあるキュー

永続と非永続:2つのキューがありますのRabbitMQ。耐久性のあるキューは、ストレージノードの再起動後にそれを再構築します、ディスク上になります。

耐久性のあるメッセージ

耐久性のあるキューは、メッセージはダウンタイム中に保持することができることを保証することはできません。永続的なメッセージに設定されているのみで、再起動のダウンタイムの後に復元されます。

RabbitMQのために、メッセージは、キューのスループットが悪化し、より耐久性です。あなたがライブストリームを持っているだけでなく、少し失われたデータは、大きな問題を持っていない場合ので、あなたはキューのミラーリングを検討すべきである、とのメッセージを非永続的に設定する必要があります。ノードがダウンしたときに、しかし、あなたはデータを失ってはならない場合は、キューと永続メッセージを持続、キュー表のミラーを使用する必要があります。

ACKメッセージ

ニュースリリース

ときにニュースリリースが失われたり複製することができます。これは、生産者の行動に依存します。

出版社が生産ACKを使用しないことを選択することができ、火災や忘れて、単にニュースを放棄して起動します。メッセージはコピーされませんが、(配達一度最大で)失われる可能性があります

確認出版:出版社との仲介(ブローカー)は、チャネルを作成する場合は、チャネルは、確認メッセージを使用して設定することができます。ブローカーは、出版社のメッセージを返します。次のとおりです。

basic.ack:正のACKメッセージが受信された、メッセージは、ここでのRabbitMQになりました。

basic.nack:負-ACKエラーが発生し、メッセージが処理されませんでした。責任も出版社です。出版社は再送する必要があります。

上記の二つに加えて、返信basic.returnあります。時々、出版社は、メッセージを受け取った仲介を知っておく必要がありますが、また、キューの数に固執したメッセージを知っている必要はないだけ。例えば、時には出版社は、スイッチにメッセージを投稿しますが、スイッチ上の任意のマッチングキューを結合しない場合、ブローカーは、単にメッセージを破棄します。ほとんどの場合、これは問題ありませんが、時には、発行者は、メッセージが破棄されたりして対処することを知る必要があります。必須フラグは、メッセージごとに結果を設定することができるメッセージが処理されずに破棄された場合、それはbasic.returnが返され

出版社はACKを待っている各メッセージを送信するために選択することができますが、真剣にスループットに影響を与えます。だから、出版社は一般的なフローを発表しましたが、ACKメッセージの数を制限しません。数が飛行制限内のメッセージに到達すると、発行者は、ACKの到着を待って、一時停止します。

今、我々は、のRabbitMQは、ACKからなるグループをマークするために複数のビットを使用して、スループットを向上させるために、(出版社とRabbitMQの間の)輸送中のメッセージの数を有しています。このように、すべてのメッセージが単調に増加するシーケンス番号(シーケンス番号)が割り当てられています。ACKメッセージは、対応するシーケンス番号を含むであろう。組み合わせ、複数のフラグに使用された場合、出版社はそれはメッセージがACKであるかを知っているように、送信されたメッセージのシーケンス番号を維持する必要があります。

したがって、ACKの使用は、我々は次の方法でメッセージの損失を避けることができます。

NACKを受信すると、ニュースを再発行します。

場所にbasic.return、永続メッセージを受信またはNACKとき。

 

サービス:RabbitMQのでは、それは一般的にトランザクションで使用されていません。なぜなら

明確な保証:メッセージが複数のキューにルーティングされる、または必須フラグを雇っている場合は、アトミックトランザクションは信頼できるものではありません。

比較的パフォーマンスの低下。

率直に言って、私は余分な保証を追加するトランザクションを、使ったことがない、不確実性を高めます。

/チャンネルの例外を接続します。ACKメッセージに加えて、さらに検討する必要がある出版社は、チャネルの損失につながることができますどちらも切断や仲買人エラーです。ACKチャネルは、メッセージを受け取ることができない損失につながることができます。この問題では、出版社は1つが1のメッセージの損失のリスクがメッセージを繰り返すのリスクを取ることです取ることです、妥協を考慮することができます。

ブローカーがダウンしている場合、メッセージは、OSのバッファにこの時点ではまだ可能である、または解決されているので、それが失われます。それともとき、このメッセージは、ACKを送信するだけの仲介として、ダウンタイム永続されており、この場合には、実際には、メッセージが正常に配信されました。

同じ外します。私たちはあなただけで選択することができ、特定のタイミングがダウンしているか分からないことができます。

再発行、メッセージ損失のリスクを実行しません

再発行、メッセージを繰り返す危険を冒します

パブリッシャが輸送中にメッセージをたくさん持っている場合は、問題が悪化します。一つの方法は、迅速な発行者を提供するために、消費者が重く移動しようとするように、メッセージが再送され、消費者に伝えることです。

 

 

消費者

ACKの場合、消費者は2つの選択肢があります

いいえACKモードありません

ACK手動モード。

モードはありませんACK:ACKまたはと呼ばれる自動モードでは、危険です。まず第一に、限り、メッセージは、アプリケーション層に配信されるように、それがキューから削除されます。これは、メッセージの損失につながることができます。

また、内部メッセージバッファが、アプリケーション層のダウンタイムで

メッセージの処理に失敗しました

第二に、我々は、メッセージ配信の速度を制御することはできません。ACKマニュアルは、我々は可能な優れたACKメッセージアプリケーションの数を制限するために、プリフェッチ(QoS)の値を設定することができます。この機能がない、RabbitMQのはすぐにメッセージを配信します、消費者を越えたナナ管理は、内部バッファ・オーバーフローやメモリの問題が生じ、処理することができます。

手動モードACK:ACK消費者が手動でメッセージコンシューマが予め設定できるものよりも大きな値を与えなければならない、それは並列に複数のデータを処理することができます。消費者は、複数のフラグは、ACKメッセージを複数設定することができる、単一のACKメッセージの送信を選択することができます。バッチは、パフォーマンスを向上させます。

消費者がチャンネルを開くと、配信されるメッセージは、単調に増加する整数値配信タグを受け取ります。ACKメッセージは、メッセージ識別子を含みます。

次のようにACKが要約されています。

basic.ack.RabbitMQは、メッセージキューから記事を削除します。あなたは、複数のタグを使用することができます。

basic.nack。消費者は再RabbitMQのメッセージキューがプッシュする必要性を伝える必要があります。再入国キューは、メッセージが再び消費者に届け、キューの先頭に置かれることを意味します。また、複数のフラグをサポートしています。

basic.reject。類似してbasic.nackが、複数のフラグをサポートしていません。

その優れたセマンティクスからは、basic.ackと(basic.nack&再キューイング==偽)が同等です。これは、キューから削除メッセージの原因になります。

ACKを送信するとき、次の質問は、ありますか?メッセージを迅速に処理されている場合は、メッセージを選択してから処理されたACKを送信することができます。ただし、メッセージ処理は、処理され、その後、ACKが問題である送信し、数分かかります。チャネルがダウンしている場合は、すべてのACKメッセージが重複メッセージで、その結果、キューを再入力しません。

通信/チャネル障害

仲介チャネルを結果として通信障害、または障害がダウンしている場合は、すべての非ACKメッセージが再び配信キューを再入力しますが、これはメッセージの損失につながるしませんが、重複したメッセージになります。

消費者はもはや非ACKメッセージまま再ルーティングされるメッセージのリスクが高いです。メッセージが再配信されたときに、メッセージフラグが再配信設定されています。だから、最悪の場合、少なくとも消費者がメッセージを知ることができ、メッセージの再送信です。

冪等

あなたがなど、電力、およびメッセージが失われないようにするのが必要な場合、それはあなたが繰り返しメッセージ、または他の電力モードを実装する必要があることを意味します。メッセージは非常に時間がかかる重複排除がある場合は、消費者がヘッダデータおよび再配信フラグをチェックするように出版社は、メッセージのヘッダデータの再送を追加させることができます。

結論
のRabbitMQは、保証の、強力な信頼性と永続的なメッセージを提供し、しかし、それまでのあなたの混乱は多くの方法があります。

ここではいくつかの考慮事項があります

あなたがその少なくとも一つの配信を確実にしたい場合は、ミラーキューの使用は、キューが長持ち、耐久性のあるメッセージ、出版社ACK、必須フラグ手動消費者ACKです。

少なくとも一回の配信を使用して、あなたは、重複排除ロジックやパラダイムの冪等の利用を増やす必要があるかもしれません

あなたは、メッセージを気にしない場合はACKを失ったが、低遅延を懸念し、高度にスケーラブルなので、あなたは、ミラーを使用するためにキューイングする必要はありません、永続メッセージや出版社れる。もちろん、私は事前に設定して、手動で消費者のACKを使用し続けますもちろん、あなたが複数のフラグとバルクACKを設定する必要があり、メッセージ配信の速度を制御する2値をとります。

 

カフカ

カフカの保証配達によって:

メッセージの永続性:一度話題に、メッセージが失われることはありません

生産者、消費者信号とカフカ(または飼育係含む)メッセージACK

バッチ

カカとRabbitMQのは、メッセージのボリュームに異なる消費を送りました。RabbitMQのは、以下のことを実現することができます。

各メッセージは、すべてのACKメッセージが受信されるまで中断Xに送信されます。RabbitMQのは、典型的には、グループは、複数のフラグを使用して、ACKの複数からなります

消費者の予め設定された値、ACKメッセージからなるグループ

しかし、それ自体が大量に送信されないメッセージは、複数のフラグを使用して、輸送中のメッセージの集合を可能にするために、より意味します。これは、TCPのようにたくさんあります。

そして、カフカは明確なメッセージのバッチ処理です。バッチは、パフォーマンスを向上するだけでなく、ACKメッセージRabbitMQのと同じようのないようなトレードオフを比較検討する必要がありますすることができます。(障害が発生したときに)輸送中の多くのメッセージは、より深刻なメッセージの繰り返しにつながることができます。

カフカは、パーティションのカフカの概念ので、消費者側に、より効率的なバッチ処理することができます。各パーティションはとてもタイムリーな大きなバッチが配布されませんキャンプZiang負荷、消費者に対応しています。使用は、バッチAPIメッセージを引っ張っプルを放棄されている場合は、RabbitMQのために、それは非常に深刻な負荷の不均衡につながります。そして、長い処理遅延。RabbitMQのは、バッチ処理のために設計されていません。

持久性

ログのレプリケーション

フォールトトレランスのために、カフカは、地区レベルでのマスタ・スレーブ・アーキテクチャがあり、プライマリパーティション、奴隷やフォロワーになっパーティションコピーをマスターになる。各マスターは、多くのフォロワーを持つことができます。サーバは、プライマリパーティションダウンになると、フォロワーは主にそこに促進されますパーティションは、それだけで簡単にストップサービスが発生しますが、データの損失は発生しません。

カフカは、同期レプリカ(同期レプリケーション)で呼ばれる概念があります。各コピーは、同期または非同期化することができます。同期は、同じメッセージで、プライマリパーティションと比較することを意味します。それが残した場合には、非同期レプリケーションになることがあります。これは、ネットワークの遅延、ホストの障害であってもよいです。メッセージの損失は、次の場合にのみ発生します。プライマリパーティション・サーバーがダウンし、コピーのすべてが非同期です。

ACKメッセージはトラッキングオフセット

どのようカフカストアのメッセージとどのように消費者が消費したメッセージに応じて、カフカは、トラックを相殺するために、メッセージACKに依存しています。

プロデューサーメッセージACK

プロデューサーはACKを期待仲介の種類が表示されますメッセージを送信する場合:

ACKを= 0に対応し、火災や忘れて:それはACKを必要としません。

プライマリパーティションは、メッセージの永続性を持っています。ACK = 1に対応します

プライマリパーティションと、すべてのメッセージは、ALL =のACKに対応し、持続的なレプリケーションを同期しています

メッセージはRabbitMQのと同様、出版時にコピーすることができます。仲介ネットワーク障害やダウンタイム場合、発行者は、ACKメッセージの再送信を受信しません。もちろん、ほとんどの場合、メッセージが持続し、複製されたプライマリパーティションでなければなりません。

しかし、カフカは重いとの良好な特性を持っていますが、次のように設定する必要があります。

trueに設定enable.idempotence

max.in.flight.requests.per.connection低于5

1以上に設定し、再試行

ALLに設定されたACK

あなたはスループットを注文する場合は、この構成では、バッチ処理ユニットが0/1に設定6かのACKに設定されている、あなたは重い取得する方法がありません。

消費者は、追跡をオフセット

消費者は、別の顧客を成功させ、ダウンタイムの準備をする彼らのシフトを保存する必要があります。オフセットストレージカフカの飼育係や話題に。

消費者は、オフセットを更新するためのさまざまなオプションを持っているパーティションのバルクからのメッセージを読み取るために一度。

今すぐ更新:ニュースの前に、治療の開始時に。これは、送達のための最大時間に相当します。かかわらず、消費者がダウンしているかどうかの、メッセージが繰り返されることはありません。このような第5のメッセージ処理で処置されている10、及び消費者としてはダウンしている、唯一の最初の4つのメッセージは、バッチ開始から消費者に代わって、処理残りスキップされます。

最終更新日。すべてのメッセージが処理されたとき。これは、少なくとも一つの配信に対応します。かかわらず、消費者がダウンしているかどうかの、メッセージは、メッセージが2回処理されていても、失われることはありません。例えば、10件のメッセージは、ダウンコンシューマ第5のメッセージに消費者は、全体のメッセージが何度も10コンシューマ・プロセスを取る場合には、処理されています。

正確にJavaのライブラリカフカストリームが保証され使用している場合にのみ意味論に一度。あなたは、Javaを使用している場合、私は強くお勧めします。処理およびオフセット更新メッセージちょっとトランザクションの完了を必要とする正確な意味論的問題限り。プロセスが電子メールメッセージを送信する場合、例えば、我々は正確なものを完了することができません。たとえば、私たちはメッセージ再生を送る消費者がダウンし、私たちは、オフセットを更新することができますが、メッセージが再度送信されます。

カフカストリームのJavaアプリケーションは、このアプリケーションは、正確な意味を満たしていますが、メッセージ処理後に別のトピックに新しいメッセージが生成されます。我々は、トランザクション機能カフカを使用して、メッセージや更新オフセットを書くことができますので。

トランザクションと分離レベルに

処理を - - アプリケーションカフカの取引は、主に読まれているモードを記述します。トランザクションは複数のトピックやパーティションにまたがることができます。、ビジネスを開き、メッセージのバッチを作成し、そのトランザクションをコミットするプロデューサー。

消費者は、デフォルトを使用するとコミットされていない分離レベルを読んで、消費者がコミットされていない、または終了、それが提出されているかどうか、すべてのニュースを見ることができます。消費者がコミット分離レベルを読んだとき、消費者はメッセージやコミットされていないの終了は表示されません。

あなたは、分離レベルは、メッセージの順序にどのような影響を与えるか、もっと混乱することがあります。答えは影響を受けません。消費者はまだメッセージをシーケンシャルリード。最後の安定オフセット以前のメッセージ(LSO)が読み込まれます。

概要

RabbitMQのとカフカは、信頼性、耐久性のあるメッセージングシステムであるため、信頼性が重要な場合は、両方が信頼性があることを保証することができます。その時、カフカはさらに良く、リリースべき等、及びオフセット誤差のタイムリーな動作を提供するので、メッセージは失われることはありません。

もちろん、完璧な製品はありませんが、限り、ACKの正しい使い方の応用として、管理者は、正しい構成をコピーして、データセンターが折りたたまれていない、あなたはメッセージが失われないことを安心することができます。耐障害性と可用性については、だけでなく、追加的な議論が必要となります。

ここではいくつかの単純な結論は以下のとおりです。

どちらも、セマンティクス少なくとも一つと、最高1回提供します

どちらも、コピーを提供します

どちらのメッセージとは、同じスループットの選択を繰り返します。カフカはリリース冪等を提供していますが、しかし、唯一の特定の体重に。

ACKメッセージの数は両方ともの方法で制御することができるされていません

どちらも、順序を保証します

カフカは、主に読書のため、実際の業務を提供 - 処理 - 書き込み。あなたは注目のスループットを払う必要がありますが。

カフカ、タイムリーな消費者のエラー処理を使用していますが、オフセットロールバックを使用することができます。RabbitMQのではありません。

カフカのパーティションの考え方に基づいて、パフォーマンスを改善するために、バッチ処理を使用することができます。それは、プッシュベースのモデル、競争と消費者の使用であるため、とのRabbitMQは、バッチ処理には適していません。

おすすめ

転載: www.cnblogs.com/royfans/p/10960526.html