Кафка Микросервис Правильное использование - PullRequest
1 голос
/ 18 июня 2019

В проекте моей новой работы я обнаружил, что вместо непосредственного выполнения API-вызовов post / put от одного микросервиса к другому микросервису микросервис будет генерировать сообщение для kafka, которое затем используется одним микросервисом.

Например, заказ микросервиса будет публиковать запись в теме «отложенный заказ», которая затем будет использоваться микросервисом инвентаризации (другого потребителя нет). В свою очередь, после использования записи и некоторой обработки микросервис Inventory будет производить запись для «обработанного заказа», которая затем будет использоваться только микросервисом Order.

Это правильный вариант использования? Или в этом случае лучше просто выполнять вызовы API между микросервисами?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Существует два сильных варианта использования Kafka в приложении на основе микросервиса:

  1. Вам необходимо изменить состояние нескольких микросервисов в рамках одного действия конечного пользователя. Если вы сделаете это, вызывая все соответствующие API-интерфейсы микросервиса последовательно или параллельно, возникнут две проблемы: Во-первых, вы теряете атомарность, то есть вы не можете гарантировать «все или ничего». Вполне возможно, что вызов к микросервису A будет успешным, но вызов к сервису B не удастся, и это приведет к несогласованности данных на постоянной основе. Во-вторых, в облачной среде непредсказуемые задержки и сетевые таймауты не редкость, и поэтому, когда вы делаете несколько вызовов как часть одного вызова, вероятность того, что один из этих вызовов будет задержан или потерпел неудачу, больше влияет на восприятие пользователя. Следовательно, общая рекомендация здесь такова: вы пишете действие пользователя атомарно в теме Kafka как событие и имеете несколько групп потребителей - по одной для каждого заинтересованного микросервиса, которое использует событие и вносит изменения в свою собственную базу данных. Если действие инициируется пользователем из пользовательского интерфейса, вам также необходимо предоставить гарантию «прочитайте свою запись», в которой пользователь хотел бы видеть свои данные сразу после записи. Следовательно, вам нужно сначала записать событие в локальную базу данных первого микросервиса, а затем выполнить поиск событий на основе журнала (с использованием aporopriate Kafka Connector) для передачи данных события в Kafka. Это позволит вам показать данные пользователю из локальной БД. Вам также может потребоваться обновить кэш, поисковый индекс, распределенную файловую систему и т. Д., И все это можно сделать, используя события Kafka, опубликованные отдельными микросервисами.

  2. Нередко бывает, что вам нужно извлечь данные из нескольких микросервисов, чтобы выполнить какое-либо действие или объединить данные и отобразить их пользователю. Это, как правило, не рекомендуется из-за задержки и времени ожидания, упомянутых выше. Обычно рекомендуется предварительно вычислять эти агрегаты в локальной БД микросервиса на основе событий Кафки, опубликованных другими микросервисами, когда они меняли свое собственное состояние. Это позволит вам предоставлять агрегированные данные пользователю намного быстрее. Это называется материализованный вид шаблон.

Единственное, что нужно помнить, это запись в журнал или брокер Kafka и чтение из него в асинхронном режиме и, возможно, небольшая задержка.

0 голосов
/ 18 июня 2019

Микросервис как потребитель, кажется мне подозрительным. Возможно, вы подразумеваете, что слушатели этой темы будут использовать сообщение, и, возможно, они будут вызывать ваш второй микросервис, то есть Inserory Microservice.

Да, модель в порядке, особенно если вы хотите, чтобы асинхронное поведение и трафик обрабатывались через нее.

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

Также подумайте о сервисах чтения: если вам нужно вызвать микросервис для чтения некоторых данных из другого места, вы не можете использовать Kafka.

Все зависит от ваших требований и дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...