Шина сообщений по сравнению с Quasar/HTTP для внутренних вызовов микросервисов

Я пытаюсь оптимизировать микросервисную архитектуру, которая в настоящее время использует HTTP/REST для внутренней связи между узлами.

Одним из вариантов является реализация возможности обратного давления в сервисах, например, путем интеграции чего-то вроде Quasar в стек. Это, без сомнения, улучшит ситуацию. Но я вижу пару проблем. Во-первых, асинхронные клиентские потоки являются временными (в памяти), и при сбое клиента (сбое) эти потоки повторных попыток будут потеряны. Во-вторых, теоретически, если целевой сервер не работает в течение некоторого времени, клиент может в конечном итоге достичь OOM, пытаясь повторить попытку, потому что потоки в конечном итоге ограничены, даже Quasar Fibers.

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

Он по-прежнему будет работать асинхронно, как Quasar/fibers, за исключением того, что: а) очередь управляется централизованно и вне клиентской JVM, и б) очередь может быть устойчивой, так что в случае отказа клиента и/или целевых серверов сообщения в полете отсутствуют. потеряны.

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

Мой вопрос:

Этот компромисс обсуждался? Есть ли документы по использованию централизованной внешней очереди/маршрутизатора для внутрисервисной связи.

TL;DR; Я только что понял, что, вероятно, мог бы сформулировать этот вопрос так:

«Когда уместно использовать внутрисервисную связь на основе шины сообщений, а не прямой HTTP в архитектуре микросервиса».


person Robert Christian    schedule 12.08.2015    source источник


Ответы (1)


Я видел три общих шаблона проектирования протоколов с архитектурами микросервисов при работе в масштабе:

  1. Архитектура шины сообщений с использованием центрального брокера, такого как ActiveMQ или Apache Qpid.
  2. «Отказоустойчивый» HTTP, в котором некоторая дополнительная логика построена на HTTP, чтобы сделать его более устойчивым. Типичными подходами здесь являются Hystrix (Java) или SmartStack/Baker St (умный прокси).
  3. Асинхронный обмен сообщениями «точка-точка» с использованием чего-то вроде NSQ, ZMQ или Qpid Proton.

На сегодняшний день наиболее распространенным шаблоном проектирования является № 2, с небольшим количеством № 1, когда желательна очередь.

Теоретически № 3 предлагает лучшее из обоих миров (отказоустойчивость, масштабируемость и производительность), но все технологии несколько незрелые. Оказывается, с # 2 вы можете продвинуться очень далеко (например, Netflix везде использует Hystrix).

Чтобы ответить на ваш вопрос напрямую, я бы сказал, что № 1 очень редко используется в качестве эксклюзивного шаблона проектирования, потому что он создает единое узкое место для всей вашей системы. #1 является общим для подмножества системы. Для большинства людей я бы порекомендовал № 2 сегодня.

person Richard Li    schedule 13.08.2015