Как данные из Elasticsearch попадают в микросервис?

«Как данные из Elasticsearch попадают в микросервис?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Микросервис получает данные из Elasticsearch, выступая в роли клиента и выполняя запросы к его REST API. Основные паттерны взаимодействия:

  1. Прямой запрос (Pull-модель): Микросервис инициирует запрос, когда ему нужны данные. Используется клиентская библиотека, например, для Java это RestHighLevelClient (устаревший) или новый Elasticsearch Java API Client.

    // Пример с Elasticsearch Java API Client (новый)
    try (ElasticsearchClient client = new ElasticsearchClient(transport)) {
        SearchResponse<Product> response = client.search(s -> s
            .index("products")
            .query(q -> q
                .match(m -> m.field("name").query("iPhone"))
            ), Product.class);
        List<Hit<Product>> hits = response.hits().hits();
    }

    Плюсы: Простота, контроль над временем запроса. Минусы: Добавляет задержку (latency) и нагрузку на Elasticsearch при частых вызовах.

  2. Асинхронная доставка через брокер сообщений (Push-модель): Данные попадают в микросервис через очередь (Kafka, RabbitMQ). Это происходит, когда отдельный процесс (индексатор) обновляет данные в Elasticsearch и одновременно публикует событие об изменении в топик. Микросервис подписывается на этот топик.

    // Упрощенный пример слушателя Kafka в Spring
    @KafkaListener(topics = "product-updates")
    public void consumeProductEvent(ProductEvent event) {
        // Обработать событие о новом/измененном продукте
        processEvent(event);
    }

    Плюсы: Слабая связность, высокая производительность, микросервис получает данные почти в реальном времени. Минусы: Усложнение архитектуры (нужен брокер, гарантии доставки).

Ключевые практики:

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