質問

マイシステムは、別々のハンドラでコマンドパターンを使用します。私のコマンドは、現在すべてのコマンド内のプロセスを処理するコマンドサービスに対して実行されます。

私は、遅い操作であるこれらのもののうち少なくとも1をする特定のコマンドを持っています:

  1. メールを送信します。
  2. PDF
  3. を生成
  4. faxを送信
  5. サードパーティのWebサービスと対話する
  6. UIがよりスナッピーするように、これらのコマンドのすべてがプロセスから処理されるようにしたいです。

    これらのコマンドのためだけにメッセージングバスを使用するか、プロセスコマンドハンドラ呼び出しBeginInvoke()を持っている必要がありますか?

    編集 - 追加情報

    システムには少数のユーザーがあります(たぶん100の協力は忙しい一日に並行して)、キューは非常に長くなる可能性があります。ここでの主なことは、添付のPDF(問題のコマンド)の電子メールを送信するときにUIがブロックされる時間を短縮することです。従業員はそのコマンドを1日に何度も実行する必要があります。

    状況全体を念頭に置いて、私は今いくつかの理由でBeginInvoke()と一緒に行くつもりだと思います:

    1. すべてのUIインタラクションは、コマンドが成功したかのように振る舞うように触れる必要があります。 「この文書を送信する必要がある」というリマインダーは、UI内の複数の場所にあり、レポートが送信されるとフルページの更新が行われます。
    2. それは私の顧客の忙しいシーズンの真ん中です(彼らは夏の年間の年間ビジネスの50%以上にします)ので、私が全く新しいインフラストラクチャを紹介するために私にとって賢くは思われません。管理に不慣れな
    3. しかし、私が今知っているのを知っているのは、新しいシステムで、遅いコマンドのget-goからサービスバスを使用します(ほぼすべてのシステムは電子メールを送る必要があります)、コマンドがより簡単にできるようにUIを設計する同期から非同期処理に切り替えます。実装では、基本的にすべての投稿がAJAXであり、あたかも成功したかのようにUI内のアクションを実行します。 (これの例については、Facebookをコメントを処理する方法をチェックしてください。)

役に立ちましたか?

解決

両方の解決策は彼らの長所と短所を持っています。

  • BeginInvokeは致命的な単純なソリューションで、その意味は直接コマンドでハンドラを呼び出すだけです。しかし、このソリューションはスレッドインフラストラクチャに依存します。最大スレッド番号、IOリソースへの同時アクセスのため、凍結スレッド。
  • MessageBusは非常に柔軟で強力なソリューションで、コマンド処理プロセスのあらゆる側面を制御できます。しかし、それはあなたのアプリケーションへの別の抽象化レイヤーを紹介します。

システムのロード要件、これらの背景タスクの数、増大する要素などの数、成長因子などを推定することをお勧めします。

しかし私の個人的な意見では、症例の80%のバスソリューションを紹介します。必要に応じて次の反復を延ばすことが可能である素朴なバス実装を紹介できます。

他のヒント

それはおそらく、メッセージバスに向かってあなたをプッシュする信頼性の問題です。あなたの元のトランザクション(BeginInvokeが成功させたこと)が成功した場合、サーバーがクラッシュすることを通して、あなたの呼び出しを通して中間になった場合、あなたのシステムはそれがまだ電子メールを送るかPDFを生成する必要があるメモリを持たないでしょう。。

メッセージバスは、サーバが再度起動したときに、それが電子メールを送信するようになるように、その2番目のトランザクションをキューにロールバックすることができるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top