2

MSMQまたはWCFの専門家ではないので、私はそれについてかなり読んだことがあり、それは音と見栄えが良いです。私は何かを開発しようとしていますが、最終的には、堅牢で耐久性が必要な理論を最初に開発しようとしています。

MSMQは別のサーバーでホストされると思います。

2つのWCFサービスがあります。1つは受信メッセージ用で、もう1つは送信メッセージ用です(メッセージを取得し、内部処理/検証を行ってから、送信メッセージキューに配置するか、電子メール/テキストメッセージなどを送信します)

正しい構成で理解しているので、システムをトランザクション処理可能(メッセージが失われることはありません)で、1回だけ送信できるため、メッセージが重複する可能性はありません。

アプリケーション/サービスはメッセージを処理するためにマルチスレッド化され、メッセージは数百、数千になります。

しかし、メッセージの処理中またはサービスの存続期間中、サーバーがクラッシュした場合はどうなりますか?サーバーが再起動した場合はどうなりますか?何らかの理由でサービスが例外をスローした場合はどうなりますか?そのメッセージを失わないようにするにはどうすればよいのでしょうか。しかし、メッセージが再び処理されるのを待つために、メッセージをキューに戻す方法はありますか。また、サービスが再び生成されるように、サービスが堅牢であることを確認するにはどうすればよいですか?

ここでアドバイスや詳細をいただければ幸いです。取り入れるべきものは非常に多く、WCF/MSMQは非常に多くのオプションを公開しています。

4

2 に答える 2

9

あなたの仮定:

MSMQは別のサーバーでホストされると思います。

間違っている。MSMQは、メッセージキューに参加するすべてのマシンにインストールされます。

2つのWCFサービスがあります。1つは着信メッセージ用で、もう1つは発信メッセージ用です。

最も一般的な構成では、宛先キューはリスニングサービスに対してローカルです。

たとえば、ServiceAには、読み取り元のローカルキューがあります。ServiceBには、読み取り元のローカルキューもあります。ServiceAがServiceBを呼び出したい場合は、ServiceBのローカルキューにメッセージを入れます。

私は正しい構成で理解しています、それがトランザクションであることができるようにシステムを持つことができます(メッセージが失われることはありません)

正解です。これは、MSMQがストアアンドフォワードと呼ばれるメッセージングパターンを使用しているためです。説明については、こちらをご覧ください。

基本的に、メッセージの損失がないと想定しても安全な理由は、あるマシンから別のマシンへのメッセージの送信が実際には3つの異なるトランザクションの下で行われるためです。

  1. 最初のトランザクション:ServiceAはそれ自体の一時ローカルキューに書き込みます。これが失敗した場合、トランザクションはロールバックされ、ServiceAは例外を処理できます。
  2. 2番目のトランザクション:ServiceAマシンのキューマネージャーは、ServiceBマシンのキューマネージャーにメッセージを送信します。失敗した場合、メッセージは一時キューに残ります。
  3. 3番目のトランザクション:ServiceBはローカルキューからメッセージを読み取ります。ServiceBメッセージハンドラメソッドが例外をスローした場合、トランザクションはメッセージをローカルキューにロールバックします。

アプリケーション/サービスは、メッセージを処理するためにマルチスレッド化されます

メッセージ処理チェーンで順序を保持する必要がある場合を除いて、これは問題ありません。順序付けされた処理が必要な場合は、順序付けを再適用するための再シーケンサーを実装せずに複数のスレッドを作成することはできません。

MSMQを個別にホストして、x台のサーバーでそのキューを共有できると思いましたか?

メッセージの交換に参加したいすべてのサーバーには、MSMQがインストールされています。その後、各サーバーは他のサーバー上の任意のキューに書き込むことができます。

私が考えた理由は、サーバーがダウンした場合はどうなるのでしょうか。次に、メッセージはどのようにMSMQに送受信されますか

キューがトランザクションである場合、それはそれらのメッセージがディスクに永続化されることを意味します。サーバーがダウンした場合、サーバーが復旧してもメッセージはまだそこにあります。サーバーがダウンしている間は、明らかにメッセージの交換に参加できません。ただし、メッセージは引き続きそのサーバーに「送信」できます。宛先サーバーがオンラインに戻るまで、メッセージは送信者に対してローカルのままです(一時キュー内)。

したがって、中央のMSMQサーバーを1つ持つ(そしてミラーリング/フェイルオーバーする)ことで、稼働時間の保証が得られます。

メッセージキューを使用することの全体的なポイントは、フォールトトレラントなトランスポートであるため、稼働時間を保証する必要がないことです。100%の可用性がある場合、メッセージキューを使用する理由はほとんどありません。

着信メッセージはどのようにWCFに通知されますか?

各サービスは、独自のローカルキューでリッスンします。メッセージが到着すると、WCFランタイムにより、処理メソッドが呼び出され、メッセージが処理されます。

メッセージ送信の失敗はどのようにサービスに通知されますか

ServiceAがServiceBへのメッセージの送信に失敗した場合、ServiceBにその失敗が通知されることはありません。また、そうすべきではありません。ServiceAは、ServiceBではなく、送信の失敗を処理します。この場合の期待は、サービス間のハードカップリングを作成します。これは、メッセージキューによって削除されるはずです。

于 2012-04-20T11:05:26.330 に答える
0

MSMQは、サービスを一時的にシャットダウンしたり、コンピューターを再起動したりしても、メッセージを保存できます。
WCFの主な目的は、送信元から宛先へのメッセージの転送です。輸送手段は関係ありません。あなたの場合、MSMQはWCFのトランスポートであり、クライアントとサービスの両方を同時にオンライン/利用可能にすることは明らかではありません。ただし、メッセージを受信した場合、メッセージの送信にどのトランスポートが使用されたかに関係なく、メッセージを正しく処理するのはユーザーの責任です。

于 2012-04-20T10:42:35.253 に答える