Feedhandler: разбиение на микросервисы

Микеланджело Буонарроти. “Сотворение Адама”

Я начал работы по разбиению монолита feedhandler.ru на микросервисы. Или просто сервисы, если будет угодно.

На mrfroll.com я планирую периодически рассказывать как идут дела в этом направлении и делиться инсайтами. Соответствующие заметки буду помечать новым тегом into microservices.

В статье на Хабре “Чему я научился, пока писал свой агрегатор цен на игры” я рассказал, что FeedHandler - это вот такой монолит:

Старая схема Feedhandler.ru
Если кратко, то он состоит из двух приложений:

  • Backend – огромный java-монолит, приложение, которое делает все: собирает данные из PlayStation Store и сохраняет их, строит отчеты, отдает json в UI feedhandler и даже создает sitemap.xml файл;
  • UI – вьюха написанная на Nuxt.

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

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

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

Новая схема Feedhandler.ru

Здесь стрелки указывают поток информации. Сервисы на схеме выполняют следующие функции:

  • Trakt – забирает сырые данные из PlayStation Store и помещает их в Postgres-хранилище;
  • Pricer – забирает сырые данные из Postgres-хранилища, вытаскивает из них цены и сбрасывает эти данные в MongoDB-хранилище цен;
  • Gortto – сервис аутентификации и авторизации пользователя;
  • Tresury – отдает цены на сайт feedhandler.ru.

Из этой схемы в продакшн вышел только Tresury, остальные сервисы в процессе разработки, но это только начало.

Я хочу достичь следующих целей:

  • проще и безопасней деплоить: маленький сервис, видно, что делает, подкрутил и поехали;
  • отказоустойчивость: баги будут изолированы друг от друга сервисами;
  • масштабируемость: чтобы раздавать на сайт json можно запустить пару инстансов соответствующих сервисов.

Я ожидаю следующие проблемы:

  • вероятно, периодически буду забывать какой сервис за что отвечает;
  • надо срочно разворачивать ekl, не знаю как без него буду разбирать сложные проблемы;
  • думаю столкнусь с ситуацией когда на стыке сервисов получу несоответствие моделей.

Используемые на данном этапе инструменты:

  • Spring Cloud Gateway - как API Gateway;
  • Eureka - в качестве Discovery Service;