一. 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个响应者,每个方向一个。