Websockets与Reactive套接字

Aru*_*thi 9 websocket reactive rsocket

我最近遇到过"反应套接字"一词.到目前为止,我曾经认为websockets是完全成熟的异步风格的方法.

什么是无功插座.

这个链接(http://reactivesocket.io/)甚至讨论了websockets的比较.

Sre*_*ith 12

WebSocket 和 RSocket 都是具有双向、多路复用、双工通信的协议。但两者都在不同的层面上发挥作用。

WebSocket 是一种基于 TCP 的低级通信协议。它定义了如何将字节流转换为帧。但是 WebSocket 消息本身没有关于如何路由或处理它的说明。因此,我们需要在 websocket 之上运行的消息协议,在应用层实现双向通信。

RSocket是一种完全反应式的应用程序级协议,它运行在字节流传输上,例如 TCP、WebSocket、UDP 或其他。它通过网络提供应用程序流控制,以防止中断并提高弹性。RSocket 采用具有非阻塞背压的异步流处理思想,其中发生故障的组件将不是简单地丢弃流量,而是将其压力传达给上游组件,让它们减轻负载。


gre*_*ker 8

什么是RSocket?

RSocket在网络边界上实现了Reactive Streams规范。它是具有帧,会话恢复和内置反压功能的应用程序级通信协议,可在网络上运行。

RSocket与传输无关。RSocket可以在Websockets,TCP,HTTP / 2和Aeron上运行。

RSocket与Websockets有何不同?

Websocket不提供应用程序级背压,仅提供基于TCP的字节级背压。Websocket也仅提供框架,不提供应用程序语义。开发人员应建立与Websocket交互的应用程序协议。

RSocket提供了框架,应用程序语义,应用程序级背压,并且它不受特定传输的约束。

有关创建RSocket的动机的更多信息,请在RSocket网站上查看动机文档

  • 当然,字节级背压是接收者说“向我发送 x 字节数”的地方。应用程序级背压是接收者说“向我发送 x 数量的域或请求对象”的地方 (9认同)
  • gregwhitaker 请帮助理解什么是应用程序级背压和字节级背压?如果你能用例子来解释那就太好了。 (2认同)
  • 动机链接不起作用。这是正确的:https://rsocket.io/about/motivations (2认同)

m.o*_*hov 5

网络套接字

TLDR:L4 协议,用于网络的 TCP。

Websocket 是单字节流、基于帧的协议,具有非常紧凑的标头。

它在每个重要的协议方面都依赖于 web/http:基于 http 的握手(完整往返,延迟不理想)、除二进制帧之外的文本帧、压缩支持(用于低吞吐量/高延迟连接)、强制帧内容屏蔽与传统的非 tls http 代理兼容。

帧可以被分段,以便客户端和服务器更好地利用内存;

流量控制仅来自 TCP 的字节级别,并且不会传播到用户空间。

由于 websocket 只是单字节流传输,因此它需要完整的应用程序协议才能发挥作用,并且应用程序级流量控制方案才能可扩展。

采用明智的方式,稳定的 websocket 实现可用于大多数操作系统/架构,所有浏览器都支持该协议,并且如果任何流量需要在互联网跳跃中生存,则该协议是首选解决方案。

RSocket。理论

TLDR:L5 协议,主要是云/数据中心通信,具有出色的吞吐量/延迟特性:巨大的吞吐量,同时保持延迟<几毫秒。

RSocket 是会话层协议,通过任何能够按顺序传输字节的传输(tcp、unix 套接字以及 websocket)提供复用流控制的二进制消息流。

低延迟是基石,协议为此提供了多种功能:

  • 2 个级别的流量控制:单个流级别上的反应流、连接级别上的请求租赁。租赁是响应方使用服务和连接延迟统计数据控制活动流数量的功能。
  • 即时握手:客户端可以在初始设置消息后立即发送请求。
  • 消息碎片有助于减少服务器内存压力并改善大消息的延迟(如果做得正确,请参见RSocket. Practice下文)。
  • 会话恢复:减少客户端重新连接的延迟。

因为二进制流交互/多路复用是开箱即用的,所以在顶部实现应用程序 RPC 很简单 - 只需要数据序列化/反序列化(使用 protobuf 数据编码的mstreams-rpc)。

该协议在语义上与 http2 兼容,这意味着它也与 GRPC 兼容(给定 protobuf 用于消息编码)。

RSocket。实践

仅在 JVM 上有用,因为反应流在 JVM 上很流行,并且在几个稳定的实现中实际上很有用:rxjava、project-reactor、smallrye-mutiny。

RSocket/RSocket-java基于springboot的project-reactor。

自然的期望是一流的吞吐量,不幸的是 RSocket/RSocket-java没有做到这一点,因此在 http2 之上的性能 比 10 多年前的 GRPC(其前身 Stubby 从 ~2001 年开始使用):闲聊的 Web 协议。

碎片:没有服务器内存使用或延迟改善,因为 RSocket/RSocket-java 以毫无意义的方式实现它 - 帧在传递到下游之前总是重新组装。

GRPC 兼容性:不存在。

2022 年建议:更好地坚持使用 GRPC。