2017-06-14 1 views
0

が存在しません。消費者がRabbitMQのにチャネルからメッセージを取得すると、ここで、プリフェッチメッセージは、私はRabbitMQの</p> <p>prefetchCountの構成の下有する

私は1つの交換を持ち、その交換に1つのキューが接続され、そのキューに1つのコンシューマが接続されています。キューが複数のメッセージを持っている場合、私の理解に従って以下のステップが実行されます。

  1. チャネルのキュー書き込みデータ。
  2. ack-modeは自動です。キューがメッセージをチャネルに書き込むとすぐに、メッセージはキューから削除されます。
  3. メッセージは消費者に届き、そのデータを消費者が実行し始めます。
  4. キューは、前のメッセージの確認応答を受け取りました.Queueは、次のデータをチャネルに書き込みます。

ここで私の疑いは、消費者が以前のデータでまだ終了していないとします。その次のデータキューがチャネルに書き込まれてどうなるでしょうか?

また、prefetchCountが10で、コンシューマがキューに接続されている場合、これらの10個のメッセージが常駐するとしますか?

答えて

1

あなたが記述したシナリオは、RabbitMQのドキュメントに記載されており、this blog postで詳述されているシナリオです。具体的には、十分に大きなプリフェッチ回数を設定し、公開レートが比較的小さい場合、RabbitMQサーバーは、ファンシーなネットワークスイッチに変わります。承認モードが自動に設定されている場合、承認されていないメッセージは存在しないため、プリフェッチ制限は実質的に無効になります。自動承認では、メッセージは配信されるとすぐに確認応答されます。これは、任意の大きさのプリフェッチ・カウントを持つ場合と同じです。

prefetch> 1の場合、メッセージはクライアントライブラリのバッファに格納されます。正確なデータ構造は使用されるクライアントライブラリに依存しますが、私の知る限り、すべての実装はメッセージをRAMに格納します。さらに、自動通知では、特定のコンシューマがメッセージを実際に読み取って処理した時期を知る方法がありません。

ので、ここではいくつかのテイクアウェイあります使用している場合

  • 自動確認応答はあまり意味がありませんので、未確認メッセージがあることは決してありませんよう

    1. プリフェッチ制限は、自動確認応答とは無関係ですコンシューマ
    2. auto-ackがオフの場合、またはautoack = onを使用すると十分に大きなプリフェッチが発生すると、メッセージブローカはキューイングを行わず、代わりにルーティングのみを行います。

    ここで、少し専門家の意見があります。私は、メッセージブローカーの全体的な考え方が、メッセージを少し後ろに押し出すことを見出しており、これは非常に理にかなっているため、正しく構成することは難しく、そのメリットははっきりしていません。キューシステムは、プルベースのシステムには自然に適合します。プロセッサは、現在のメッセージの処理が完了したときにブローカに次のメッセージを尋ねることができます。このアプローチは、負荷が自然に均衡し、プロセッサが切断されたりノックアウトされたりしてもメッセージが失われないようにします。

    したがって、私は消費者の使用を一切廃止し、basic.getに切り替えることをお勧めします。

  • +0

    私たちの現在のプロジェクトでは、以下のようなシナリオがあります。キュー内の任意の時間に、A→B→Cのようなレコードがあるとします。レコードCはAの処理のみが処理されています。この実装は同じですか?前のレコードを見つけたら消費者側のレコードを処理していますが、レコードを再度エンキューします(-nackを送信するのではなく、交換によってキューに入れます)。それはキューレコードをC-> A-> Bとします.Aの後にCが処理されます。 – Nishat

    +0

    ありがとうございます!別の質問がある場合は、新しい質問として投稿することをお勧めしますので、回答をもっと簡単に求めることができます。私は、説明されたシナリオが、メッセージングだけのためにちょっと畳み込まれているように思われることを述べます。 – theMayer

    関連する問題