8

AMQP プロトコルのいくつかの側面を理解しようとしています。現在、RabbitMQ を使用したプロジェクトがあり、python pika ライブラリを使用しています。したがって、質問は確認応答とメッセージのプリフェッチに関するものです。

  1. コンシューマーのみのキューがあるとします (このキューが排他的として宣言されていることを確認してください)。だから私は正しく理解していますか: ack フラグの有無に関係なく? とにかく、複数のメッセージを同時に処理することはできません。他のまだキューに入れられているメッセージを受け取る可能性のある別のコンシューマーはありません。AMQP サーバーの負荷が軽減される可能性があるため、確認応答をオンにしない方がよいでしょう。

  2. 確認応答がなければ、プリフェッチ カウントは何の意味もありません。正しい?

  3. プリフェッチがどのように機能するかわかりません。新しいメッセージにコールバックがあり、その最終ステートメントでメッセージを承認または拒否します。これが唯一の機能であり、プリフェッチ カウントがどれほど大きくても、現在のメッセージが完了するまで別のメッセージは処理されません。では、なぜ prefetch_count 値を変更する必要があるのでしょうか?

前もって感謝します。

4

1 に答える 1

31

フラグが設定されていない場合、メッセージ処理中にアプリケーションが失敗するとautoack、受信したすべてのメッセージが失われます。このような状況が非常にまれであり、アプリケーションでメッセージの損失が適切なオプションである場合 (たとえば、ログ処理に限定されません)、autoack をオフにすることができます。

はい、autoack設定を解除すると、より単純なブローカー ロジックが必要になるため、使用するリソースが少なくなります。

prefetch count(および)に関してprefetch size、これらのオプションは、単一のメッセージに事前にクライアントに送信されたペイロードの大きさをブローカーに通知します。通常、ネットワーク操作で新しいメッセージを待つ時間を節約するために使用されます。使用するprefetch sizeと、クライアントは合計サイズが事前設定されたプレッチ サイズ (および/またはカウント) 以下の 1 つ以上のメッセージを受信します。

設定されたルールと両方が適用されprefetch countます。prefetch sizeそれらの 1 つがゼロに設定されている (未設定) 場合、適用されません。

最も重要なことは、プリフェッチは、クライアントが未確認のメッセージを送信する前にメッセージを送信する動作を定義することです

これら 2 つの設定を組み合わせると、次のようになります。

メッセージ数制限を使用してプリフェッチし、事前にメッセージを送信する:

条件:

  • キュー: N メッセージ x 1kb
  • プリフェッチ:prefetch-size=5kb, prefetch-count=4
  • オートアック:off

ワークフロー:

  • ブローカーは 4 つのメッセージ ( で制限prefetch-count=4) をクライアントに送信します。4 つのメッセージが未確認としてマークされ、キューから移動されます (したがって、それらは他のクライアントに配信されません)。
  • クライアント ack 1 メッセージ。
  • ブローカは -1 メッセージの未確認 (そのメッセージを削除) を持ち、さらに 1 つのメッセージをクライアントに送信します (+1 未確認、キューから -1、クライアントは既に 3 つの未確認メッセージを持っています)。
  • クライアントは、残りの 3 つのメッセージと新しく配信されたメッセージを確認します。
  • ブローカは -4 メッセージの確認応答を解除し、4 つのメッセージを再度送信し、+4 未確認メッセージ、-4 をキューから送信します。
  • クライアントは 1 メッセージを確認し、失敗します。
  • ブローカーは -1 承認されず、残りの承認されていないものをキューに戻すため、-3 承認されず、+3 キューに入れられ、このクライアントまたは他のクライアントに再度配信される可能性があります。

大きなメッセージのプリフェッチ:

条件:

  • キュー: 1 メッセージ x 5Kb、N メッセージ x 1kb
  • プリフェッチ:prefetch-size=5kb, prefetch-count=2
  • オートアック:off

ワークフロー:

  • ブローカーは 1 つのメッセージ ( で制限prefetch-size=5kb) をクライアントに送信し、そのメッセージは未送信としてマークされます。
  • クライアント ack 1 メッセージ。
  • ブローカーは -1 件のメッセージを未確認にし、2 つのメッセージを再度送信し ( によって制限されますprefetch-count=2。最初のメッセージのみが 5kb で、残りは 1kb であることに注意してください)、これらのメッセージは未確認としてマークされています。
  • クライアントは 1 メッセージを確認し、失敗します。
  • ブローカーは、確認応答されたメッセージをメッセージ キューから移動し、残りの未確認メッセージは、それらが属するキューに再度移動されるため、このクライアントまたは他のクライアントに再度配信される可能性があります。

自動確認あり:

条件:

  • キュー: N メッセージ x 1kb
  • プリフェッチ:prefetch-size=5kb, prefetch-count=10
  • オートアック:on

ワークフロー:

  • true に設定すると両方ともprefetch-size無視prefetch-countno-ackれますが (これは、RabbitMQ および AMQP ドキュメントで自動応答機能が呼び出される方法です)、メッセージは 1 つずつクライアントに送信され、送信が成功した後にキューから削除されます。

AMQP には非同期アーキテクチャがあるため、特定の条件下では、2 つのクライアントが同時に 1 つのメッセージを受信する場合があることに注意してください。また、確認応答されていないメッセージが同じクライアントに返される場合があります (特にクライアントが 1 つしかない場合)。

また、公式ドキュメントを見てprefetch-sizeprefetch-countこれらのオプションを少し試してみてください。

PS:autoack基本的にno-ackAMQP フラグは に設定されていtrueます。

于 2014-02-09T17:05:06.470 に答える