1

我有一个 ASP.NET Web 应用程序,它在 5-6 个搜索服务中使用 30-40 个不同的搜索索引(各种客户端处于不同的定价层)。

目前,我正在编组一个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);
    
4

1 回答 1

2

此策略可能无法扩展到您想要的索引数量。最可能的结果是您将耗尽可用 TCP 连接池。更好的方法是实现SearchIndexClient由索引名称键入的实例缓存。在缓存未命中时,您可以获得对最近最少使用的客户端的独占访问权并在其上设置IndexName属性。该可设置属性被添加到SearchIndexClient这个场景中(注意它替换了不推荐使用的TargetDifferentIndex方法)。

SearchIndexClients您可以在GitHubMSDN 论坛这个相关的 StackOverflow 问题上找到更多关于共享影响的讨论和背景信息。

于 2017-01-20T18:31:41.927 回答