Шина сообщений и Quasar/HTTP для внутренних вызовов микросервиса
Я пытаюсь оптимизировать микросервисную архитектуру, которая в настоящее время использует HTTP/REST для внутренней связи между узлами.
Одним из вариантов является реализация возможности обратного давления в сервисах (например) путем интеграции чего-то вроде Quasar в стек. Это, несомненно, улучшит ситуацию. Но я вижу пару проблем. Во-первых, асинхронные клиентские потоки являются временными (в памяти), и при сбое клиента (сбой) эти потоки повторных попыток будут потеряны. Во-вторых, теоретически, если целевой сервер не работает в течение некоторого времени, клиент может в конечном итоге достичь OOM, пытаясь повторить попытку, потому что потоки в конечном итоге ограничены, даже Quasar Fibers.
Я знаю, что это немного параноидально, но мне интересно, будет ли альтернатива на основе очередей более выгодной в очень большом масштабе.
Он по-прежнему будет работать асинхронно, как Quasar/fiber, за исключением того, что: а) очередь управляется централизованно и не поддерживается клиентской JVM, и б) очередь может быть надежной, так что в случае сбоя клиентский и / или целевой серверы отключаются, а сообщения в полете отсутствуют. потеряны
Недостатком очереди, конечно, является то, что есть больше прыжков, и это замедляет работу системы. Но я думаю, что, вероятно, есть приятное место, где пики рентабельности инвестиций Quasar и централизованная и долговременная очередь становятся более важными для масштабирования и высокой доступности.
Мой вопрос:
Обсуждается ли этот компромисс? Есть ли какие-либо документы об использовании централизованного подхода с использованием внешней очереди / маршрутизатора для внутрисервисного взаимодействия.
TL; DR; Я просто понял, что мог бы сформулировать этот вопрос следующим образом:
"Когда целесообразно использовать внутрисервисную связь на основе шины сообщений, а не прямой HTTP в микросервисной архитектуре".
1 ответ
Я видел три общих шаблона проектирования протоколов с архитектурами микросервисов при работе в масштабе:
- Архитектура шины сообщений с использованием центрального посредника, такого как ActiveMQ или Apache Qpid.
- "Устойчивый" HTTP, где некоторая дополнительная логика построена на HTTP, чтобы сделать его более устойчивым. Типичными подходами здесь являются Hystrix (Java) или SmartStack/Baker St (умный прокси).
- Двухточечная асинхронная передача сообщений с использованием чего-то вроде NSQ, ZMQ или Qpid Proton.
Безусловно, наиболее распространенным шаблоном проектирования является № 2, с небольшим количеством #1, смешанным, когда очередь желательна.
Теоретически, #3 предлагает лучшее из обоих миров (устойчивость, масштаб и производительность), но все технологии несколько незрелые. Оказывается, что с #2 вы можете продвинуться очень далеко (например, Netflix везде использует Hystrix).
Чтобы ответить на ваш вопрос напрямую, я бы сказал, что № 1 очень редко используется в качестве эксклюзивного шаблона проектирования, поскольку он создает единственное узкое место для всей вашей системы. № 1 является общим для подмножества системы. Для большинства людей я бы порекомендовал № 2 сегодня.