2016-10-26 24 views
1

私は、Entity Frameworkを使用してデータベース内の一部のエンティティを更新するASP.Net Web Apiアプリケーションを用意しています。特定のものが更新されると、更新されたAzureサービスバスのキューにそれを公開し、それを他のシステムで取得して処理する予定です。Web APIからのメッセージキューへの公開

Web APIからキューにメッセージを追加するプロセスを開始する方法があまりよく分かりません。私はapiで応答を返した後、あまりコードを実行するかどうか、あるいはおそらくイベントを発生させるかどうかわからないので、あまりにも多くのことをすることができないことを知っています。しかし、私はメインキューにメッセージを追加するためのメッセージキューを持っていません。

私はこれがユーザーへの応答時間に影響しないようにするため、非同期にしたいと思っています。何か案は?

+0

私はAzure Service Busに精通していませんが、どのESBソリューションでも非同期イベントを処理できるはずです。おそらく、これがあなたの問題の解決策になるかもしれません:http://stackoverflow.com/questions/15612407/azure-servicebus-async-to-be-or-not-to-be#15614417 – Vyrira

+0

@Vyriraありがとうございます。キューにメッセージを追加するコードを取得しました。私はそれが応答時間に影響を与えたくなければ、Web APIからコードを呼び出す最良の方法は何かを考えています。 – ADringer

+0

最も単純な方法は、 'Task.Run(()=> {});'の中にメッセージを送り、それを待たないコードを置くことです。または、コードが既にタスクを返す場合は、それを待ってはいけません。ただし、これは最適なソリューションではありません。http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html – peco

答えて

0

マイクロソフトでは、the Azure Centerにデザインパターンと参照アーキテクチャに関する素晴らしいリンクをいくつか掲載しています。

ユーザーの応答に影響を与えたくない場合は、メッセージをサービス内部キューにダンプし、そのメッセージを別のワーカーのサービスバスに送信します。メッセージの配信が不可欠な場合は、データを保存して必要に応じて再訪問できるため、これはおそらく良い戦略です。

あなたは応答時間に影響を与えたくないと言っていますが、HTTPコントローラアクションの一部としてメッセージを配信したいと思っています。

  1. あなたのAPIはAzureキューに関してインストールされていますか?どちらもAzureにいる?サービスは同じ場所にありますか?
  2. Azure Service Busへの配信が失敗した場合、呼び出し元に通知する必要がありますか?
  3. サービスバスへの通知の結果に依存するコントローラ内の処理はすべて実行していますか?
  4. 再試行する必要がありますか?

#1が「はい」と似ている場合は、タスク内のサービスバスに投稿アクションをラップして、そのタスクの結果に基づいて自分の結果を判断することができます他のどの処理を行っているかなど)。複数のシナリオがあり、#1がyesの場合は、共通のインターフェイスを実装する2つのモジュールを持つことを検討できますが、本質的に異なる(インストール)シナリオには戦略パターンを使用します。

Azureと共同設置されている場所以外の場所にいる場合は、ローカルキューを使用してメッセージを公開し、ある種のワーカーを育てることを検討する価値があります。そのキューのメッセージを処理します。これは、ユーザーエクスペリエンスと信頼性のトレードオフを提供します。

これが役に立ちます。

関連する問題