У нас есть API, который работает как фасад, инкапсулируя вызов внутренней службы.Мы планируем изменить взаимодействие между фасадом и внутренней службой, потому что мы изменяем внутреннюю службу, чтобы использовать очереди, делая ее более устойчивой и эластичной.Мы не можем сейчас изменить способ, которым клиенты используют API, поэтому мы хотели бы сохранить блокирующий вызов между клиентом и фасадом.
Сервис предоставит веб-метод для получения запроса, отправивсообщение в очередь и ответ на звонок как можно скорее на фасад.Когда обработка будет завершена, служба вызовет внутренний веб-метод фасада, освобождая первый вызов (клиент к фасаду).
Фасад построен с использованием Spring Boot и MVC.Вопрос в том, как мы можем «удерживать» http-запрос клиента, ожидая сигнала от службы, чтобы вернуть данные клиенту.Мы рассмотрели следующие подходы:
- При первом вызове API он генерирует уникальный идентификатор и отправляет его во внутреннюю службу.Затем веб-метод на фасаде будет опрашивать (проверять и переходить в режим сна) одноэлементный объект (возможно, ConcurrentHashMap), ища объект, связанный с уникальным идентификатором.Когда внутренняя служба сигнализирует о фасаде, она помещает результаты в одноэлементный объект, поэтому веб-метод может вернуть информацию клиенту.
- Используя аналогичный подход, описанный выше с актерами Akka
Мы обеспокоены масштабируемостью и доступностью этого решения (мы знаем, что удерживать клиентский http-запрос нехорошо, но нам придется с этим смириться некоторое время).
Кто-нибудь здесь имелсделать что-то подобное?Какой подход был использован?Есть ли какая-то инфраструктура (Java), которую можно использовать?