Последствия использования 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, поэтому мне немного неловко идти вперед с этим подходом. Мои вопросы к сообществу:
- Мой план обоснован?
- Будет ли это на самом деле увеличить производительность.
- Каковы недостатки или последствия (если есть?)
- Если количество индексов увеличивается со временем (например, до 60-70), я начну видеть недостатки?
Будет ли более разумным объединить 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.