2011-01-31 4 views
3

私はクライアントアプリケーションのインスタンスをたくさん持っています。これらのクライアントは、メッセージングを介してサーバーアプリケーションに要求を送信し、応答を受信します。通常、応答は一時的なキューを使用して送信されます。一時的なキューがない場合は、要求/応答パターンを実装する最善の方法は何ですか?

残念ながら、一時的なキューやトピックの概念を持たないStompプロトコルを使用する必要があります。 (メッセージブローカーが持っていますが)

オリジナルのリクエスタのみが返信を受け取れるようにする最良の方法は何ですか?この不幸な状況のベストプラクティスはありますか?

+0

これは、あなたが使用しているテクノロジに大きく依存すると思います(言及していない)。 – skaffman

+0

私は、JMSと互換性があり、具体的なメッセージング実装には無関係なソリューションを求めています。私はActiveMQを使用していると言えるかもしれませんが、私のアプリケーションをActiveMQでのみ可能なものに依存させたくありません。 –

+0

@ DR:ストンププロトコルは、とにかくActiveMQにあなたをロックしますね。 「本当の」エンタープライズJMSプロバイダのどれもそれを使用しません。 – skaffman

答えて

4

複数のリクエスタが同じキューで応答をリッスンする場合の慣習的な解決方法は、相関IDを使用してメッセージを選択することです。クライアント側では、次のようになります。

  1. 要求キューにメッセージを配置してコミットします。
  2. アウトバウンドメッセージからJMSMessageIDを取得します(値はブローカーによって決定され、送信の結果としてメッセージオブジェクトが更新されます)。
  3. アウトバウンド・メッセージのJMSMessageIDをセレクター内の相関IDとして指定して、応答キューからメッセージを受信します。
  4. プロセスとコミット。サーバー側では

それは次のようになります。

  1. 同期点の下にメッセージが表示されます。
  2. 要求を処理して応答を準備します。
  3. 応答のJMSCorrelationIDを、要求からのJMSMessageIDの値に設定します。
  4. メッセージを送信します。
  5. コミット。

消費者は、セレクタを次のように設定します。activemq.selector:JMSCorrelationID=

ブローカはグローバルに一意であると思われるメッセージIDを作成するので、相関IDとして使用するパターンは、各リクエスタが独自の値を指定できるときに発生する可能性のある衝突を防ぎます。

2

このパターンをJMSで実装する最良の方法は、あらかじめ設定されたレスポンスメッセージのトピックを作成し、レスポンスメッセージに相関セレクタを使用してクライアントが正しいもの。

詳細には、要求メッセージにランダムIDを設定し(setJMSCorrelationID()を使用)、そのメッセージを要求キューに入れることを意味します。その要求メッセージの消費者はそれを処理し、応答メッセージを作成し、応答メッセージに同じ相関IDを設定し、それを応答トピックに置きます。一方、クライアントは、応答トピックで、それが予期している相関IDを指定するセレクター式でリッスンしています。

クライアントがリスニングする前に応答メッセージが送信される危険性がありますが、それはおそらくありません。トピックではなくレスポンスにあらかじめ設定されたキューを使用してみることができますが、トピックがより確実に機能する傾向があることがわかりました(選択したJMSプロバイダはHornetQです。

これはすべて、JMSが要求/応答モデルに適していないことを示しています。 APIはそれを正しくサポートしていません。 JMSのユースケースではなかったので、これは驚くことではありません。

計算格子(Terracotta、Gigaspaces、Infinispanなど)のようなものは、より良い結果をもたらす可能性がありますが、それは実際にはあなたの選択肢ではありません。

+0

競合状態はほとんどありませんが、通常はアプリケーションで許容されますか?私はほとんどが金融部門で働いているので、ごくまれに起こったとしても、私は使い捨てのメッセージに未使用です。私はこのパターンをどれくらい頻繁に使用できるのか不思議です。 –

+0

@ T.Rob:私はそれが起こるのを見たことはありませんでしたが、それが起こるハイスループットのシナリオを想像することができます。また、ネットワーク/ VMアーキテクチャーとJMSの実装にも依存します。 – skaffman

関連する問題