Я пытаюсь извлечь некоторые услуги из моего монолитного приложения для домашних животных, в основном в качестве учебного упражнения. Я использую AMQP (RabbitMQ) для связи между службами, которая работает нормально. Однако у меня возникли проблемы с отделением веб-интерфейса от остальной части приложения. Веб-сервис заботится о представлениях и логике пользовательского интерфейса, но ему необходимо запросить базовую «основную» службу для основных данных. AMQP не подходит для этого, так как внешняя служба должна ждать ответа, а время ответа имеет решающее значение. Моя первая мысль заключалась в том, чтобы реализовать интерфейс REST только для этой линии связи, но одна и та же услуга также использует AMQP для подписки на связь других сервисов.Синхронная связь в архитектуре в основном асинхронных микросервисов
Похоже, что это должно быть довольно распространенное явление, но я не смог найти ответы.
Я предполагаю, что мой главный вопрос - что делать, когда один сервис должен предлагать как синхронную, так и асинхронную связь. Я также использую Ruby, который не поддается использованию нескольких потоков, которые потребуются для прослушивания на двух интерфейсах. Несколько вещей, которые я рассмотрел:
- Только с помощью AMQP, отправив сообщение с
reply_to
полем, и блокирование, пока не будет получен ответ. - Извлеките часть доступа к данным базовой базовой службы и предоставите ей REST API. Тогда и веб-служба, и часть, которая «подписывается», будут запрашивать эту другую услугу. Нет необходимости иметь сервис только для доступа к базе данных.
- Наличие нескольких потоков и использование какого-либо цикла событий для прослушивания на двух интерфейсах. Кажется слишком сложным.
У вас будут преимущества использования RPC и protobuf с использованием REST для синхронной связи между службами. Также наличие двух синхронных и асинхронных сообщений довольно распространено, но я не знаком с проблемой многопоточности Ruby. –
Когда услуга подписана на событие с использованием очереди, которая действительно является синхронным входящим вызовом с точки зрения подписной службы. Это асинхронно с точки зрения отправителя, и отправитель должен не знать и не заботиться о получателе. – usr