4.12.2. リングキューの動作のトラブルシューティング
本セクションでは、リングキューの動作が設定とは異なる状況を説明します。
参照:
4.12.2.1. 再配信メッセージおよびロールバック
メッセージがコンシューマーに配信されている場合、メッセージは in-between 状態になります。ここでは、メッセージはキューには技術的には表示されなくなりますが、まだ確認されていません。メッセージは、コンシューマーによって確認されるまで、再配信の状態のままになります。再配信状態のままのメッセージは、リングキューから削除できません。
ブローカーは再配信メッセージを削除できないため、クライアントは許可するリングサイズの設定よりもリングキューにより多くのメッセージを送信できます。たとえば、以下のシナリオについて考えてみましょう。
-
プロデューサーは、
ring-size="3"
で設定したリングキューに 3 つのメッセージを送信します。 すべてのメッセージは即座にコンシューマーにディスパッチされます。
この時点で、
messageCount=
3
およびdeliveryCount
=3
です。プロデューサーは別のメッセージをキューに送信します。その後、メッセージはコンシューマーにディスパッチされます。
現在、
messageCount
=4
およびdeliveryCount
=4
です。4
のメッセージ数は、設定されたリングサイズ3
を超えています。ただし、ブローカーはキューから再配信メッセージを削除できません。現在は、メッセージを承認せずにコンシューマーが閉じられているとします。
この場合、4 つのインポイントで承認されていないメッセージはブローカーにキャンセルされ、消費元の逆順でキューの先頭に追加されます。このアクションにより、設定されたリングサイズにキューが追加されます。リングキューはヘッドでメッセージの末尾にあるメッセージを優先するため、キューは最後のメッセージがキューの先頭に追加されていたため、プロデューサーによって送信された最初のメッセージを破棄します。トランザクションまたはコアセッションのロールバックは同じように処理されます。
コアクライアントを直接使用する場合や、AMQ Core Protocol JMS クライアントを使用する場合は、consumerWindowSize
パラメーターの値 (デフォルトでは 1024 * 1024 バイト) を減らすことで、配信中のメッセージ数を最小限に抑えることができます。