Подтверждение клиента микросервисов и получение событий - PullRequest
0 голосов
/ 31 января 2019

Сценарий

Я строю систему курьерской службы с использованием микросервисов.Я не уверен в некоторых вещах, и вот мой Сценарий

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

Система использует архитектуру, управляемую событиями.Когда клиент размещает заказ, я совершаю локальную транзакцию в API бронирования и публикую событие.Платежный API и API уведомлений подписаны на соответствующее событие.После завершения оплаты и уведомления API необходимо подтвердить обратно в API бронирования.

Мои вопросы

После публикации события моя служба бронирования не может заблокировать вызов и возвращается к клиенту (передний конец).Каким образом мое клиентское приложение должно будет проверять состояние транзакции или оно будет знать, что транзакция завершена?Опрашивает ли он каждые пару секунд?Поскольку это распределенная транзакция, и любая служба может выйти из строя и не сможет подтвердить ответ.В таком случае, как мой клиент (клиентский интерфейс) узнает об этом, так как он будет ждать.Я рассматриваю сагу для распределенных транзакций.

Какой лучший способ добиться всего этого?

Источник событий

Я хочу внедрить источник событий, чтобы отслеживать полный путь заказа.Должен ли я реализовать это в своем API бронирования с магазином событий?Или хранилище событий распределяется между сервисами, так как я должен отлавливать все события из разных сервисов.Какой лучший способ реализовать это?

Большое спасибо,

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Я не на 100% уверен, что вы спрашиваете.Но, похоже, вы должны использовать службу обмена сообщениями.Как сказал @Saptarshi Basu, кафка хороша.Я действительно рекомендую NATS - хотя я и предвзят, потому что именно с этим я работаю

. С помощью NATS вы можете создавать сообщения запроса-ответа для взаимодействия между клиентом и службой бронирования.Это сообщение 1-1

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

И затем вы сможете использовать каналы pub-sub для связи между всеми вашими сервисами.

Это даст вам очень устойчивую и масштабируемую архитектуру, иNATS делает все это невероятно простым

0 голосов
/ 01 февраля 2019

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

благодаря skjagini.часть моего вопроса - разобраться со случаем, когда другие микросервисы не возвращаются вовремя или никогда.Допустим, платежный API завершен, работает и взимает плату с клиента, но не уведомил мою службу заказов вовремя или через очень долгое время.как мой клиент ждет?если мы истечем время ожидания клиента, бэкэнд мог обработать его после истечения времени ожидания

В CQRS вы должны разделить команды и запросы.То есть, учитывая ваш сценарий, вы можете реализовать все взаимодействия с очередями для взаимодействия.(Существует несколько реализаций для CQRS с источником событий, но в простейшей форме):

Клиент отправляет запрос -> Платежный API получает запрос -> Подтверждает запрос (если проверка не пройдена, ошибка возвращается кuser) -> При успешной проверке -> генерирует GUID и записывает запрос сообщения в очередь -> передает GUID пользователю

Payment API подписывает очередь платежей -> После обработки запроса --> записывает в очередь заказов или любые другие очереди

Заказ APi подписывается на очередь заказов и обрабатывает запрос.

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

Если использовать паб / саб, как в Kafka вместо Kafka (все последующие системы могут читать из той же темы,вам не нужно писать для каждой очереди)

Если какая-либо из служб не может быть обработана, после перезапуска служб она сможет выбрать, где они остановились, если службы находятся в серединетранзакции, пока они откатывают свои изменения, ваша система должна быть стабильной

0 голосов
/ 31 января 2019

То, как я это представляю, выглядит следующим образом (под влиянием выступления Мартина Клеппмана здесь и здесь ).

  1. Конечный пользователь размещает заказ.Заказ написан на тему Кафки.Поскольку Kafka имеет структурированное хранилище, детали заказа будут сохранены в кратчайшие сроки.Это атомарная операция («A» в «ACID») - все или ничего
  2. Теперь, как только пользователь разместит заказ, он захочет прочитать его обратно (read-your-write).Для этого мы можем также записать данные заказа в распределенный кеш.Хотя двойная запись обычно не является хорошей идеей, поскольку она может привести к частичному сбою (например, запись в Kafka успешна, но запись в кэш завершается неудачно), мы можем уменьшить этот риск, гарантируя, что один из потребителей Kafka записывает данные в базу данных.Таким образом, даже в редком случае сбоя кэша пользователь может в конечном итоге прочитать данные обратно из БД.
  3. Состояние заказа в кэше, записанное во время создания заказа, «выполняется»
  4. Одна или несколько групп потребителей kafka затем используются для обработки событий следующим образом: платеж и уведомление обрабатываются должным образом, и окончательный статус будет записан обратно в кэш и базу данных
  5. Затем отдельный потребитель Kafka получит ответ от API оплаты и уведомлений и запишет обновления в кэш, БД и веб-сокет

  6. Затем веб-сокет обновит модель пользовательского интерфейса и внесенные изменения.затем будет отражен в пользовательском интерфейсе через источник событий.

Дополнительные пояснения на основе комментария

  1. Основная идея здесь заключается в том, что мы создаем кэшиспользуя потоковую передачу для каждого сервиса с данными, которые им нужны.Например, сервису аккаунта нужна обратная связь от сервисов оплаты и уведомлений.Поэтому у нас есть эти сервисы, которые пишут свой ответ на какую-то тему Kafka, в которой есть некоторые потребители, которые записывают ответ обратно в кэш сервиса заказов

  2. На основе ACID-свойств Kafka (или любой подобной технологии).), сообщение никогда не будет потеряно.В конце концов мы получим все или ничего.Это атомарность.Если службе заказа не удается написать заказ, ответ об ошибке отправляется обратно клиенту синхронным способом, и пользователь, вероятно, через некоторое время повторяет попытку.Если служба заказа успешна, ответ на другие службы должен в конечном итоге возвращаться в его кэш.Если одна из служб в течение некоторого времени не работает, ответ будет отложен, но он будет отправлен в конце концов, когда служба возобновит работу

  3. Клиентам не нужно опрашивать.Результат будет передан ему через потоковую передачу с помощью веб-сокета.Страница пользовательского интерфейса будет прослушивать веб-сокет. Когда потребитель записывает обратную связь в кэш, он также может записывать в веб-сокет.Это уведомит пользовательский интерфейс.Затем, если вы используете что-то вроде Angular или ReactJS, соответствующий раздел пользовательского интерфейса может быть обновлен до значения, полученного через веб-сокет.Пока это не происходит, пользователь продолжает видеть состояние «в процессе», как было записано в кэш во время создания заказа. Даже если пользователь обновляет страницу, тот же статус извлекается из кеша.Если значение кэша истекает и следует механизму LRU, то же значение будет извлечено из БД и записано обратно в кэш для обслуживания будущих запросов.Как только обратная связь с другими службами станет доступна, новый результат будет передан с помощью веб-сокета.При обновлении страницы новое состояние будет доступно из кеша или БД

...