Как верно выбрать коммуникационный протокол для взаимодействия между микросервисами?
Есть приложение клиент и два микросервиса: микросервис по выплатам, микросервис по формированию чеков.
Когда пользователь запросил вывод средств, приложение клиент делает запрос к микросервису по выплатам, тот в свою очередь в банк.
Как только я узнаю что транзакция закончилась успехом, должен поменять статус транзакции в основном приложении и сделать запрос в микросервис формирования чеков.
Хотелось бы понять какой стиль взаимодействия нужно использовать между клиентом и сервисами, какой более правильно выбрать коммуникационный протокол.
На данный момент, думаю использовать rabbitmq.
Насколько правильно было бы реализовать такой алгоритм?
- В микросервис платежей приходит нагрузка из клиента, формируем guid транзакции и возвращаем его клиенту, клиент сохраняет его, в этот момент начинаем опрашивать банк
- В случае успеха из микросервиса платежей передаем сообщение в клиент(payment.success.command) и микросервис формирования чеков(payment.created.command).
Если использовать gRPC
Клиент делает запрос в микросервис платежей, после c задержкой опрашивает статус, в случае успеха делает запрос в микросервис по формированию чеков.
Смотрите - вы должны смотреть на требования бизнеса. Те процессы, которые не требуют немедленного подтверждения могут быть сделаны через мессаж брокер, типа Кролика или Кафки (лучше имхо). Остальные могут быть сделаны через обычный http(s) протокол - советую через ssl, тк у вас серьезные данные. Теперь как выбирать прямое взаимодействие между сервисами по https? Я советую использовать какой-либо API Gateway со своим - внутреннем доменом и все взаимодействие между сервисами вести через него, а не напрямую внутри кластера K8S или Docker Swarm итд. Получается гораздо более организованно. Не знаю, нужно ли вам gRPC, по-моему и разрабам и девопсам легче будет работать со старым добрым http для устранения неполадок и tracinga.
После окончания дизайна проводите what-if анализ с ведущими разрабами и админом бд. А что если сообщение потерялось, брокер или база перегружена, или сеть отказала в соединении... как откатить деньги обратно итд. Все надо серьезно со всех сторон продумать! После этого вносите изменения в систему.
На всем протяжении одного длинного действия создавайте transaction_id, которое будет распространятся по системе, включая сообщения Кролика/Кафки и записи в базе, чтобы можно было легко его найти в логах или восстановить, если где-то произошла проблема.
Вообще, надо отталкиваться от требуемой (достаточной, с учётом некоторой избыточности) скорости обработки количества сообщений в секунду. Она известна?