Последствия использования AzureSearch SDK со статическим словарем из 30-40 ISearchIndexClients

У меня есть веб-приложение ASP.NET, которое использует 30-40 различных поисковых индексов для 5-6 поисковых служб (различные клиенты находятся на разных уровнях ценообразования).

В настоящее время я выполняю маршалинг нового экземпляра ISearchServiceClient, за которым следует соответствующий ISearchIndexClient для конкретного индекса, необходимого для клиента, выполняющего вызов.

Чтобы повысить производительность, я думал о том, чтобы упорядочить ВСЕ из ISearchIndexClients при запуске приложения и поместить их в объект Dictionary:

public static Dictionary<String, SearchIndexClient> SearchIndexes;

так что любой конкретный индекс может быть вызван непосредственно из статического словаря и использован следующим образом:

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

Я надеюсь, что это ускорит время запроса и обновления индекса, особенно для "горячего" индекса. Я обеспокоен тем, что это может привести к утечкам памяти, проблемам с производительностью и другим неизвестным.

Я не видел ни одного примера использования статически доступного SearchServiceClient или SearchIndexClient, поэтому мне немного неловко идти вперед с этим подходом. Мои вопросы к сообществу:

  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 экземпляры с ключом по имени индекса. В случае отсутствия кэша вы можете получить эксклюзивный доступ к наименее недавно использованному клиенту и установить для него свойство IndexName. Это устанавливаемое свойство было добавлено к SearchIndexClient именно для этого сценария (обратите внимание, что он заменяет устаревший TargetDifferentIndex метод).

Вы можете найти больше обсуждений и справочной информации о последствиях обмена SearchIndexClients на GitHub, форумах MSDN, и этот связанный вопрос Stackru.

Другие вопросы по тегам