質問
Pythonからxmlファイルを生成するサーバーと、Javaを使用してこれらのxmlを使用する他のサーバーがいくつかあります。私は最近JMSと ActiveMQ を調査し、それを使用してxmlファイルを渡すことにしました。
それで、コンシューマーサーバーにActiveMQデーモンをセットアップし、プロデューサーにいくつかのサイクリングメソッドを実装して、XMLをコンシューマーに均等に分散することを考えました。
Python -----------------------------> ActiveMQ ---> Java
\ /
\ /
---------------------------> ActiveMQ ---> Java
/ /
Python ----------------------------
テストのために、1つのプロデューサーと1つのコンシューマーを実行し、結果を確認しました。
驚いたことに、プロデューサーからのメッセージはネットワーク上のすべてのActiveMQサーバーに配信されました。 1つのコンシューマーのみを実行したため、そのマシンのActiveMQデーモンに到達するxmlのみを受け取り、残りのxmlは他のマシンの他のActiveMQデーモンで辛抱強く待っていました。
Python -----------------------------> ActiveMQ ---> Java (work)
|
|
ActiveMQ (xmls piling up)
編集:これは実際に起こったことではありません、ごめんなさい。詳細については以下をご覧ください
今、私はこれが私が望んでいたものであるので、文句を言っていませんが、私は少し混乱しています:私が望んでいるこの多対多キューを実装する適切な方法は何ですか?
プロデューサーマシンにもActiveMQデーモンを設定し、ローカルホストのActiveMQにxmlを送信し、自動検出を信頼してコンシューマにxmlを取得する必要がありますか?
Python ---> ActiveMQ ------------------------------ ActiveMQ ---> Java
| |
| |
| -- ActiveMQ ---> Java
| |
Python ---> ActiveMQ----------------------------
安全のために、元の計画に固執し、消費者のマシン間でメッセージを循環させる必要がありますか?
または、プロセスからそれらの詳細を隠すAPIを使用する必要がありますか?
ところで、プロデューサーはSTOMPを使用するpythonプロセスであり、コンシューマーはJMSを使用するjavaです。
あなたの目が私のくだらないASCIIアートから傷ついているとすみません、言葉だけで十分に明確であるかどうかはわかりませんでした。
編集
どうやら、私が<!> quot; 1つのプロデューサーと1つのコンシューマ<!> quot;を実行していたとき私は他の消費者がすでに走っていることに気づかなかった。彼らは、処理したxmlに対して有用なことを何もしていませんでした。そのため、部分的な結果が表示されていました。
もう少し読んで少し実験した後、次のことがわかりました。
デフォルトでは、ActiveMQはローカルネットワーク上の他のActiveMQインスタンスを自動検出し、ストアアンドフォワードブローカーのネットワーク。これは、プロデューサーが任意のActiveMQインスタンスにxmlを投稿でき、同じネットワーク上の他のActiveMQインスタンスをリッスンしているコンシューマーへの道を見つけることを意味します。
ドキュメントでは、自動検出は実稼働セットアップには推奨されていないと記載されていることに注意してください。
しかし、以下の受け入れられた答えはまだ当てはまります。 ActiveMQを使用する最も簡単な方法は、1つまたは2つのサーバーを<!> quot; Queue Servers <!> quot;として使用することです。それにもかかわらず、私は元の計画を採用することを選択しました。なぜなら、ネットワークトラフィックを減らすと思うからです(中間サーバーでは、xmlsがxmlsをやり直さなくてはなりません)。
解決
イサドク、おそらくメッセージングの使用を適切に検討していないと思います。
消費者ごとに1つのケースにMOMインスタンス(ActiveMQ、RabbitMQ、またはその他のMOMブローカー)を置くことは、概念的には実際には意味がありません。むしろ、MOMブローカーをメッセージのルーターと考えるのが最善です。
その場合、すべてのプロデューサーとすべてのコンシューマーが接続する1つのActiveMQブローカーインスタンス(スケーリングの問題がある場合はシャーディングまたはスケーリングされるか、HAの考慮事項がある場合は複製される)があります。次に、すべてのXMLは同じブローカーインスタンスに送られ、すべてのコンシューマは同じブローカーインスタンスから読み取ります。その場合、ブローカーは使用するヒューリスティックに基づいて、メッセージの送信先のコンシューマーを決定します。
これはまた、プロデューサーとコンシューマーを動的に追加および削除できることを意味し、変更は一切ありません:それらはすべて同じブローカーに接続するため、負荷の変更やシステムの障害に応じてプロデューサーとコンシューマーを追加および削除できます