Микросервисы — сочетание шлюза API и брокера сообщений

Я разбиваю чудовищно большое монолитное корпоративное приложение на несколько микросервисов и определил бизнес-возможности, вокруг которых будут моделироваться сервисы. Приложение имеет различные модули (HRMS, управление транзакциями и т. д.), взаимодействующие друг с другом. У меня нет требования питания для разрозненных устройств.

Существуют определенные варианты использования запроса (немедленного) ответа, для которых связь между микросервисами через шлюз API кажется подходящей. Однако для многих функций ответ (немедленно) не требуется, и публикация события (например, «EmployeeCreated») в брокере сообщений (RabbitMQ) кажется более подходящей.

Моя цель состоит в том, чтобы максимально использовать асинхронный pub-sub и сделать шлюз API простым и тупым, чтобы избежать еще одной монолитной и единой точки отказа.

У меня есть следующий вопрос (вопросы):

i) Является ли правильным подходом реализовывать некоторые функции посредством взаимодействия между микросервисами через RESTful API-Gateway, а другие — через асинхронную публикацию-подписку? Есть ли какие-то проблемы, о которых нужно помнить?

ii) Было бы неплохо иметь центральный шлюз маршрутизации, подписывающийся на события брокера сообщений и вызывающий соответствующие API RESTful? Я боюсь, что два гиганта (центральный брокер сообщений и шлюз API) могут свести на нет цель MSA.

iii) Если я буду использовать (i), этот ответ предполагает, что службы Windows лучше работают с RabbitMQ, и что самостоятельный Веб-API в службах Windows могут быть хорошим вариантом. Таким образом, служба Windows может использовать определенные события и предоставлять некоторые API для синхронного вызова. Это рекомендуется? Предполагая парадигму .Net, обязательно ли асинхронные микросервисы должны быть службами Windows?

Извините за широкий охват. Любая помощь приветствуется.


person Abubakar Mehmood    schedule 16.01.2018    source источник
comment
Pub-sub — не единственный асинхронный режим для общения. Так же есть голосование   -  person Constantin Galbenu    schedule 17.01.2018
comment
@КонстантинГалбену. Спасибо за ваш ответ. Да, но природа приложения такова, что одно действие вызывает несколько других действий, и поэтому имеет смысл подписаться на это «событие» и действовать соответственно.   -  person Abubakar Mehmood    schedule 18.01.2018
comment
Ваш вопрос слишком расплывчатый/широкий, чтобы дать полный ответ. Не существует единственной лучшей архитектуры. Старайтесь использовать то, что лучше всего подходит для каждого конкретного случая использования. У вас может быть одновременно API-шлюз, микросервисы могут общаться друг с другом напрямую, вы можете одновременно использовать опрос и pub-sub. Старайтесь не иметь единой точки отказа и соблюдать принцип единой ответственности. Кроме того, возможно, это поможет вам: stackoverflow.com/a/47920156/2575224   -  person Constantin Galbenu    schedule 18.01.2018