5

私は非常に大きなアプリケーションを構築することを計画しています (機能ではなく、同時ユーザー/リクエスト数の点で大きい)。

基本的に、コマンドが実行されるのを待っているサービスをどこかに用意し、後で完了を確認します。このサービスはサービス バスを使用して通信し、確認メッセージが発行される前に実行を最終的に行います。

このサービスのコンシューマーは、あらゆる種類のアプリケーション (WPF、SL、...) にすることができますが、私のメイン (および最初の) クライアントは、asp.net MVC アプリケーション + WebApi (.Net 4.5) または MVC のみ (.Net 4.0 ) ajax コントローラー アクションを使用します。

Web アプリケーションは、Ajax 呼び出しに依存して、ユーザー フレンドリーな応答性の高いアプリケーションを維持します。

私はこのような完全な非同期アーキテクチャにまったく慣れていないため、将来の頭痛の種を避けるためにいくつか質問があります。

  • 私の Web API 呼び出しには時間がかかる場合があります。長時間実行される操作 (ある種の非同期?) をサポートするために、API を適切に設計するにはどうすればよいですか? 新しい async キーワードについて読んだことがありますが、知識のために、背後にあるものを理解したいと思います。
  • サービスへの私の呼び出しは、メッセージを公開し、ack メッセージを待つことで構成されます。これを単一のメソッドにラップする場合、このメソッドをどのように記述すればよいですか? ACK を受信するまで「ブロック」する必要がありますか (すべきではないと思います)。Task オブジェクトを返して、消費者に決定させるべきですか?
  • また、SignalR が役立つかどうかも疑問です。signalR を使用すると、実際の「ファイア アンド フォーゲット」コマンドを発行して、クライアントにルーティングしてメッセージを確認できると思います。
  • 私は完全に話題から外れていますか?別のアプローチを取るべきですか?

実装の詳細/フレームワークに関しては、次を使用すると思います。

  • メッセージング システムとしての Rabbitmq
  • メッセージング システムを抽象化する Masstransit
  • UIを構築するためのasp.MVC 4
  • コマンド発行をUIコントローラーから分離し、他の種類のクライアントがコマンドを発行できるようにするWebapi
4

2 に答える 2

2

私の Web API 呼び出しには時間がかかる場合があります。長時間実行される操作 (ある種の非同期?) をサポートするために、API を適切に設計するにはどうすればよいですか?

あなたがどこに向かっているのか、私には100%確信が持てません。あなたは Async について質問しますが、RabbitMQ と MassTransit を投入して、メッセージ キューイングについても言及します。メッセージ キューイングは、既定では非同期です。

コマンドの実行についても言及しています。CQRS について言及している場合は、コマンドとクエリを分離します。しかし、私が 100% 言っているわけではないのは、「長時間実行されるプロセス」について言及するときに言及しているものです。

  • データをクエリするとき、データは既に存在している必要があります。できれば、目前の質問に必要な方法で。
  • データをクエリするときは、長時間実行プロセスを開始しないでください
  • コマンドを実行すると、長時間実行プロセスを開始できます。しかし、それがメッセージ キューイングを使用する必要がある理由です。長時間実行されるプロセスを開始するタスクを指定し、それに対するメッセージを作成し、それをキューに投入して、完全に無視します。バックグラウンドの他のプロセスがそれを取得します。
  • コマンドを実行すると、長時間実行プロセスを開始できます。
  • コマンドを実行すると、データベースをデータで更新できます
  • このデータは、誰かがデータを要求した場合に API で使用できます

このモデルを使用する場合、長時間実行プロセスが完了するまでに最大 10 分かかる場合がありますが、問題ではありません。データベースのロックを含め、実際に 1 つのスレッドが完了するまでに最大 10 分かかることについては詳しく説明しませんが、要点を理解していただければ幸いです。メッセージをキューに投入すると、ほぼ瞬時に API が解放されます。そこに非同期は必要ありません。

サービスへの私の呼び出しは、メッセージを公開し、ack メッセージを待つことで構成されます。

わかりません。.NET Framework とキュー プラットフォームがこれを処理します。なぜあなたはACKを待つのですか?

大量輸送中

Bus.Instance.Publish(new YourMessage{Text = "Hi"});

NServiceBus で

Bus.Publish(new YourMessage{Text = "Hi"});

また、SignalR が役立つかどうかも疑問です。

そう思うはずです!メッセージングの非同期性のため、ユーザーは更新を「待つ」必要があります。SignalR を介してユーザーに更新を「プッシュ」することでこのデータを提供できれば、なおさらです。

私は完全に話題から外れていますか?別のアプローチを取るべきですか?

たぶん、あなたがどこに向かっているのか、私はまだよくわかりません。おそらく、次のリソースを読んでください。

資力:

http://www.udidahan.com/2013/04/28/queries-patterns-and-search-food-for-thought/ http://www.udidahan.com/2011/10/02/why-you- should-be-using-cqrs-almost-everywhere%E2%80%A6/ http://www.udidahan.com/2011/04/22/when-to-avoid-cqrs/ http://www.udidahan. com/2012/12/10/service-oriented-api-implementations/

http://bloggingabout.net/blogs/dennis/archive/2012/04/25/what-is-messaging.aspx http://bloggingabout.net/blogs/dennis/archive/2013/07/30/partitioning-data -through-events.aspx http://bloggingabout.net/blogs/dennis/archive/2013/01/04/databases-and-coupling.aspx

于 2013-11-25T07:29:18.570 に答える
2

私の Web API 呼び出しには時間がかかる場合があります。長時間実行される操作 (ある種の非同期?) をサポートするために、API を適切に設計するにはどうすればよいですか? 新しい async キーワードについて読んだことがありますが、知識のために、背後にあるものを理解したいと思います。

Async に関しては、stackoverflow に関する別の質問でこのリンクが推奨されているのを見ました。

http://msdn.microsoft.com/en-us/library/ee728598(v=vs.100).aspx

ASP .NET アプリケーションに対して要求が行われると、制限されたスレッド プールからの要求を処理するためにスレッドが割り当てられます。

非同期コントローラ アクションは、追加の要求を受け入れる準備ができるように、スレッドをスレッド プールに解放します。アクション内で、非同期で実行する必要がある操作は、コールバック コントローラー アクションに割り当てられます。

非同期コントローラー アクションは Async を接尾辞として使用して名前が付けられ、コールバック アクションには Completed 接尾辞が付いています。

public void NewsAsync(string city) {}
public ActionResult NewsCompleted(string[] headlines) {}

Async をいつ使用するかについて:

一般に、次の条件が当てはまる場合は、非同期パイプラインを使用します。

  • 操作は、CPU バウンドではなくネットワーク バウンドまたは I/O バウンドです。
  • テストでは、ブロック操作がサイト パフォーマンスのボトルネックであり、IIS が
    これらのブロック呼び出しに対して非同期アクション メソッドを使用することで、より多くの要求を処理できることが示されています。
  • 並列処理は、コードの単純さよりも重要です。
  • ユーザーが実行時間の長いリクエストをキャンセルできるメカニズムを提供したいと考えています。

ASP .NET MVC と Web API を使用してサービスを開発し、必要に応じて非同期コントローラーを使用することは、可用性の高い Web サービスを開発するための良いアプローチになると思います。

ServiceStack のようなメッセージ ベースのサービス フレームワークを使用するのも良さそうです。

http://www.servicestack.net/

その他のリソース:

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx http://www.codethinked.com/net-40-and-systemthreadingtasks http://dotnet.dzone.com/news/net-ゾーンの進化 http://www.aaronstannard.com/post/2011/01/06/asynchonrous-controllers-ASPNET-mvc.aspx http://channel9.msdn.com/Events/TechDays/Techdays-2012-the- Netherlands/2287 http://www.dotnetcurry.com/ShowArticle.aspx?ID=948 // パフォーマンス テストのセットアップも表示 http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous- Methods-in-aspnet-mvc-4 http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx http://hanselminutes.com/327/everything- net-programmers-know-about-asynchronous-programming-is-wrong http://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx

于 2013-11-24T09:18:27.210 に答える