В микросервисной архитектуре у нас обычно есть два способа взаимодействия двух микросервисов. Допустим, службе A необходимо получить информацию от службы B. Первый вариант - это удаленный вызов, обычно синхронный через HTTPS, поэтому служба A запрашивает API, размещенный службой B.
Второй вариант - это использование управляемой событиями архитектуры, в которой состояние службы B может быть опубликовано и использовано службой A асинхронным способом. Используя эту модель, служба A может обновлять свою собственную базу данных информацией из событий службы B, и все запросы выполняются локально в этой базе данных. Преимущество этого подхода заключается в лучшей развязке микросервисов от разработки до эксплуатации. Но у него есть некоторые недостатки, связанные с репликацией данных.
Первый - это высокое потребление дискового пространства, поскольку одни и те же данные могут находиться в базах данных микросервисов, которым они нужны. Но второй вариант, на мой взгляд, наихудший: данные могут устареть, если служба B не может обрабатывать свою подписку так быстро, как это необходимо, или они не могут быть доступны для службы A в то же время, когда она создается в службе B, учитывая возможная согласованность модели.
Допустим, мы используем Kafka в качестве центра событий, и его темы настроены на использование 7 дней хранения данных. Служба A синхронизируется, поскольку служба B публикует свое состояние. Через две недели развертывается новая служба C, и ее база данных должна быть дополнена всей информацией, содержащейся в службе B. Мы можем получить только частичную информацию из тем Kafka, поскольку самые старые события ушли. У меня вопрос: какие шаблоны мы можем использовать для обогащения базы данных этого микросервиса (помимо просьбы к сервису B повторно опубликовать все свое текущее состояние в концентраторе событий).