使用AzureSearch SDK与30-40 ISearchIndexClients的静态字典的含义

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

目前,我正在编组一个新的ISearchServiceClient实例,然后根据发出调用的客户端为所需的特定索引提供相应的ISearchIndexClient

为了提高性能,我考虑在应用程序启动时整理所有ISearchIndexClients并将它们放入Dictionary对象:

public static Dictionary SearchIndexes; 

这样就可以直接从静态字典中调用任何特定的索引并像这样使用:

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

我希望这会加快查询和索引更新时间,特别是在“热门”索引上。 我担心的是,这可能会引入内存泄漏,性能问题和其他未知因素。

我没有看到使用静态可用的SearchServiceClientSearchIndexClient的任何示例,所以我对这种方法有点不安。 我对社区的问题是:

  1. 我的计划听起来不错?
  2. 它实际上会提高性能吗?
  3. 有什么缺点或影响(如果有的话?)
  4. 如果指数的数量随着时间的推移而增加(例如60-70),那么我会开始看到弊端吗?
  5. SearchServiceClients编组到字典中并根据需要从那里连接到相应的SearchIndexClient会更有意义:

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

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

您可以在GitHub , MSDN论坛以及此相关的StackOverflow问题上找到有关共享SearchIndexClients的含义的更多讨论和背景信息。