netty实现简单时事通讯_使用 RSocket 进行反应式数据传输

2023-11-01

在微服务架构中,不同服务之间通过应用协议进行数据传输。典型的传输方式包括基于 HTTP 协议的 REST 或 SOAP API 和基于 TCP 字节流的 gRPC 等。HTTP 协议的优势在于其广泛的适用性,有非常多的服务器和客户端实现的支持,但 HTTP 协议本身比较简单,只支持请求-响应模式。gRPC 等基于 TCP 的协议使用二进制字节流传输,保证了传输的效率。不过 gRPC 基于 HTTP/2,不支持其他传输层实现。HTTP/2 协议使用了二进制字节流,但是并没有改变 HTTP/1 协议已有的语义,更多的只是改变了传输时的格式。已有应用协议的问题在于单一的交互模式,只支持请求-响应模式,而此模式对于很多应用场景来说是不合适的。典型的例子是消息推送,以 HTTP 协议为例,如果客户端需要获取最新的推送消息,就必须使用轮询。客户端不停的发送请求到服务器来检查更新,这无疑造成了大量的资源浪费。虽然服务器发送事件(Server-Sent Events,SSE)可以用来推送消息,不过 SSE 是一个简单的文本协议,仅提供有限的功能。此外,WebSocket 可以进行双向数据传输,不过它没有提供应用层协议支持。请求-响应模式的另外一个问题是,如果某个请求的响应时间过长,会阻塞之后的其他请求的处理。RSocket 协议的出现,很好的解决了已有协议的这些问题。

RSocket 介绍

RSocket 是一个 OSL 七层模型中 5/6 层的协议,是 TCP/IP 之上的应用层协议。RSocket 可以使用不同的底层传输层,包括 TCP、WebSocket 和 Aeron。TCP 适用于分布式系统的各个组件之间交互,WebSocket 适用于浏览器和服务器之间的交互,Aeron 是基于 UDP 协议的传输方式,这就保证了 RSocket 可以适应于不同的场景。使用 RSocket 的应用层实现可以保持不变,只需要根据系统环境、设备能力和性能要求来选择合适的底层传输方式即可。RSocket 作为一个应用层协议,可以很容易在其基础上定义应用自己的协议。此外,RSocket 使用二进制格式,保证了传输的高效,节省带宽。而且,通过基于反应式流语义的流控制,RSocket 保证了消息传输中的双方不会因为请求的压力过大而崩溃。

RSocket 交互模式

RSocket 支持四种不同的交互模式,见表 1。

表 1. RSocket 支持的四种交互模式

模式

说明请求-响应(request/response)

这是最典型也最常见的模式。发送方在发送消息给接收方之后,等待与之对应的响应消息。

请求-响应流(request/stream)

发送方的每个请求消息,都对应于接收方的一个消息流作为响应。

发后不管(fire-and-forget)

发送方的请求消息没有与之对应的响应。

通道模式(channel)

在发送方和接收方之间建立一个双向传输的通道。

下面介绍 RSocket 协议的具体内容。

RSocket 帧

RSocket 协议在传输时使用帧(frame)来表示单个消息。每个帧中包含的可能是请求内容、响应内容或与协议相关的数据。一个应用消息可能被切分成多个片段(fragment)以包含在一个帧中。根据底层传输协议的不同,一个表示帧长度的字段可能是必须的。由于 TCP 协议没有提供帧支持,所以 RSocket 的帧长度字段是必须的。对于提供了帧支持的传输协议,RSocket 帧只是简单的封装在传输层消息中;对于没有提供帧支持的传输协议,每个 RSocket 帧之前都需要添加一个 24 字节的字段表示帧长度。

RSocket 帧的内容

在每个 RSocket 帧中,最起始的部分是帧头部,包括 31 字节的流标识符,6 字节的帧类型和 10 字节的标志位。RSocket 协议中的流(stream)表示的是一个操作的单元。每个流有自己唯一的标识符。流标识符由发送方生成。值为 0 的流标识符表示与连接相关的操作。客户端的流标识符从 1 开始,每次递增 2;服务器端的流标识符从 2 开始,每次递增 2。在帧头部之后的内容与帧类型相关。

RSocket 帧的类型

RSocket 中定义了不同类型的帧,见表 2。

表 2. RSocket 中的帧类型

帧类型

说明SETUP

由客户端发送来建立连接,流标识符为 0。

REQUEST_RESPONSE

请求-响应模式中的请求内容。

REQUEST_FNF

发后不管模式中的请求内容。

REQUEST_STREAM

请求-响应流模式中的请求内容。

REQUEST_CHANNEL

通道模式中的建立通道的请求。发送方只能发一个 REQUEST_CHANNEL 帧。

REQUEST_N

基于反应式流语义的流控制,相当于反应式流中的 request(n)。

PAYLOAD

表示负载的帧。通过不同的标志位来表示状态。NEXT 标志位表示接收到流中的数据,COMPLETE 标志位表示流结束。

ERROR

表示连接层或应用层错误。

CANCEL

取消当前请求。

KEEPALIVE

表示连接层或应用层错误。

KEEPALIVE

启用租约模式。

METADATA_PUSH

异步元数据推送。

RESUME

在连接中断后恢复传输。

RESUME_OK

恢复传输成功。

EXT

帧类型扩展。

RSocket 中的负载分成元数据和数据两种,二者可以使用不同的编码方式。元数据是可选的。帧头部有标志位指示帧中是否包含元数据。某些特定类型的帧可以添加元数据。

RSocket 帧交互

根据不同的交互模式,发送方和接收方之间有不同的帧交互,下面是几个典型的帧交互示例:

在请求-响应模式中,发送方发送 REQUEST_RESPONSE 帧,接收方发送 PAYLOAD 帧并设置 COMPLETE 标志位。

在发后不管模式中,发送方发送 REQUEST_FNF 帧。

在请求-响应流模式中,发送方发送 REQUEST_STREAM 帧,接收方发送多个 PAYLOAD 帧。设置 COMPLETE 标志位的 PAYLOAD 帧表示流结束。

在通道模式中,发送方发送 REQUEST_CHANNEL 帧。发送方和接收方都可以发送 PAYLOAD 帧给对方。设置 COMPLETE 标志位的 PAYLOAD 帧表示其中一方的流结束。

除了发后不管模式之外,其余模式中的接收方都可以通过 ERROR 帧或 CANCEL 帧来结束流。

流控制

RSocket 使用 Reactive Streams 语义来进行流控制(flow control),也就是 request(n)模式。流的发送方通过 REQUEST_N 帧来声明它允许接收方发送的 PAYLOAD 帧的数量。REQUEST_N 帧一旦发出就不能收回,而且所产生的效果是累加的。比如,发送方发送 request(2)和 request(3)帧之后,接收方允许发送 5 个 PAYLOAD 帧。

除了基于 Reactive Streams 语义的流程控制之外,RSocket 还可以使用租约模式。租约模式只是限定了在某个时间段内,请求者所能发送的最大请求数量。

Java 实现

RSocket 提供了不同语言的实现,包括 Java、Kotlin、JavaScript、Go、.NET 和 C++ 等。对 Java 项目来说,只需要添加相应的 Maven 依赖即可。RSocket 的 Java 实现库都在 Maven 分组 io.rsocket 中。其中常用的库包括核心功能库 rsocket-core 和表 3中列出的传输层实现。本文中使用的版本是 1.0.0-RC3。

表 3. RSocket 的传输层实现

Maven 实现库名称

底层实现

支持协议rsocket-transport-netty

Reactor Netty

TCP 和 WebSocket

rsocket-transport-akka

Akka

TCP 和 WebSocket</

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

netty实现简单时事通讯_使用 RSocket 进行反应式数据传输 的相关文章

  • C语言小游戏——推箱子(基础版)

    推箱子 1 游戏界面 2 游戏说明 3 程序分析 4 整个游戏源代码 1 游戏界面 2 游戏说明 贪吃蛇游戏按键说明 升级版的功能 可以进行通关模式 通过方向键WSAD键或者上下左右键 可以改变人移动方向的改变 3 程序分析 第一部分 绘制
  • 支付宝网页支付交互流程 nest 版

    自己整理了一份支付宝网页支付的交互流程 完全按交互流程响应步骤介绍的代码 效果图 因为平时主要用node开发 所以服务端用的node 框架是 nest 用最精简的代码实现支付功能 1 流程图 为了让下面的交互流程更清楚点 做了一张 简单粗暴
  • ESP32 CAM学习记录 (1) ——安装开发环境及烧录固件至ESP32-CAM开发板(虚拟机开发篇)

    本次开发使用安信可官方提供的开发环境 直接在windows下用虚拟机进行开发 1 搭建开发环境 开发环境连接 https pan baidu com s 1hWJAfeDQbYiD01X6eyqgMw 用 vmware12打开虚拟机 导入安
  • 自然语言处理入门指北 之 one-hot

    自然语言 Natural Language 通常是指一种自然地随文化演化的语言 例如 汉语 英语 日语都是自然语言的例子 与编程语言等为计算机而设的 人造 语言相对 自然语言无法直接被计算机等 理解 在这个前提下 如何让计算机认识 学习乃至
  • vue 的 el-table-infinite-scroll下拉加载

    使用el table infinite scroll 插件 安装插件 npm install save el table infinite scroll 全局引入并注册 main js import elTableInfiniteScrol
  • python基础:字典常用函数和方法

    字典 dictionary dict 字典的每个元素都是由一个key和一个value组成的 键 值 键是唯一的 且键是不可变数据类型 值是可以任意的 数据类型任意 且值可以重复 创建一个字典 dic aa aa的值 bb bb的值 cc c
  • Macbook M1和M2芯片安装Miniconda3、添加镜像和R的安装(超详细,解决PackagesNotFoundError,CondaSSLError: 报错问题)

    0 前言 前段时间由win换了Mac电脑 成功安装了一堆win上的软件 PS AI Office等等 因为之前win11上一直用的wsl2并装了miniconda3 体验感也是不错 就想着苹果电脑自家内置shell应该装个miniconda
  • 大脑视觉信号被Stable Diffusion复现图像!“人类的谋略和谎言不存在了”

    丰色 萧箫 发自 凹非寺量子位 公众号 QbitAI 现在Stable Diffusion已经能重建大脑视觉信号了 就在昨晚 一个听起来细思极恐的 AI读脑术 研究 在网上掀起轩然大波 这项研究声称 只需用fMRI 功能磁共振成像技术 相比
  • 华为OD真题2023新题库(机试通知上写着--A卷2022Q4)

    华为od最近又开始招人了 对于目前市场上行情来看 虽然去od加班可能多 但工资还是可以的 大环境不好都开始卷了 od对于目标院校机试成绩比较低150分 2023年好像又涨了 其他非目标院校350 wx外包300 当你收到邮件 试卷名称 A卷
  • 移动端UI兼容性测试利器-Hydra

    导读 尽管自动化测试技术日新月异 但是自动化case构建成本 执行稳定性等问题的存在 使手工测试依然移动端质量保证的重要手段 传统手工测试必须通过人工操作的方式执行测试用例 效率提升依赖测试人员的操作熟练度 本文从介绍百度内UI兼容性测试现
  • linux系统下nginx的安装

    文章目录 一 安装nginx依赖 二 下载并解压nginx安装包 三 安装nginx 四 配置环境变量 五 启动 六 浏览器访问 七 停止重启nginx 八 设置开机自启动nginx 九 防火墙设置 十 卸载nginx 一 安装nginx依
  • Quartz的12张数据库表说明

    参考地址 https www e learn cn en share 3471635 https blog csdn net xiaoniu 888 article details 83181078 表说明 1 1 qrtz blob tr
  • YOLOv5的介绍

    YOLOv5 You Only Look Once version 5 是一种目标检测模型 用于在视频或图像中识别和定位物体 它是YOLO You Only Look Once 算法的最新版本 在YOLOv4的基础上进行了改进 YOLOv5
  • java的几种基本数据类型及其大小

    Java中的四类八种基本数据类型 第一类 整数类型 byte short int long 第二类 浮点型 float double 第三类 逻辑型 boolean 它只有两个值可取true false 第四类 字符型 char 按照字节排
  • 《Python入门到精通》time模块详解,Python time标准库,time库函数大全

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 小白零基础 Python入门到精通 time模块详解 1 获取操作 time time 获取时间戳 float ti
  • ionic android app打包和发布

    1 项目信息 angular 10 0 14 ionic 5 4 3 gradel 6 5 cordova 10 0 0 node 12 14 0 visual studio code 1 68 1 项目代码 http 192 168 1
  • Unity2D Mesh水

    学生一枚 买不起pro 也懒得破解 不能用unity自带的water组件做水 所以用LineRenderer Mesh Sin函数苟了一个 为什么不用shader做 因为用Mesh的方法更容易添加碰撞 浮力组件 表面效应组件的效果 用sha
  • Spring-全面详解(学习总结)

    Spring 1 简介 1 1 简介 简介 Spring 春天 gt 给软件行业带来了春天 2002年 Rod Jahnson首次推出了Spring框架雏形interface21框架 2004年3月24日 Spring框架以interfac
  • 2022FPGA创新设计竞赛选题分析与建议——写给大一大二学弟学妹

    0 写在最前 老师新带了几个大一大二的同学准备参加FPGA创新设计竞赛 他们不具备太多的参赛经验 往往专业知识也没有学太多 有一颗想参赛的心 却又茫然不知所措 因此 此文希望对于大一大二的科创萌新有所帮助 1 关于选题 1 1 选题分析 2

随机推荐