カスタムコードに基づくRESTサービスをWeb APIに変換する作業があります。このサービスはかなりの量の要求を持ち、ロードに時間がかかる可能性があるデータに対して動作しますが、ロードされるとキャッシュされてすべての着信要求を処理するために使用されます。以前のバージョンのサービスでは、データのロードとキャッシュへのロードを担当する1つのスレッドがあります。 IISがワーカースレッドを使い果たしないようにするために、クライアントはキャッシュが準備されるまで「後で戻ってくる」応答を得るでしょう。Web APIの並行性とスケーラビリティ
Web APIを理解すると、タスクを操作することで非同期動作が組み込まれているため、要求数は保持されている物理スレッドの数に直接関係しません。
サービスの新しい実装では、キャッシュが準備ができてから有効な応答が出るまでリクエストを待機させる予定です。私が説明するために、コードの非常にラフスケッチをした:
public class ContactsController : ApiController
{
private readonly IContactRepository _contactRepository;
public ContactsController(IContactRepository contactRepository)
{
if (contactRepository == null)
throw new ArgumentNullException("contactRepository");
_contactRepository = contactRepository;
}
public IEnumerable<Contact> Get()
{
return _contactRepository.Get();
}
}
public class ContactRepository : IContactRepository
{
private readonly Lazy<IEnumerable<Contact>> _contactsLazy;
public ContactRepository()
{
_contactsLazy = new Lazy<IEnumerable<Contact>>(LoadFromDatabase,
LazyThreadSafetyMode.ExecutionAndPublication);
}
public IEnumerable<Contact> Get()
{
return _contactsLazy.Value;
}
private IEnumerable<Contact> LoadFromDatabase()
{
// This method could be take a long time to execute.
throw new NotImplementedException();
}
}
は、コードの設計では、あまりにも多くの価値を入れないでください - 唯一の問題を説明するために構築し、我々はそれをやったかではありません実際の解決策。 IContactRepositoryは、IoCコンテナにシングルトンとして登録され、コントローラに注入されます。 Lazy Lazy with LazyThreadSafetyMode.ExecutionAndPublicationは、最初のスレッド/要求が初期化コードを実行していることを保証します。初期化が完了するまで、次のrquestsはブロックされます。
Web APIは、初期化が完了するのを待っている1000個の要求を処理できますが、このLazyに当たっていない他の要求はサービスであり、IISではワーカースレッドが不足していませんか?