2017-01-20 23 views
1

我有一個ASP.NET Web應用程序使用跨5-6個搜索服務(不同的客戶端在不同的定價層)30-40不同的搜索索引。使用靜態字典30-40 ISearchIndexClients使用AzureSearch SDK的影響

目前我封送ISearchServiceClient其次是適當ISearchIndexClient針對特定指數的一個新的實例所需的基於客戶端進行調用上。

在努力提高性能,我想編組了所有的ISearchIndexClients在應用程序啓動,並將它們放置到一個Dictionary對象:

public static Dictionary<String, SearchIndexClient> SearchIndexes; 

使任何具體指標,可以直接調用從靜態字典和使用像這樣:

SearchIndexes["IndexName"].Documents.Search(searchText, searchParameters); 

我希望這將加快查詢和索引更新時間尤其是在「熱」索引。我擔心的是,這可能會導致內存泄漏,性能問題和其他未知數。

使用靜態可SearchServiceClientSearchIndexClient我還沒有看到任何的例子讓我有點不安這種方法向前發展。我向社區提出的問題是:

  1. 我的計劃聽起來是什麼?
  2. 它會真的提高性能嗎?
  3. 有什麼缺點或含義(如果有的話)
  4. 如果索引量隨着時間增加(例如60-70),那麼我是否會開始看到缺點呢?
  5. 難道更有意義的SearchServiceClients集結成一本字典,並從那裏連接到相應的SearchIndexClient需要像這樣:

    public static Dictionary<String, SearchServiceClient> SearchServices; 
    
    var searchIndexClient = SearchServices["ServiceName"].Indexes.GetClient("IndexName"); 
    searchIndexClient.Documents.Search(searchText, searchParameters); 
    

回答

1

這種策略可能不會擴大到你想要的索引數量。最可能的結果是,您將耗盡可用的TCP連接池。更好的方法是實現由索引名稱鍵入的SearchIndexClient實例的緩存。在高速緩存未命中時,您可以獲得對最近最少使用的客戶端的獨佔訪問權限,並在其上調用TargetDifferentIndex。正是這種情況下,該方法被添加到SearchIndexClient

您可以在GitHubMSDN forumsthis related StackOverflow question上找到關於共享SearchIndexClients的影響的更多討論和背景信息。

+0

謝謝布魯斯。對於每個SearchServiceClient緩存單個SearchIndexClient並在其使用時調用TargetDifferentIndex的想法如何?這樣,我只需要緩存每個服務的一個IndexClient,並將每個請求所需的索引作爲目標。如果這是一個好方法,我應該在重定目標之前檢查它設置的索引(以防它已經是我需要的索引)? – CodeAbundance

+0

我也想知道,如果我只是留在我現在的編組新的SerchServiceClient + SearchIndexClient的方法,如果我會遇到任何問題的規模。現在,這對我來說工作得很好,而且我可能會對錶演感到滿意,直到我有足夠的客戶來保證重新訪問。如果我只是爲了增加複雜性而只取得最小的性能收益,那麼我可能會拖延,直到我的應用程序增長。不管:在這兩種情況下,我的(System.Net.ServicePointManager.DefaultConnectionLimit爲12 * Environment.ProcessorCount)是否仍然幫助我?感謝讚賞! – CodeAbundance

+0

TargetDifferentIndex影響非常小,所以在不需要時調用它可能不是什麼大問題(只要確保不要從多個線程同時調用它)。增加連接池的大小也可以提供幫助,但套接字不是免費的。最終,你最瞭解自己的應用程序和工作負載,所以我鼓勵你進行實驗。 –