ホームページ > バックエンド開発 > C#.Net チュートリアル > Message Queue とその使用法の概要

Message Queue とその使用法の概要

巴扎黑
リリース: 2016-12-20 09:25:03
オリジナル
1602 人が閲覧しました

MSMQ (Microsoft Message Queue) を利用すると、アプリケーション開発者はメッセージを送受信することで、アプリケーションと簡単かつ迅速かつ確実に通信できます。メッセージ処理は、保証されたメッセージ配信と、多くのビジネス プロセスを実行するための信頼性の高いフェールセーフな方法を提供します。

MSMQ は、XML Web サービスや .Net Remoting と同様、分散開発テクノロジです。ただし、XML Web サービスまたは .Net Remoting コンポーネントを使用する場合、クライアントはサーバーとリアルタイムで情報を交換する必要があり、サーバーはオンラインを維持する必要があります。 MSMQ はサーバーがオフラインのときにも動作し、メッセージをクライアントのメッセージ キューに一時的に保存し、後でオンラインになったときに処理するためにサーバーに送信します。

明らかに、MSMQ は、クライアントがサーバーからのタイムリーな応答を必要とする状況には適していません。MSMQ は非同期でサーバーと対話するため、サーバーの処理を長時間待つことを心配する必要はありません。

XML Web サービスと .Net Remoting は両方とも、非同期呼び出しを処理するための [OneWay] 属性を提供します。これは、クライアント側で長時間妨げられるサーバー側での長いメソッド呼び出しの問題を解決するために使用されます。ただし、現時点では、サーバーはリクエストを処理するよりも早くリクエストを受け入れるため、大量のクライアント負荷の問題を解決できません。

通常、[OneWay] 属性は特殊なメッセージング サービスでは使用されません。

1. 基本的な用語と概念

「メッセージ」は、2 台のコンピューター間で送信されるデータの単位です。メッセージは、テキスト文字列のみを含む非常に単純な場合もあれば、埋め込みオブジェクトを含むより複雑な場合もあります。

メッセージはキューに送信されます。 「メッセージ キュー」は、送信中のメッセージを保存するコンテナです。メッセージ キュー マネージャーは、メッセージを送信元から宛先に中継するときに仲介者として機能します。キューの主な目的は、ルーティングを提供し、メッセージの配信を保証することです。メッセージの送信時に受信者が不在の場合、メッセージ キューはメッセージが正常に配信されるまでメッセージを保持します。

「メッセージ キュー」は、Microsoft Windows がインストールされているコンピュータの任意の組み合わせ上のアプリケーションに、コンピュータが同じネットワーク上にあるか、オンラインでないかに関係なく、メッセージ処理およびメッセージ キュー機能を提供する Microsoft のメッセージング テクノロジです。時間。

「メッセージ キュー ネットワーク」とは、メッセージを相互に送信できるコンピューターのグループです。ネットワーク内のさまざまなコンピュータは、メッセージがスムーズに処理されるようにするためにさまざまな役割を果たします。それらの中には、メッセージの送信方法を決定するためのルーティング情報を提供するもの、ネットワーク全体に関する重要な情報を保持するもの、および単にメッセージを送受信するだけのものもあります。

メッセージ キューのインストール中に、管理者はどのサーバーが相互に通信できるかを決定し、特定のサーバーに特別な役割を設定します。このメッセージ キュー ネットワークを構成するコンピュータはサイトと呼ばれ、サイト リンクを通じて相互に接続されます。各サイト リンクには関連する「コスト」があり、管理者によって決定され、サイト リンクを通じてメッセージが配信される頻度が示されます。

また、「メッセージ キュー」管理者は、ネットワーク内で 1 台以上のコンピュータを「ルーティング サーバー」として設定します。ルーティング サーバーは、各サイト リンクのコストを調べてメッセージを配信する方法を決定し、複数のサイトを通じてメッセージを配信するための最速かつ最も効率的な方法を決定します。

2. キューの種類

ネットワーク上のユーザーまたは他のユーザーによって作成されたキューとシステム キューの 2 つの主なキュー タイプがあります。

ユーザーが作成したキューは、次のいずれかになります。

「パブリック キュー」は、メッセージ キュー ネットワーク全体にレプリケートされ、ネットワークに接続されているすべてのサイトからアクセスできる可能性があります。

「プライベートキュー」はネットワーク全体に公開されません。代わりに、それらが存在するローカル コンピュータ上でのみ使用できます。プライベート キューには、キューの完全なパス名またはラベルを知っているアプリケーションのみがアクセスできます。

「管理キュー」には、特定の「メッセージ キュー」ネットワークで送信されたメッセージの受信を確認するメッセージが含まれます。 MessageQueue コンポーネントで使用する管理キュー (存在する場合) を指定します。

「応答キュー」には、ターゲットアプリケーションがメッセージを受信したときに送信アプリケーションに返される応答メッセージが含まれます。 MessageQueue コンポーネントで使用する応答キュー (存在する場合) を指定します。

システム生成のキューは、通常、次のカテゴリに分類されます。

「ジャーナル キュー」は、送信されたメッセージのコピーとキューから削除されたメッセージをオプションで保存します。各メッセージ キュー クライアント上の 1 つのジャーナル キューには、そのコンピュータから送信されたメッセージのコピーが保存されます。キューごとに個別のジャーナル キューがサーバー上に作成されます。このジャーナルは、このキューから削除されたメッセージを追跡します。

「デッドレターキュー」には、配信できないメッセージや期限切れのメッセージのコピーが保存されます。期限切れのメッセージまたは配信不能なメッセージがトランザクション メッセージの場合、そのメッセージは「トランザクション配信不能キュー」と呼ばれる特別な配信不能キューに保存されます。デッドレターは、期限切れのメッセージと同じコンピュータに保存されます。タイムアウト期間と期限切れメッセージの詳細については、「デフォルトのメッセージ プロパティ」を参照してください。

「レポートキュー」には、メッセージが宛先に到達するまでにたどったルートを示すメッセージが含まれており、テストメッセージを含むこともできます。コンピュータごとに存在できるレポート キューは 1 つだけです。

「プライベート システム キュー」は、システムがメッセージ処理操作を実行するために必要な管理メッセージと通知メッセージを保存する一連の専用キューです。

アプリケーションで行われる作業のほとんどには、パブリック キューとそのメッセージへのアクセスが含まれます。ただし、アプリケーションのロギング、確認応答、その他の特別な処理のニーズに応じて、日常の操作でいくつかの異なるシステム キューを使用する可能性があります。

3. 同期通信と非同期通信

キューへのメッセージの送信とキューからのメッセージの受信は別のプロセスで完了するため、キューの通信は本質的に非同期です。さらに、メッセージを受信したい人は任意のキューで BeginReceive メソッドを呼び出し、応答を待たずにすぐに他のタスクを続行できるため、受信操作を非同期で実行できます。これは、人々が知っている「同期通信」とは大きく異なります。

同期通信では、リクエストの送信者は、他のタスクを実行する前に、目的の受信者からの応答を待つ必要があります。送信者が待機する時間は、受信者が要求を処理して応答を送信するのにかかる時間に完全に依存します。

4. メッセージ キューとの対話

メッセージ処理とメッセージングは​​、サーバーベースのアプリケーション コンポーネント間のプロセス間通信のための強力で柔軟なメカニズムを提供します。コンポーネント間の直接呼び出しに比べて、次のようないくつかの利点があります:

安定性 - メッセージはキューに保存され、適切に処理されるまでキューに留まるため、コンポーネントの障害がメッセージに与える影響は、コンポーネント間の直接呼び出しよりもはるかに少ないです。メッセージ処理は、メッセージ処理が保証されているという点でトランザクション処理に似ています。

メッセージの優先順位 – 重要性の低いメッセージよりも緊急性の高いメッセージや重要なメッセージを受信できるため、重要なアプリケーションに対する適切な応答時間が確保されます。

オフライン機能 - メッセージが送信されると、一時キューに送信され、正常に配信されるまでそこに留まります。何らかの理由で必要なキューにアクセスできない場合でも、ユーザーは操作を続行できます。一方、ネットワーク接続が回復するとメッセージの配信が保証されるため、他の操作はメッセージが処理されたかのように続行できます。

トランザクション メッセージ処理 — 複数の関連メッセージを 1 つのトランザクションに結合し、メッセージが順番に配信され、1 回だけ配信され、宛先キューから正常に取得できるようにします。エラーが発生した場合、トランザクション全体がキャンセルされます。

セキュリティ — MessageQueue コンポーネントのベースとなるメッセージ キュー テクノロジは、Windows セキュリティを使用してアクセス制御を保護し、監査を提供し、コンポーネントによって送受信されるメッセージを暗号化および認証します。

5. .Net 環境で簡単なメッセージ キュー プログラムを作成します

(1) 最初にメッセージ キュー サービスをインストールします

コントロール パネルの [プログラムの追加と削除] - [Windows コンポーネントの追加と削除] の手順で MSMQ をインストールします。

MSMQ はワークグループ モードまたはドメイン モードでインストールできます。インストーラがディレクトリ サービスを提供するメッセージ キューを実行しているサーバーを見つけられない場合、このコンピュータにメッセージ キューをインストールできるのは、プライベート キューの作成と、メッセージ キューを直接実行している他のコンピュータとの共有キューの作成だけです。繋がり。

(2) MSMQ を構成します

コンピューターの管理 – メッセージ キューを開き、プライベート キューの下に MSMQDemo キューを作成します

(3) コードを書く - MSMQ オブジェクトの簡単なデモンストレーション

MessageQueue クラスは "メッセージキュー」パッケージ。 MessageQueue クラスは、Message Queue キューへの参照を提供します。 MessageQueue コンストラクターで既存のリソースへのパスを指定することも、サーバー上に新しいキューを作成することもできます。 Send、Peek、または Receive を呼び出す前に、MessageQueue クラスの新しいインスタンスを既存のキューに関連付ける必要があります。

MessageQueue は、同期と非同期の 2 種類のメッセージ取得をサポートしています。同期 Peek メソッドと Receive メソッドを使用すると、プロセス スレッドは、新しいメッセージがキューに到着するまで、指定された間隔だけ待機します。非同期 BeginPeek メソッドと BeginReceive メソッドを使用すると、メッセージがキューに到着する前に、メイン アプリケーション タスクが別のスレッドで実行を継続できます。これらのメソッドは、コールバック オブジェクトと状態オブジェクトを使用してスレッド間で情報を通信することによって機能します。

// メッセージを送信

private void btnSendMessage_Click(object sender, System.EventArgs e)

{

Queue(" .\Private$ \ MsmqDemo "); トリム (); (

message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] {typeof(string)});

// メッセージをキューに入れます

queue.Send(message);

}

// メッセージを受信します

private void btnReceiveMessage_Click(object sender, System.EventArgs e)

{

// キューを開く

System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(".\Private$\ MSMQデモ");

// メッセージを受信します。同步的受信方法を阻止し、現在のメッセージを取得できるまで

System.Messaging.Message message = queue.Receive();

message.Formatter = new System 。 Messaging.XmlMessageFormatter(new Type[] {typeof(string)});

txtReceiveMessage.Text = message.Body.ToString();

}


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート