Управляемые событиями микросервисы с брокерами сообщений (например, Kafka) по сравнению с реактивным программированием (RxJava, Project Reactor) и улучшенными протоколами (RSocket)

Мы все согласны с тем, что обычный способ взаимодействия микросервисов с помощью HTTP-вызовов приводит к их связыванию. Это привело нас к подходу, основанному на событиях, при котором службы публикуют события, на которые будут реагировать некоторые другие службы. Для этого мы можем использовать промежуточное программное обеспечение, которое может быть чем угодно, от AMQ, RabbitMQ, Kafka и т. Д.

Однако верно и то, что сообщество реактивного программирования создало несколько отличных проектов, таких как Project Reactor или RxJava, которые превращают HTTP-коммуникации в решение, управляемое псевдосообщениями. Более того, с появлением таких протоколов, как RSocket, эта модель также достигла уровня приложений TCP / IP.

  • Могут ли микросервисы RSocket / Reactive считаться решениями, управляемыми событиями? Разве они не просто способ повысить производительность традиционных систем запрос-ответ?

  • Другими словами: разве эти микросервисы Rsocket + Reactor по-прежнему не связаны точно так же, как раньше?

  • В каких сценариях каждый из них более рекомендован?


person codependent    schedule 15.12.2019    source источник


Ответы (2)


Здесь нужно много распаковать, извините за длину.

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

Однако верно и то, что сообщество реактивного программирования создало несколько отличных проектов, таких как Project Reactor или RxJava, которые превращают HTTP-коммуникации в решение, управляемое псевдосообщениями.

Реактивные библиотеки в Java, безусловно, хорошо подходят для решений, управляемых сообщениями, но они могут быть использованы почти для чего угодно (и, возможно, часто используются в тех случаях, когда они не всегда подходят лучше всего!)

Могут ли микросервисы RSocket / Reactive считаться решениями, управляемыми событиями?

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

Реактивные микросервисы или микросервисы, написанные реактивным образом, в основном связаны с тем, как они написаны внутри. Будучи реактивным, серверная часть не является блокирующей, поэтому, возможно, они более эффективны - особенно в тех случаях, когда поток данных должен быть отправлен через долгосрочное соединение. Нереактивные службы должны будут держать отдельный поток открытым в течение всего этого времени для управления этим соединением, тогда как реактивная служба может просто бездействовать, если сообщение не отправляется активно.

Реактивные микросервисы, безусловно, внутренне управляются событиями. Однако это ничего не говорит о средствах, которые реактивный микросервис может использовать для связи. Он может использовать RSocket, простой HTTP, MQTT - вы не можете гарантировать, что он использует, только на основе этого протокола.

Однако RSocket - это протокол, который особенно хорошо работает с реактивными службами, работает с несколькими транспортами и (как бинарный протокол) более эффективен. Это приводит к следующему пункту:

Разве они не просто способ повысить производительность традиционных систем запрос-ответ?

RSocket, безусловно, может быть. Вы можете использовать его как традиционную систему запроса / ответа и просто повысить производительность, при этом все остальное останется классическим. Однако он также поддерживает потоки данных (одно- и двунаправленные), а также семантику «запускать и забывать» и возобновляемые потоки на уровне протокола, поэтому имеет преимущества в функциях, а также в производительности.

Это может быть причиной некоторой путаницы, поскольку (без RSocket) можно выбрать использование промежуточного программного обеспечения исключительно потому, что оно упрощает управление этими потоками (а не для отдельного разделения чего-либо). В этом случае тогда да, промежуточное программное обеспечение не будет не требуется.

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

Разве эти микросервисы Rsocket + Reactor по-прежнему не связаны точно так же, как раньше?

Да, они все еще связаны - это не та проблема, которую пытается решить Rsocket. Это протокол, а не промежуточное ПО. Например, Kafka может позже изначально поддерживать Rsocket. (На данный момент я не вижу никаких признаков того, что это произойдет, но нет ничего, что могло бы технически остановить это.)

В каких сценариях каждый из них более рекомендован?

Если единственная причина, по которой вы используете промежуточное программное обеспечение, заключается в том, чтобы легко генерировать поток данных и управлять им (а не ограничиваться запросом / ответом), тогда Rsocket в сочетании с реактивными библиотеками теперь, возможно, удовлетворяет этим критериям на уровне протокола.

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

person Michael Berry    schedule 16.12.2019
comment
Привет, Майкл, прежде всего спасибо, что нашли время написать такой подробный ответ. Я полностью согласен со всем, что вы говорите. Мои сомнения были больше связаны с тем, насколько подходящими реактивными фреймворками (Spring Webflux + Project Reactor) были для разделения микросервисов и использования для этого чего-то вроде Kafka. В настоящее время существует своего рода тенденция «Все события», в которой мы хотим изолировать ограниченные контексты посредством передачи сообщений. В этом контексте, как вы сказали, реактивные приложения не подходят. - person codependent; 16.12.2019
comment
@codependent Реактивные приложения могут хорошо вписаться в этот сценарий, но они не будут хорошей заменой для использования промежуточного программного обеспечения, такого как RabbitMQ / Kafka / что-то еще, IMHO. Я подозреваю, что со временем мы увидим больше реактивных приложений, но я очень сомневаюсь, что эти приложения заменят промежуточное ПО, скорее всего, дополнят их. - person Michael Berry; 17.12.2019

Цель RSocket - предоставить протокол связи между приложениями, который, скорее всего, действует как одноранговые узлы, разговаривающие друг с другом. HTTP разработан для взаимодействия человек-машина (клиент-сервер). Даже HTTP2 или входящий 3 НЕ изменят эту перспективу. Одно из основных различий между двумя протоколами - двунаправленный поток. Так что нет, RSocket не просто пытается улучшить производительность запроса-ответа.

Одно из ключевых различий между Kafka и реактивным потоком - это взгляд на стоимость инфраструктуры. Kafka будет буферизовать все данные, в то время как реактивный поток будет использовать обратное давление для координации отправителя и получателя. RSocket просто расширяет реактивный поток до уровня сетевого протокола. По сути, это скользящее окно TCP на уровне 6 от конца до конца.

person andy.s    schedule 26.02.2020