0
Обложка: Генерация Sitemap на микросервисах

Генерация Sitemap на микросервисах

Яна Сидорова
Яна Сидорова
Middle backend developer Hawking Bros

Мы продолжаем цикл статей о микросервисной архитектуре. В прошлый раз мы говорили о переходе на микросервисную архитектуру.  В этот раз речь пойдёт о генерации файла sitemap.xml и о нашем решении этой задачи

Введение

Что такое Sitemap?

Sitemap — файл формата xml, который содержит информацию о страницах сайта: URL-адреса, типы файлов, даты публикаций статей и так далее. Нужно предоставить этот файл поисковой системе, чтобы страницы сайта правильно индексировались для поиска.

Когда Sitemap нужен?

Если сайт уже построен на микросервисной архитектуре, не нужно объяснять, что не все ссылки на страницы находятся в верхнем меню. Скорее всего, это сложная система, содержащая большое количество контента, и этот контент хотелось бы показывать пользователю при поиске в Google.

В чём проблема?

Существуют автоматические генераторы, но они работают только со статичной и редко обновляемой информацией. Значит нужно писать свой метод: собрать все статичные URL, сгенерировать динамические, исходя из информации в базе данных; затем создать файл и наполнить его, не забывая про структуру XML-документа.

Проблема при использовании микросервисной архитектуры заключается в том, что базы данных микросервисов автономны и изолированы, в каждой из них находятся данные, которые нужно получать по отдельному запросу. Где расположить метод генерации Sitemap? Будет ли он отправлять запрос в каждый микросервис? Сколько времени занимает сбор данных? Где вообще хранить файл sitemap.xml?

Решить задачу можно разными способами, мы же поделимся своим видением.

Схема и технологии

Ситуация

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

Технологии

PHP-фреймворк Laravel, брокер очередей Kafka, поисковая система ElasticSearch в качестве хранилища данных, СУБД PostgreSQL. Взаимодействие между frontend и backend реализовано с помощью REST API.

Суть

Итак, для генерации готового файла sitemap.xml требуется:

  1. Дать команду на сбор адресов страниц микросервисам, которые должны их генерировать.
  2. Сохранить сгенерированные данные в общем хранилище.
  3. Дать команду на получение и форматирование этих данных в формат xml.
  4. Сохранить сгенерированный xml-файл для быстрого доступа при запросе.

Для получения:

  1. Отправить API-запрос в соответствующий микросервис.
  2. Получить содержимое файла из быстрого доступа или из внешнего хранилища.
  3. Отдать данные в ответе.

Для этого нам потребуются брокер сообщений и внешнее хранилище.

В качестве брокера сообщений на данном примере используется Kafka, за внешнее хранилище отвечает ElasticSearch.

В Kafka отправляется сообщение о генерации sitemap (по нажатию кнопки в административной панели, из cron-задачи или напрямую из терминала). Конкретно этот тип сообщения прослушивают только те микросервисы, которые должны участвовать в сборе адресов. Далее методы микросервисов внутри себя проходятся по заданным константами статичным урлам, по своей БД, если требуется, а также формируют часть файла и сохраняют её в документ заранее созданного индекса.

Генерация Sitemap

Теперь, чтобы взять эти данные и составить из них документ, определённый микросервис (например, seo) принимает API запрос.

Чтобы вернуть ответ, сначала методы микросервиса seo смотрят в кэш. Время хранения кэша зависит от частоты обновляемых данных, в нашем случае это один день. Если в кэше нужных данных не оказалось, методы ищут их в базе данных микросервиса c датой обновления не ранее суток. Если же данных нет и там, происходит следующий процесс.

Микросервис обращается к индексу ElasticSearch, получает части файла, объединяет и применяет к ним нужное форматирование. Затем содержимое файла сохраняется в базу данных, кэшируется для дальнейшего быстрого доступа и отдаётся в ответе. Файл не хранится физически, его данные собираются из частей во внешнем хранилище. Мы настроили наш веб-сервер таким образом, чтобы при переходе на /sitemap.xml посылался запрос на backend, который в свою очередь отдаёт сгенерированный xml.

Получение Sitemap

Заключение

Таким образом, при запросе sitemap.xml из браузера, веб-сервер посылает API-запрос к микросервису seo и полученный ответ подставляется на страницу.

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

Использование очереди сообщений позволяет не ждать ответа последовательных запросов к каждому микросервису, а генерировать части файла асинхронно, чтобы избежать ошибки 504 Gateway Time Out.

Если какой-то микросервис недоступен или генерация закончилась ошибкой, часть адресов просто не попадёт в общий список, а ошибку можно будет легко отследить в логах. Зато сам sitemap.xml будет всегда доступен, даже во время обновления адресов, так как за получение файла отвечает другой запрос.