1

1 つのサーバーが多数の独立したクライアントにメッセージを送信する必要があるシステムを設計しています。クライアントはお互いのことを認識していないため、メッセージを消費したり、覗いたり、他の方法でお互いのメッセージに関する知識を得たりすることはできません。

したがって、JMS / ActiveMq には、どのクライアントがどのメッセージを受け取るかを制御する機能があるのだろうか?

すべてのクライアントが同じ JSM プロバイダー (「宛先」) に接続し、クライアント向けのメッセージのみを消費するようにします。これは、サーバーの観点からは単純なセットアップです。

別の方法は、すべてのクライアントから Web サービス エンドポイントを取得し、サーバーがクライアントへのメッセージを受け取るたびに ws-call を実行することです。ws 呼び出しが肥大化していると思うので、この代替サウンドは「間違っている」と思います。各 ws 呼び出しには大きなオーバーヘッドがあり、このサーバーは毎日数千回の呼び出しを行う必要があります。私の意見では、これはサーバーにとって最適ではありません...

4

1 に答える 1

1

簡単な答え: Message selectorを使用します。

詳細な回答: 質問では、会話がどのように開始されるかについて言及されていません。したがって、ここで両方のシナリオに対する私の答えを示します。

a)クライアントが会話を開始した場合 (つまり、クライアントがサーバーにメッセージを送信し、応答を待っている場合)。

これはリクエスト/リプライのシナリオです。Messaging/JMS は分離された通信システムです。ただし、要求/応答は JMS の一般的なパターンです。相関パターンを使用して実装できます。

  • 一意の識別子 (相関 ID) は、要求メッセージの一部として送信されます。
  • サーバーはメッセージを受信し、応答メッセージに相関 ID を設定します。
  • クライアントはメッセージ セレクターを使用して、正しい相関 ID を持つメッセージを受信します。

b)サーバーが会話を開始した場合 (つまり、サーバーがクライアントの要求なしにクライアントにメッセージを送信した場合)。

この場合、同様のアプローチを使用できます。

  • 各クライアントには固定のクライアント ID が割り当てられます。
  • サーバーはすべてのクライアント ID を保持し、受信者のクライアント ID をメッセージの相関 ID として設定します。
  • クライアントは、メッセージ セレクターを使用して、クライアント ID と等しい相関 ID を持つメッセージを受信します。

守秘義務について更新しました。

このリンクから抽出された次の情報は、 JMS セキュリティを理解するのに役立ちます。

JMS は、メッセージの機密性と整合性を制御するためのセキュリティ コントラクトまたは API を指定しません。セキュリティは、JMS プロバイダー固有の機能と見なされます。これは、プログラムまたは J2EE サーバー ランタイムによって実装されるのではなく、システム管理者によって制御されます。

JMS セキュリティの 2 つの主要な機能は、認証と承認です。私の知る限り、クライアント アクセスの JMS セキュリティは、(個々のメッセージではなく) JMS 宛先の保護に重点を置いています。クライアントが宛先にアクセスできる限り、クライアントに割り当てられたセキュリティ ロールは、宛先に属するすべてのメッセージに適用されます。

これに基づいて、

解決策 1: クライアント コードが信頼できるパーティによって制御されている場合。

元の回答で私の解決策に従ってください。これにより、メッセージが適切な人に確実に配信されます。ただし、すべてのメッセージを受信するようにクライアント コードが意図的に変更されている場合は、何も保護されません。

解決策 2: プライベートな宛先とユーザー アカウントを各クライアントに割り当て、クライアントのユーザー アカウントがその宛先のみにアクセスできるようにセキュリティを構成します。

注: 「メッセージ セレクターがメッセージ レベルの承認を提供するための制限」に関するリンクを見つけました。しかし、それはベンダー固有のカスタム機能だと思います。

これが役立つことを願っています。

于 2010-08-13T16:45:37.233 に答える