Поисковая система на микросервисах

Краткий тезисный перевод статьи «Поисковая система на микросервисах: технологический стек». Статья мне понравилась наличием плюсов и минусов различных подходов.

Автор рассматривает два архитектурных подхода к реализации поисковой системы в микросервисной архитектуре:

  1. Слой абстракции над каждым репозиторием (свой поиск в каждом микросервисе);
  2. Отдельная поисковая система.

Свой поиск в каждом микросервисе

Плюсы

  • Не надо поддерживать отдельный поисковый сервис,
  • Не надо дублировать данные в отдельную базу поискового сервиса,
  • Единое место для обработки ошибок поиска в непосредственной близости от репозитория,
  • При изменении микросервиса и/или данных, изменения сразу отражаются в результатам поиска.

Минусы

  • Накладные расходы на индексы в каждом репозитории,
  • У каждого поиска свой контекст. При сложном поиске необходимо «склеивать» данные из нескольких контекстов,
  • Фильтрация на стороне сервиса-клиента, отправляющего много запросов к разным сервисам, что расходует процессорное время,
  • Для каждого символа, вводимого пользователем, необходимо обращение к нескольким сервисам,
  • Сложность обеспечения релевантности результатов поиска (оценка релевантности, сортировка, количество элементов в результатах для различных сервисов).
Реализация

В этом подходе поисковая система и управление ей идет в рамках самих микросервисов и разрабатывается самостоятельно.

В статье примера реализации нет.

Отдельная поисковая система

Отдельная поисковая система

Плюсы

  • Отдельную систему поиска проще поддерживать и проще обеспечить требуемый SLA до некоторого уровня,
  • Быстрые запросы к базе данных ,
  • Ниже нагрузка на основные сервисы (User service, Store service…),
  • В отдельную систему проще вносить изменения,
  • Проще реализовать мониторинг и аналитику по логам,
  • В отдельной системе можно реализовать локализацию и проверку правописания.

Минусы

  • Надо создать отдельный сервис и базу данных для него,
  • Событийная природа интеграции в микросервисах приведет к временнОй задержке между появлением данных в микросервисах и в базе данных поиска,
  • Потребуется дублирование данных, что влияет на стоимость владения инфраструктурой,
  • Потребуется дополнительный инфраструктурный слой для наполнения БД поиска (очереди, брокеры, хранилища).
Реализация

Можно взять готовые решения для поискового движка и для доставки данных в поисковую систему

Готовые решения для поискового движка

Список инструментов

Сравнение инструментов

Готовые решения для доставки данных в поисковую систему

Список инструментов

Сравнение инструментов

Архитектура с использованием Elastic Search и RabbitMQ

Автор выбрал Elastic и RabbitMQ и рассмотрел два вариант помещения данных в базу поисковой системы:

  • Микросервисы обращаются к RabbitMQ напрямую;
  • Каждый микросервис вызывает поисковый сервис, который сам общается с RabbitMQ.

Каждый микросервис обращается к RabbitMQ напрямую

RabbitMQ и Logstash
Плюсы
  • Ниже накладные расходы на поисковый сервис,
  • Данные не будут потеряны, если поисковый сервис недоступен.

Минусы

  • Для помещения данных в Elastic необходимо ввести инстумент обработки данных (Log Stash).

Каждый микросервис вызывает поисковый сервис, который сам общается с RabbitMQ

Плюсы

  • Поисковая система сама принимает решение о том, какие данные следует добавлять в базу данных,
  • Изменения в одном месте применяются в результатам поиска для всех микросервисов разом,
  • Не надо поддерживать Log Stash или иной инструмент обработки данных.

Минусы

  • Если поисковый сервис окажется недоступным, изменения в данных за время недоступности будут утеряны,
  • Обработка данных может негативно сказаться на скорости поиска.

Послесловие

Если развивать мысль дальше, то можно уйти в CQRS/ES и дальше/глубже, однако, описанного подхода может быть вполне достаточно для большинства случаев.

«Поисковая система на микросервисах», ссылка на MindMap статьи

UPD. Дополнение от Филиппа Дельгядо.

Выборки нужны или людям или компьютерам. Людям не нужны большие выборки, но нужны всякие обогащения справочников и сортировки. Компьютерам нужны большие выборки, но важнее идентификаторы, а сортировку они и сами сделают. Поэтому реализация поисковых запровов для этих сценариев должна быть разной.

Я в свое время писал алгоритм «какую стратегию реализации поискового запроса» нужно выбирать для конкретных решений — чтобы разработчики не думали каждый раз.

Основной смысл — идти от сложности объединения выборки, на какие элементы падают фильтры и сортировки и планируемым объемам выборки:

  • «если короткая выборка без обогащения» — то идем в сервис
  • «если короткая выборка с обогащением по справочнику» — то идем в сервис, обогащаем на bff
  • «если короткая выборка с обогащением по другим сервисам, фильтрами по одному сервису» —  то идем в сервис, обогащаем на bff
  • «если короткая выборка с фильтрацией по данным из разных сервисов и основной датасет короткий» — фильтруем на bff 
  • «если короткая выборка с фильтрацией по данным из разных сервисов и основной датасет большой» — реализуем на datamart

А вот что такое «короткая» и «длинная» — нужно мерить по конкретной задаче. Но обычно короткая — это где-то в пределах 10K записей (если язык нормальный).

Собственно, если бы такие правила можно было задавать на чем-то вроде graphql в наглядном виде — это было бы интересно.

Ну и лучшую оптимизацию поиска может сделать UX’ер, убравший бессмысленные фильтры с экрана пользователя.

Share