API-шлюз, преобразующий синхронный вызов в асинхронный - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть две службы, которые должны быть интегрированы с минимальными изменениями в обеих системах:

  1. Первая система предоставляет способ отправки команды с помощью Azure Service Bus Queue.Когда команда обрабатывается, она отправляет событие (через раздел служебной шины Azure) об обработанной команде обратно в систему, которая отправила начальную команду.
  2. Вторая служба (третье лицо) может выполнять только синхронные вызовы, но не можетиспользуйте Message Brokers с некоторыми техническими ограничениями

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

Мы используем:

  • Spring Boot 2.0, Spring Cloud
  • Java 9
  • Azure
  • Сервисная шина Azure

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

  1. API Gateway предоставляет REST API для службы секунд.Когда вторая служба вызывает шлюз, она отправляет команду в очередь служебной шины Azure
  2. На стороне шлюза должен быть реализован какой-то механизм ожидания, шлюз должен держать второе подключение службы открытым и держать его в ожидании до момента, когда произойдет событиесо второго сервиса получено.Как только он поднял событие, он может создать ответ для синхронного вызова из сторонней системы.
  3. . Я почти уверен, что мы столкнемся со случаями, когда истекло время ожидания синхронного вызова, и мы не получили событие отпервый сервис.Чтобы справиться с такими случаями, мы должны откатить команду, обработанную первыми сервисами (это своего рода компенсация)

[! [Диаграмма, показывающая концепцию] [1]] [1]

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

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

Похоже, что есть ссылка, которая показывает и называет это преобразование из синхронизации в асинхронное - https://dzone.com/articles/patterns-for-microservices-sync-vs-async. Это называется Sync Wrapper

1 Ответ

0 голосов
/ 27 сентября 2018

Я рекомендую забыть о шлюзе, ожидающем завершения асинхронной задачи.ИМХО, двумя потенциально лучшими решениями являются HTTP Polling и WebHooks.

HTTP Polling - клиент постоянно запрашивает состояние данных.
Web Hooks - событие, инициируемое фоновым заданием, и отправка данных в конечную конечную точку HTTP после егоработа выполнена.

...