2012-04-16 13 views
12

カスタムコードに基づく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ではワーカースレッドが不足していませんか?

答えて

10

アクションからTask<T>を返すと、コードがバックグラウンドスレッド(ThreadPool)上で実行され、IISスレッドが解放されます。したがって、この場合には、私はがそうでなければ、スレッドはただ座って何もしないだろうタスクを開始し返すことを忘れないでください

public Task<IEnumerable<Contact>> Get() 

public IEnumerable<Contact> Get() 

を変更します。

遅延実装は便利ですが、Web APIの動作とはほとんど関係がありません。だから、私はそれについてコメントするつもりはない。遅延の有無にかかわらず、タスクベースの戻り値の型は、長時間実行される操作の方法です。

これにはおそらく便利な2つのブログ投稿があります:herehereです。

関連する問題