4.19.2. リングキューのトラブルシューティング
本セクションでは、リングキューの動作が設定とは異なる状況を説明します。
再配信メッセージおよびロールバック
メッセージがコンシューマーに配信されている場合、メッセージは in-between 状態になります。ここでは、メッセージはキューには技術的には表示されなくなりますが、まだ確認されていません。メッセージは、コンシューマーによって確認されるまで、再配信の状態のままになります。再配信状態のままのメッセージは、リングキューから削除できません。
ブローカーは再配信メッセージを削除できないため、クライアントは許可するリングサイズの設定よりもリングキューにより多くのメッセージを送信できます。たとえば、以下のシナリオについて考えてみましょう。
-
プロデューサーは、
ring-size="3"で設定したリングキューに 3 つのメッセージを送信します。 すべてのメッセージは即座にコンシューマーにディスパッチされます。
この時点で、
messageCount=3およびdeliveryCount=3です。プロデューサーは別のメッセージをキューに送信します。その後、メッセージはコンシューマーにディスパッチされます。
現在、
messageCount=4およびdeliveryCount=4です。4のメッセージ数は、設定されたリングサイズ3を超えています。ただし、ブローカーはキューから再配信メッセージを削除できません。現在は、メッセージを承認せずにコンシューマーが閉じられているとします。
この場合、4 つのインポイントで承認されていないメッセージはブローカーにキャンセルされ、消費元の逆順でキューの先頭に追加されます。このアクションにより、設定されたリングサイズにキューが追加されます。リングキューはヘッドでメッセージの末尾にあるメッセージを優先するため、キューは最後のメッセージがキューの先頭に追加されていたため、プロデューサーによって送信された最初のメッセージを破棄します。トランザクションまたはコアセッションのロールバックは同じように処理されます。
コアクライアントを直接使用する場合や、AMQ Core Protocol JMS クライアントを使用する場合は、consumerWindowSize パラメーターの値 (デフォルトでは 1024 * 1024 バイト) を減らすことで、配信中のメッセージ数を最小限に抑えることができます。
スケジュールされたメッセージ
スケジュールされたメッセージがキューに送信されると、メッセージは通常のメッセージのようにキューの末尾に即座に追加されません。代わりに、ブローカーはスケジュールされたメッセージを中間バッファーに保持し、メッセージの詳細に従ってキューのヘッドへ配信するようにメッセージをスケジュールします。ただし、スケジュールされたメッセージはキューのメッセージ数に反映されます。再配信メッセージの場合のように、この動作により、ブローカーがリングキューのサイズを強制していないことを確認できます。たとえば、以下のシナリオについて考えてみましょう。
12:00 では、プロデューサーはメッセージ
Aをring-size="3"で設定されたリングキューに送信します。メッセージは 12:05 に対してスケジュールされます。この時点で、
messageCount=1およびscheduledCount=1になります。12:01 では、プロデューサーはメッセージ
Bを同じリングキューに送信します。現在、
messageCount=2およびscheduledCount=1。12:02 では、プロデューサーはメッセージ
Cを同じリングキューに送信します。現在、
messageCount=3およびscheduledCount=1。12:03 時、プロデューサーはメッセージ
Dを同じリングキューに送信します。現在、
messageCount=4およびscheduledCount=1。キューのメッセージ数は
4で、設定されたリングサイズから3よりも大きい ようになりました。ただし、スケジュールされたメッセージはキューでは技術的ではありません (つまり、ブローカーにあり、キューに配置するようにスケジュールされています)。スケジュールされた配信時間 12:05 にすると、ブローカーはメッセージをキューのヘッドに配置します。ただし、リングキューが設定サイズをすでに到達しているため、スケジュールされたメッセージAはすぐに削除されます。
ページ化されたメッセージ
スケジュールされたメッセージや配信のメッセージと同様に、ページングされたメッセージは、キューレベルではなく、実際にはアドレスレベルでページングされるため、ブローカーによって実施されるリングキューのサイズにはカウントされません。ページ化されたメッセージはキューでは技術的ではありませんが、キューの messageCount 値に反映されます。
リングキューを持つアドレスにはページングを使用しないことが推奨されます。代わりに、アドレス全体をメモリーに収めるようにします。または、 address-full-policy パラメーターを DROP、BLOCK または FAIL の値に設定します。
関連情報
- ブローカーは、Retroactive アドレスを設定するときにリングキューの内部インスタンスを作成します。詳細は、「Retroactive アドレスの設定」 を参照してください。