基于消息代理的事件驱动微服务(例如Kafka)与响应式编程(RxJava,Project Reactor)加强协议(RSocket)相比。

10
我们都认为通过HTTP调用通信的常规请求-响应方式会导致微服务之间的耦合。这促使我们采用事件驱动的方法,其中某些服务发布事件,而其他服务将对其做出反应。为此,我们可以使用一些中间件,包括AMQ、RabbitMQ、Kafka等。
然而,反应式编程社区也创建了一些优秀的项目,例如Project Reactor或RxJava,它们可以将HTTP通信转化为一种伪消息驱动的解决方案。此外,随着像RSocket这样的协议的出现,这种模型也已到达TCP/IP应用层。
那么,RSocket/反应式微服务在实际上是否可以被视为面向事件驱动的解决方案呢?它们不只是改进传统的请求-响应系统的性能的一种方式吗?
换句话说,这些RSocket+Reactor微服务与基于HTTP的微服务一样耦合吗?
在哪些情况下推荐使用它们?
2个回答

18

这里有很多需要探讨的内容,因此对于篇幅长表示抱歉。

你的问题标题给出了一个虚假的二分法。实际上,这两个概念并不是竞争关系,相反它们彼此呼应,以至于 Reactive Kafka 就是一个事实。

然而,响应式编程社区也创造了一些优秀的项目,例如 Project Reactor 或 RxJava,这些项目将 HTTP 通信转化为类似于消息驱动的解决方案。

Java 中的响应式库确实非常适合消息驱动的解决方案,但它们也可以用于几乎任何东西(甚至可以说它们经常被用于并不总是最合适的情况下!)

RSocket / Reactive 微服务是否真正可以被认为是事件驱动的解决方案?

RSocket 和 Reactive 微服务是两个不同的概念;尽管它们相互配合并经常一起使用,但它们并不是同一个东西。RSocket 是一个比较新的概念,所以大部分已经存在的响应式微服务可能并没有使用它。

响应式微服务,或者说以响应式方式编写的微服务,主要涉及它们内部的编写方式。作为响应式的后端是非阻塞的,因此它们在需要长期连接发送数据流的情况下,可以说更加高效。而非响应式服务将不得不保持单个线程打开以管理该连接的整个时间,而响应式服务只有在实际发送消息时才会处于闲置状态。

响应式微服务的内部肯定是事件驱动的。但是,这并不能说明一种响应式微服务可能使用的通信方式。它可以使用RSocket、纯HTTP、MQTT等方式,仅根据此协议无法对其使用的协议进行任何保证。

RSocket是一种协议,专门设计用于与响应式服务良好配合,可以在多种传输中工作,并且(作为二进制协议)更加高效。这导致了你的下一个问题:

它们难道不只是改进传统的请求-响应系统的一种方式吗?

RSocket可以作为传统的请求/响应系统使用,仅仅获得了性能上的提升,其他所有内容都保持“经典”。但是,它还支持数据流(单向和双向),以及在协议层面上的fire-and-forget语义和可恢复流,因此具有特性优势和性能优势。

这可能是一些混淆的根源,因为(没有RSocket的情况下),人们可能选择使用中间件仅仅是因为它使管理这些流更容易(而不是特别地解耦任何东西)。在这种情况下,中间件是不必要的。

RSocket建立在传输层之上,不关心它被用在哪里,或者发送什么 - 因此,无论是在TCP上的服务器到服务器的环境中操作,还是在websocket上的双向服务器到客户端的环境中操作,它都可以很好地运行。

那么Rsocket+Reactor微服务仍然像基于HTTP的微服务一样紧密耦合吗?

是的,它们仍然是紧密耦合的 - 这不是Rsocket试图解决的问题。它是一个协议,不是中间件。例如,Kafka以后可以本地支持Rsocket。(目前我看不到这种迹象,但从技术上讲没有什么阻止它的。)

在哪些情况下推荐使用它们中的每一个?

如果你使用中间件的唯一原因是为了轻松生成和管理数据流(而不是受限于请求/响应),那么与反应式库配合使用的Rsocket现在在协议层面上可以说已经满足这些条件。

然而,如果你使用中间件进行解耦,则几乎肯定希望继续使用它。然而,继续使用该中间件当然并不妨碍你在实现中使用反应式库和/或Rsocket。


2
嗨,Michael,首先感谢您抽出时间撰写如此详细的答案。我完全同意您所说的一切。我的疑虑更多地与响应式框架(Spring Webflux + Project Reactor)在解耦微服务方面是否合适,而不是使用类似Kafka的东西来实现。目前存在一种“所有事件”趋势,我们希望通过消息传递来隔离有界上下文。在这种情况下,正如您所说,响应式应用程序并不适合。 - codependent
4
在这种情况下,共依赖的反应式应用程序 可能 很适合 - 但在我看来,它们不会很好地 替代 使用诸如RabbitMQ/Kafka/其他中间件。随着时间的推移,我认为我们会看到更多的反应式应用程序,但我非常怀疑这些应用程序会 取代 中间件,更有可能是相互补充。 - Michael Berry

7
RSocket的目的是提供一种应用程序到应用程序的通信协议,更像对等方彼此交谈。HTTP是为人机(客户端-服务器)通信设计的。即使是HTTP2或即将推出的HTTP3也不会改变这个观点。两个协议之间的主要区别之一是双向流。因此,RSocket并不仅仅是试图提高请求响应性能。
Kafka和反应式流之间的一个关键差异是基础设施成本的观点。Kafka将缓冲所有数据,而反应式流将使用反压力来协调发送方和接收方。RSocket只是将反应式流扩展到网络协议层。基本上,它是在第6层端到端的TCP滑动窗口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接