フラグが設定されていない場合、メッセージ処理中にアプリケーションが失敗すると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-count
さno-ack
れますが (これは、RabbitMQ および AMQP ドキュメントで自動応答機能が呼び出される方法です)、メッセージは 1 つずつクライアントに送信され、送信が成功した後にキューから削除されます。
AMQP には非同期アーキテクチャがあるため、特定の条件下では、2 つのクライアントが同時に 1 つのメッセージを受信する場合があることに注意してください。また、確認応答されていないメッセージが同じクライアントに返される場合があります (特にクライアントが 1 つしかない場合)。
また、公式ドキュメントを見てprefetch-size
、prefetch-count
これらのオプションを少し試してみてください。
PS:autoack
基本的にno-ack
AMQP フラグは に設定されていtrue
ます。