ストアアンドフォワードネットワークとして構成された2つのActiveMQブローカー(AとB)がありました。ブローカーBに接続されているコンシューマーがあり、プロデューサーがAにメッセージを送信する場合、これらはAからBにメッセージを転送するために完全に機能します。問題は、コンシューマーが強制終了されてAに再接続されると、Bのキューに入れられたメッセージ( A)コンシューマーが接続したAに転送されません。新しいメッセージをBに送信しても、ブローカーを再起動するまですべてのメッセージがBに留まりました。ブローカーネットワークコネクタでnetworkTTL="4"とduplex="true"を設定しようとしましたが、機能しません。
2 に答える
遅い答えですが、これが将来他の誰かに役立つことを願っています。
デフォルトでは、AMQ はメッセージが以前に配信されたブローカーに送り返されることを許可しないため、メッセージは B でスタックします。通常の場合、これにより、メッセージが配信されずにメッシュのようなネットワーク トポロジの周りを循環することが防止されますが、フェイルオーバーの場合、メッセージは 1 つのブローカーに滞留し、すべてのコンシューマーが存在するブローカーに到達できなくなります。
コンシューマーが接続されていないために現在のブローカーが行き止まりになっている場合に、メッセージがブローカーに戻されるようにするには、replayWhenNoConsumers=true を使用して、B でスタックしたメッセージを A に転送できるようにする必要があります。
その構成オプション、それと組み合わせて使用する可能性のあるいくつかの設定、およびそれを使用する際のいくつかの考慮事項は、http://activemq.apache.org/networks-ofの「Stuck Messages (version 5.6)」セクションで説明されています。 -brokers.html、http://tmielke.blogspot.de/2012/03/i-have-messages-on-queue-but-they-dont.html、およびhttps://issues.apache.org/jira/ブラウズ/AMQ-4465 . これらの変更の副作用 (例: ブローカー間のネットワーク接続で他のメッセージが重複して配信される可能性) に対処できることを確認してください。
ブローカー A と B の構成と、何を達成しようとしているのかについて、より多くの情報を提供できますか?
プロデューサーが一方にのみ接続し、コンシューマーが他方に接続するように、ブローカーのネットワーク (A と B を使用) を設定することで、目的を達成できるように思えます。他のブローカーがメッセージの送信先へのアクティブなサブスクリプションを持っている限り、メッセージは自動的に他のブローカーに送信されます。
生成される結果が不明な場合は、networkTTL を変更することはお勧めしません (不要なメッセージ ループにつながる傾向があります)。