У меня есть две службы, которые должны быть интегрированы с минимальными изменениями в обеих системах:
- Первая система предоставляет способ отправки команды с помощью Azure Service Bus Queue.Когда команда обрабатывается, она отправляет событие (через раздел служебной шины Azure) об обработанной команде обратно в систему, которая отправила начальную команду.
- Вторая служба (третье лицо) может выполнять только синхронные вызовы, но не можетиспользуйте Message Brokers с некоторыми техническими ограничениями
Имея все это, мне нужно интегрировать второй сервис с первым, и я вижу, что может иметь смысл предоставить API-шлюз, который может преобразовывать синхронные вызовы в асинхронные.
Мы используем:
- Spring Boot 2.0, Spring Cloud
- Java 9
- Azure
- Сервисная шина Azure
Я не нашел никаких библиотек или структур, которые могли бы преобразовать синхронный вызов в асинхронный.В любом случае, существует способ сделать решение на заказ:
- API Gateway предоставляет REST API для службы секунд.Когда вторая служба вызывает шлюз, она отправляет команду в очередь служебной шины Azure
- На стороне шлюза должен быть реализован какой-то механизм ожидания, шлюз должен держать второе подключение службы открытым и держать его в ожидании до момента, когда произойдет событиесо второго сервиса получено.Как только он поднял событие, он может создать ответ для синхронного вызова из сторонней системы.
- . Я почти уверен, что мы столкнемся со случаями, когда истекло время ожидания синхронного вызова, и мы не получили событие отпервый сервис.Чтобы справиться с такими случаями, мы должны откатить команду, обработанную первыми сервисами (это своего рода компенсация)
[! [Диаграмма, показывающая концепцию] [1]] [1]
Есть ли у вас какие-либо рекомендации относительно некоторых известных библиотек или шаблонов, которые могут помочь реализовать решение для наших нужд?
Я также хочу сказать, что я понимаю, что асинхронное синхронное преобразование является неестественным, и естьнекоторые другие способы, такие как использование веб-хуков или URL-адресов обратного вызова для отправки ответа вызывающей стороне при обработке команды.К сожалению, сторонний сервис не может предоставить такой API для этого.
Похоже, что есть ссылка, которая показывает и называет это преобразование из синхронизации в асинхронное - https://dzone.com/articles/patterns-for-microservices-sync-vs-async. Это называется Sync Wrapper