私はかなり普通の Web サービス (古い学校の asmx) を持っています。メソッドの 1 つは、クライアントに返される結果に関係のない非同期処理を開始します。うまくいけば、以下の小さなスニペットが理にかなっています。
[System.Web.Services.WebMethod]
public List<Foo> SampleWebMethod(string id)
{
// sample db query
var foo = db.Query<Foo>("WHERE id=@0",id);
// kick of async stuff here - for example firing off emails
// dont wait to send result
DoAsyncStuffHere();
return foo;
}
DoAsyncStuffHere メソッドの最初の実装では、ThreadPool.QueueUserWorkItem を利用しました。したがって、次のようになります。
public void DoAsyncStuffHere()
{
ThreadPool.QueueUserWorkItem(delegate
{
// DO WORK HERE
});
}
このアプローチは、低負荷条件下でうまく機能します。ただし、かなりの高負荷に耐えられるものが必要です。したがって、生産者/消費者のパターンが最善の方法のようです。
私が混乱しているのは、Web サービスのすべてのインスタンスで、キューによって実行されるすべての作業を単一のスレッドに制限する方法です。Web サービスの任意のインスタンスがアクセスできる単一のキューを設定するにはどうすればよいでしょうか?