クライアントから送信された 1 つの JMS メッセージを 2 つのシステムに確実に (1 回だけ) 配信する必要があります。これら 2 つのシステムは HA 対応ではないため、私が思いついた最良の提案は次のとおりです。
クライアントが投稿する単一のキューを作成する
2 つの「中間」キューを設定する
クライアント キューからメッセージを読み取り、同じトランザクション内の 2 つのキューにポストするカスタム "DuplicatorMDB" を使用します。
client -> JMSDQ -> DuplicatorMDB -> Q1 -> MDB -> System1 \->Q2->MDB->System2
そのような既存の機能はありますか?1 つまたは両方のバックエンド システムがダウンした場合に、システムのバランスをとってシステムを安定させる適切な方法は何ですか?
アプリケーション サーバーは WebLogic 10 です。
これにはトピックを使用できません。これは、クラスター内でトピックがメッセージの重複を引き起こしすぎるためです。2 つのインスタンスがある場合、トピックを使用すると、次のようになります。
client->Topic-->MDB1@server1->System1 | | \->MDB2@server1->System2 \---->MDB1@server2->System1 \--->MDB2@server2->System2
したがって、すべてのメッセージは System1 に 2 回、System2 に 2 回配信されます。クラスター内に 8 つのサーバーがある場合、各メッセージは 8 回配信されます。これは本当に避けたい…
最後に、テストする時間ができました。これが私が観察したことです。クラスター内に2つのノードがあります。2 つの JMS サーバー: ノード 1 の jms1、ノード 2 の jms2。分散トピック dt. 永続サブスクリプションと jms-client-id=durableSubscriber を持つ MDB。システムを開始しました: 0 メッセージ、mdb@node1 は稼働中、mdb@node2 は定期的に接続しようとしていますが、「クライアント ID、durableSubscriber が使用中」のため接続できません。予想通り。
100 個のメッセージで送信: jms1@dt メッセージの現在の = 0、メッセージの合計 = 100、現在のコンシューマー = 1 ノード 1 が 100 個のメッセージを処理したことがわかります。
jms2@dt メッセージの現在の = 100、メッセージの合計 = 100、消費者の現在の = 1 つまり、「重複した」メッセージがトピックで保留中です。
さらに 100 件のメッセージが送信され、100 件がノード 1 で処理され、200 件がノード 2 で保留されています。
node1 が再起動され、mdb@node2 が dt に再接続され、「保留中」メッセージの処理が開始されました。node2 で 200 件のメッセージが処理されました。
node1 が起動した後、mdb@node2 が接続されている間、mdb@node1 は dt に接続できません。
jms1@dt メッセージ現在 = 0、メッセージ合計 = 0、消費者現在 = 0
jms2@dt メッセージ現在 = 0、メッセージ合計 = 200、消費者現在 = 1
さらに 100 個のメッセージを送信します。100 個のメッセージすべてが node2 で処理され、node1 で破棄されていることがわかります。
jms1@dt メッセージの現在の値 = 0、メッセージの合計 = 100、消費者の現在の値 = 0
jms2@dt メッセージの現在の値 = 0、メッセージの合計 = 300、消費者の現在の値 = 1
node2 を再起動すると、mdb@node1 が dt に再接続します。再起動後、mdb@node2 は dt に再接続し、mdb@node1 は dt から切断されます。
jms1@dt メッセージ現在 = 0、メッセージ合計 = 100、消費者現在 = 1
jms2@dt メッセージ現在 = 0、メッセージ合計 = 0、消費者現在 = 1
100 個のメッセージを送信します。すべてが node2 で処理され、node1 のトピックに保存されます。
jms1@dt メッセージ現在 = 100、メッセージ合計 = 200、消費者現在 = 1
jms2@dt メッセージ現在 = 0、メッセージ合計 = 0、消費者現在 = 1
その後、node2 をシャットダウンすると、mdb@node1 がトピックに再接続した後、node1 で 100 個の「保留中のメッセージ」が処理されていることがわかります。
結果は次のとおりです。400 件のメッセージを送信し、700 件が MDB によって処理され、そのうち 300 件が重複していました。
MDB の再接続は期待どおりに機能しているように見えますが、「アクティブな」MDB をホストしているノードがダウンすると、メッセージが重複する可能性があります。
これは、weblogic JMS 実装のバグまたは機能である可能性があります。