0

ここで、サンプルの JMS レイアウトに少し問題があります。

2 台のマシンに 2 つのブローカー (A、B) があり、ネットワーク コネクタを介してリンクされています。プロデューサーは任意のブローカーに送信でき、コンシューマーは任意のブローカーをリッスンでき、送信/受信するトピックはグローバルに利用できるという考えです。

トピックには、トピック内のすべてのメッセージを処理する 2 つの永続サブスクライバー クライアント (各マシンに 1 つ) があります。プロセスを再起動する必要がある場合にプロセスがワークロードを失わないように、永続的なサブスクリプションにしたいと考えています。両方のサブスクライバー クライアントは、フェイルオーバー ブローカーの URL を持つように構成されているため、最初にローカルホスト ブローカーに接続しようとし、他のブローカーに接続できない場合に接続を試みます。クライアントのフェイルオーバーは機能しているようですが、次の状況で問題が見つかりました。

各ブローカ 'A' および 'B' にはサブスクライバ クライアントが接続されています。プロデューサは 'A' に送信しています。ブローカー 'B' が再起動されます。「B」のクライアントは、接続が失われたことを登録し、「A」に切り替えます。'B' が再び表示され、'A' への永続サブスクライバとして登録されているため、メッセージ フィードを取得します。現在、アクティブな永続サブスクライバーはなく ('A' には 'B' を含む 3 つがあります)、接続制限に達するまで積み上げられます。

私の設定は間違っていますか?私が意図したことは可能ですか?

乾杯、カイ

4

1 に答える 1

0
  1. マスター/スレーブ構成を実行していますか?
  2. 両方のブローカーが同時にクライアントを接続する必要があるのはなぜですか?

フェイルオーバー接続文字列を使用する場合 (両方のブローカーを識別)、コンシューマー/プロデューサーは ActiveMQ フェイルオーバー実装を使用し、必要に応じてアクティブ ノードに接続/再接続します。アクティブなクライアントを持つ2つのアクティブなインスタンスを持つことは良い考えではないと思います-プロセスを複製しようとしている場合を除きます(この場合、同期はありません)

両方のノード (マスターとスレーブ) が常に同じ耐久性のあるデータを持つようにする
には、両方のノードがアクセスできる同じ場所にメッセージを永続化する必要があります。データベースの単一インスタンス (おそらくクラスターの背後) に接続された JDBC アダプター、または KahaDB 用の共有ネットワーク フォルダーを持つ NAS です。

于 2012-01-09T19:57:09.013 に答える