2012-04-20 7 views
2

MSMQまたはWCFの専門家ではなく、私はそれについて公正なビットを読み上げました。 私は何かを開発しようとしていますが、最初は堅牢で耐久性のある理論が必要です。MSMQ、WCFおよび堅牢性

MSMQ別のサーバーでホストされているようです。

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

正しい構成(メッセージが失われることはありません)、正確に1回送信できるので、メッセージが重複することはありません。

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

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

ここではアドバイスと詳細をお待ちしております。取るにはかなりの量があり、WCF/MSMQは非常に多くのオプションを公開しています。

+0

代わりにトランザクションを使用することができます。何か問題が生じた場合でも、クラッシュが発生する前にすべてのメッセージが送信されるか、送信されません。 – Milee

答えて

9

あなたの仮定:

MSMQ私が推測するには、別々のサーバー上でホストされます。

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

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

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

たとえば、ServiceAにはローカルキューがあり、そこから読み込みます。 ServiceBにはローカルキューもあります。 ServiceAがServiceBを呼び出す場合、ServiceBのローカルキューにメッセージが書き込まれます。私は右の設定で理解

は、我々はこれが正しいか(何もメッセージが紛失されていない)

それがトランザクションできるように システムを持つことができます。これは、MSMQがstore-and-forwardというメッセージングパターンを使用するためです。説明はhereを参照してください。

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

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

アプリケーション/サービスは、これを使用すると、メッセージ処理チェーンに保存するために必要な場合を除いて結構ですメッセージ

を処理するためにマルチスレッド化されます。注文処理が必要な場合は、注文を再適用するために再シーケンサーを実装せずに複数のスレッドを持つことはできません。

私はMSMQを別にホストすることができ、x台のサーバーがそのキューを共有できると考えました そのキューはありますか?

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

私の考えの理由は、サーバーがダウンするとどうなるのでしょうか?キューは、それらのメッセージはディスクに永続化されていることを意味し、その後取引されている場合 はその後、メッセージが送信されますどのように/ MSMQ

に受け取りました。サーバがダウンした場合には、それが復旧したときにメッセージはまだそこにあります。サーバーがダウンしている間は、明らかにメッセージの交換に参加することはできません。ただし、メッセージはそのサーバーに "送信"することができます。送信先サーバーがオンラインに戻るまでは、送信者のローカル(一時的なキュー内)のままです。そうつの中央MSMQサーバを有することによって

次いでのguarenteeが存在するであろう(そして、それを有するが/フェイルオーバーミラー)

稼働時間

それはフォールトトレラント輸送だされるメッセージキューイングを使用しての全体のポイント、アップタイムを保証する必要はありません。可用性が100%の場合、メッセージキューを使用する理由はほとんどありません。

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

各サービスは、それぞれ独自のローカルキューでリッスンします。メッセージが到着すると、WCFランタイムにより、処理メソッドが呼び出され、メッセージが処理されます。サービスはサービスAがServiceBにメッセージを送信するために失敗した場合は、ServiceBはその失敗が通知されることはありませんメッセージ

を送るの失敗が通知されますか

。それもそうではありません。 ServiceAは、ServiceBではなく、送信失敗を処理します。この場合の期待は、メッセージキューイングが取り除くことになっているサービス間のハード結合を作り出します。

+0

ありがとう!私はそれを感謝します。私はMSMQが別々にホストされ、xサーバがそのキューを共有していると思ったのですか?私の考えの理由は、サーバーがダウンするとどうなるのだろうか?次に、メッセージをMSMQに送受信して、サービスが読み書きできる状態にします。 WCF Servicesと同じサーバー上にホストされている場合は、そのサーバーがダウンするとどうなりますか?どのようにしてそれをキューに読み書きすることができるので、1つのセントラルMSMQサーバー(およびミラー化/フェイルオーバー)を持つことによって、稼働時間が保証されます。 –

+0

私はこれを調べていませんが、着信するメッセージはどのようにWCFに通知されますか? Windowsサービス/コンソールアプリケーションを作成して、適時にキューを検索し、メッセージを取得し、WCFサービスを呼び出す必要がありますか?どのように機能するのですか?メッセージの送信失敗または新しいメッセージがMSMQに到着したときに、サービスにどのように通知されますか? –

+0

私の更新を参照してください –

0

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

関連する問題