RSocket 学习(一):初探

2,142 阅读3分钟

syed-ali-aqdas-JJL6_9RP2kw-unsplash.jpg

一. RSocket 介绍

RSocket 是一种二进制字节流传输协议,位于 OSI 七层模型中的5、6层,对应 TCP/IP 模型中的应用层。RSocket 并没有规定必须使用何种底层传输层协议,开发者可以使用不同的底层传输协议,包括 TCP、WebSocket 和 Aeron。

RSocket 采用二进制格式,从而保证了传输的高效、节省带宽。RSocket 中的 R 是指 Reactive。因此,通过基于响应式流语义的流控制,RSocket 保证了消息传输中的双方不会因为请求的压力过大而崩溃。

RSocket 支持常见的响应式框架:RxJava、Spring Reactor。

二. RSocket 特点

与传统的 Http 协议不同,RSocket 支持多种交互模型,例如流和推送,而不是整个单个连接上的简单请求/响应。

RSocket 还支持连接的恢复,它允许流在不同的传输连接上恢复,这在连接频繁断开、切换和重新连接时特别有用。特别是在移动端的场景下使用。

RSocket 特点包括如下:

  • 消息驱动:RSocket 的网络通信是异步的,并将所有通信建模为单个网络连接上的多路消息流,并且在等待响应时从不同步阻塞。
  • 多种交互模型:RSocket 包括四种交互模型 Fire-and-Forget、Request/Response、Request/Stream、Channel。
  • 取消:所有流(包括请求/响应)都支持取消,以便高效地清理服务器(响应者)资源。
  • 可恢复性:RSocket 支持会话恢复,允许通过简单的握手通过新的传输连接恢复客户机/服务器会话。
  • 应用程序流程控制:RSocket 支持两种形式的应用程序级流控制,以帮助保护客户端和服务器资源不被淹没:“响应流” request(n) 异步拉取和租用。
  • 多语言支持:支持 Java、Kotlin、JavaScript、Go、.Net、C++。
  • 传输层灵活性:RSocket 允许开发者根据环境、设备功能和性能需求使用不同的底层传输层。
  • 效率与性能:低效率地使用网络资源的协议(重复握手和连接设置以及降低开销、臃肿的消息格式等)会极大地增加系统的感知延迟。此外,如果没有流控制语义,当依赖服务的速度减慢时,一个写得不好的模块可能会溢出系统的其余部分,从而可能导致重试风暴,给系统带来进一步的压力。Hystrix 是一个试图解决同步请求/响应问题解决方案。然而,它的开销和复杂性是有代价的。RSocket 通过支持非阻塞、双工、异步应用程序通信,并通过对来自任何语言的多个传输进行流控制,减少感知延迟并提高系统效率。RSocket 使用二进制编码提高 CPU 和内存效率,避免握手和相关的往返网络开销。

三. RSocket 使用的术语

  • Frame: 包含请求、响应或协议处理的单个消息。
  • Fragment: 应用程序消息的一部分,已被分区以包含在一个帧中。
  • Transport: 用来传输 RSocket 协议。包括 WebSockets、TCP 或 Aeron 之一。
  • Stream: 操作单元(请求/响应等)。
  • Payload: 流消息(上游或下游)。包含与先前请求创建的流关联的数据。在响应流和 Rx中,相当于是“onNext”事件。
  • Complete: 在流上发送的终端事件,表示成功完成。在响应流和 Rx 中,相当于是“onComplete”事件。
  • Connection: 客户端和服务器之间传输会话的实例。
  • Requester: 发送请求的一方。一个连接最多有2个请求者,每个方向一个。
  • Responder: 接收请求的一方。一个连接最多有2个响应者,每个方向一个。

该系列的相关文章:

RSocket 学习(二):HTTP VS WebSocket VS RSocket