然而,反应式编程社区也创建了一些优秀的项目,例如Project Reactor或RxJava,它们可以将HTTP通信转化为一种伪消息驱动的解决方案。此外,随着像RSocket这样的协议的出现,这种模型也已到达TCP/IP应用层。
那么,RSocket/反应式微服务在实际上是否可以被视为面向事件驱动的解决方案呢?它们不只是改进传统的请求-响应系统的性能的一种方式吗?
换句话说,这些RSocket+Reactor微服务与基于HTTP的微服务一样耦合吗?
在哪些情况下推荐使用它们?
这里有很多需要探讨的内容,因此对于篇幅长表示抱歉。
你的问题标题给出了一个虚假的二分法。实际上,这两个概念并不是竞争关系,相反它们彼此呼应,以至于 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。