このアーキテクチャ ( http://www.devx.com/enterprise/Article/39015 )に基づいて、MSMQ を使用して Reliable WCF Service を実装しようとしています。
キューが使用できない場合、メッセージが失われる可能性があります (クラスターがゼロ ダウンタイムを提供しない場合でも)。
簡単な注文処理ワークフローを見てみましょう
ユーザーがクレジット カードの詳細を入力して支払いを行う
アプリケーションは、支払いゲートウェイから成功の結果を受け取ります
アプリケーションは、WCF MSMQ バインディングによるバックエンド サービスへの「ファイア アンド フォーゲット」/「一方向」呼び出しとしてメッセージを送信します。
ユーザーは「成功」ページにリダイレクトされます
メッセージはリモート トランザクション キュー (Windows クラスター) に格納されます。
バックエンド サービスはメッセージをデキューして処理し、複雑な注文処理ワークフローを完了して、その結果、確認メールをユーザーに送信します。
例外として、すべてが正常に見えます。
すべての「一方向」通話がキューに配信されることをどのように保証できますか ユーザーはできるだけ早く結果の Web ページにリダイレクトする必要があるため、二重通信は当てはまりません。
ユーザーが「...支払いが行われ、注文の処理が開始されました。後で通知をメールで送信します...」という文言の「成功」ページを受け取ったが、メッセージ自体が失われた場合を想像してみてください。
ステップ 3 でどの程度の耐久性を実装できますか?
私が見ることができる可能な解決策の1つは
3a. トランザクションに関する記録を保持するためだけに、トランザクションの詳細が未完了としてマークされたデータベース レコードを作成します。このレコードは、メッセージがキューに保存されない場合に失われたメッセージを処理するための開始点として使用できます。
この投稿を読みました
トランザクション MSMQ について理解しておくべき主な点は、リモート キューへのトランザクション送信には 3 つの異なるトランザクションが関係していることです。
- 送信者はメッセージをローカル キューに書き込みます。
- 送信側マシンのキュー マネージャーは、ネットワークを介してメッセージを受信側マシンのキュー マネージャーに送信します。
- 受信側サービスはキュー メッセージを処理し、メッセージをキューから削除します。
しかし、説明されている問題は解決しません-WCF netMsmqBinding はローカルキューを使用してメッセージをリモートキューに送信しないことを知っているためです。