5

私は最近、JMS、Spring (および TIBCO EMS) の接続、セッション、コンシューマー、プロデューサーに関するベスト プラクティスについて多くのことを読みました。

春の世界で働くとき、一般的な知恵は

  • 消費/受信フローの場合- をAbstractMessageListenerContainer多数のコンシューマー/スレッドで使用します。
  • フローの生成/公開用- のCachingConnectionFactory下にあるを使用JmsTemplateして、ブローカーへの単一の接続を維持し、セッションとプロデューサーをキャッシュします。

プロデュース/パブリッシュのために、これは私の(大規模な)サーバーアプリケーションが現在行っていることです。以前は、ローコネクションファクトリを使用しているため、パブリッシュするすべてのメッセージに対して新しい接続/セッション/プロデューサーを作成していました(悪い!)JmsTemplate. 以前の動作では、ブローカーで数千の接続が作成され、高ピーク時に短時間で閉じられ、結果としてソケット/ファイル ハンドルの制限に達することさえありました。

ただし、このモデルに切り替えると、ブローカーへの単一の TCP 接続を使用する場合のパフォーマンスの制限/考慮事項を理解するのに苦労します。JMS プロバイダーは、マルチスレッドの方法などで使用できるようにすることが期待されていることを理解していますが、実際的な観点からは

  • それはただの 1 つの TCP 接続です
  • JMS プロバイダーは、パイプの書き込みをある程度調整する必要があるため、内部プロトコルにチャンクが含まれていても、インターリーブされた寄せ集めにならないようにする必要があります。
  • 確かにこれには、単一の接続を使用するスレッド/セッション間の競合が含まれます
  • 特定のネットワーク セマンティクス (ブローカーへの待ち時間が長い? スループットが不安定?) では、単一の接続は理想的ではありませんか?

私がある程度正しい軌道に乗っているという前提で

  • 基本的な接続がどのように機能し、JMS プロバイダーによって共有されるかを誤解しているのでしょうか?
  • 接続を増やすことで問題が軽減されるのか、それとも単に競合をブローカーに移すだけなのか?
  • 誰かが共有できるような限界に達した実際の経験がありますか? 特定のメッセージまたはネットワークのスループット、または接続を並行して共有するスレッド/セッションの数によって引き起こされる場合もあります
  • 単一接続のシナリオで、非常に大きなメッセージを書き込むセッションが小さなメッセージを書き込む他のセッションをブロックすることに注意する必要がありますか?

他のブローカーとの経験や主題に関するより多くの読書への考えや指針をいただければ幸いです.

4

2 に答える 2

3

ボトルネックについて考えるときは、次の 2 つの事実に留意してください。

  1. TCP はストリーミング プロトコルであり、ほぼすべての JMS プロバイダーが TCP ベースのプロトコルを使用します。

  2. TIBCO EMS クライアントから EMS サーバーへのアクションの多くは、要求/応答の形式です。たとえば、メッセージを発行する/受信メッセージを確認する/トランザクションセッションをコミットする場合、内部で起こっていることは、一部の TCP パケットがクライアントから送信され、サーバーも一部のパケットで応答することです。TCP ストリーミングの性質上、これらのアクションが同じ接続から開始された場合、これらのアクションをシリアル化する必要があります。そうでない場合、たとえば、あるスレッドからメッセージを発行し、まったく同時に別のスレッドからセッションをコミットした場合、パケットはネットワーク上で混合され、サーバーがパケットから正しいメッセージを解釈する方法がありません。[ 注: 同期は EMS クライアント ライブラリ レベルから行われます。

私自身の経験では、複数の接続は常に単一の接続を実行します。損失の多いネットワーク状況では、複数の接続を使用する必要があります。複数の接続がある最良のネットワーク状態では、1 つのクライアントがクライアントとサーバー間のネットワーク帯域幅をほぼ飽和状態にする可能性があります。

とはいえ、それは実際にはクライアントのパフォーマンス要件に依存します。良好なネットワークの下での単一の接続は、すでに十分なパフォーマンスを提供できます。

于 2014-09-18T06:34:24.067 に答える
0

1 つの接続と 100 のセッションを使用する場合でも、最終的に 100 のスレッドを使用していることを意味し、10 の接続 * 10 セッション = 100 のスレッドを使用するのと同じです。

システム リソースの制限に達するまでは問題ありません

于 2016-04-08T23:47:10.507 に答える