当前位置: 首页 > news >正文

新一代通信协议—— RSocket

一、简介

RSocket 是一种二进制字节流传输协议,位于 OSI 模型中的5~6层,底层可以依赖 TCP、WebSocket、Aeron 协议。最初由 Netflix 开发,支持 Reactive Streams。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP),HTTP 协议对于许多任务(如微服务通信)来说效率低下。

二、设计目标

  • 支持对象传输,包括 Fire-and-Forget、Request/Response、Request/Stream、Channel
  • 支持应用层流量控制
  • 支持单连接双向、多次复用
  • 支持连接修复
  • 更好的使用WebSocket和Aeron协议

三、消息驱动

网络通信是异步的,RSocket 协议包含这一点,并将所有通信建模为在单个网络连接(TCP)上的、多路复用的消息流,在等待响应时从不同步阻塞。

响应式宣言指出:

反应式系统依赖异步的消息传递,从而确保了松耦合、隔离、位置透明的组件之间有着明确边界。 这一边界还提供了将失败作为消息委托出去的手段。 使用显式的消息传递,可以通过在系统中塑造并监视消息流队列, 并在必要时应用回压, 从而实现负载管理、 弹性以及流量控制。 使用位置透明的消息传递作为通信的手段, 使得跨集群或者在单个主机中使用相同的结构成分和语义来管理失败成为了可能。 非阻塞的通信使得接收者可以只在活动时才消耗资源, 从而减少系统开销。

此外,HTTP/2 FAQ 很好地解释了在持久连接上采用多路复用的面向消息的协议的动机:

  • HTTP/1.x 有一个叫做 “head-of-line blocking(队头阻塞)” 的问题,在这种情况下,即在一个连接上一次只能有一个未完成请求。
  • HTTP/1.1 试图通过流水线(Pipelining)来解决这个问题,但它并没有完全解决这个问题(大的或慢的响应仍然会阻塞后面的其他响应)。此外,人们发现流水线很难部署,因为许多代理和服务器不能正确地处理它。

在HTTP/1中使用并发连接和域名分片来缓解HOL问题

  • 并发连接,浏览器针对每个源(域名)可以打开4-8个TCP连接,提升并发度。
  • 域名分片,浏览器和HTTP/1限制了并发连接的数量,那么就把多个域名指向一台服务器,从而提升连接数量。

这迫使客户端使用一些启发式方法(通常是猜测)来确定什么请求在什么时候放在与源站的哪个连接上;由于加载一个页面的次数通常是可用连接数量的10倍或者更多。这会导致被阻塞的请求“瀑布式”的增长,从而严重的影响性能。

多路复用通过允许多个请求和响应消息在一个连接上同时传输来解决这些问题;甚至可以将一条消息的部分与另一条消息的部分混合在一起。

使用HTTP/1,浏览器为每个源打开4-8个连接,由于许多站点使用多个源,这可能意味着打开单个页面要加载30多个TCP连接。

一个应用程序同时打开如此多的连接,打破了TCP所建立的许多假设;由于每个连接都会在响应中传输大量的数据,因此TCP缓冲区很大可能会溢出,从而导致拥塞事件和超时重传。

一个应用程序同时打开如此多的连接,此外,使用如此多的连接不公平地垄断了网络资源,“窃取”了其他性能更好的应用程序(如VoIP)的资源。

四、Interaction Models(交互模型)

不合适的协议会增加系统开发的成本。它可能是一个不匹配的抽象,但是我们必须将系统设计强加到他允许的交互模型中。这迫使开发人员花费额外的时间来解决它的缺点,以处理错误并获得可接受的性能。在多语言环境中,这个问题被放大了,因为不同的语言将使用不同的方法来解决这个问题,这需要团队之间的额外协调。到目前为止,通信协议事实上的标准是HTTP,它只支持请求/响应的交互模式。在某些情况下,这可能不是最理想通信模型。

一个例子是推送通知。使用request/respones交互模型,客户端必须使用轮训不断检查服务端的状态。应用程序每秒执行大量的请求,只是为了轮询,然后被告知没有适合它们的东西。这对于客户端、服务器、网络来说是巨大的浪费。花费金钱;并增加了基础设施的规模、运营的复杂性,从而提高了可用性。它还通常会增加用户接收通知时的延迟,因为轮询会缩减到更长的间隔以试图降低成本。

出于这个和其他原因,RSocket不仅仅局限于一个交互模型。下面描述的各种支持的交互模型为系统设计提供了强大的新可能性:

4.1 Fire-and-Forget(即发即弃)

即发即弃是请求/响应的优化,在不需要响应时很有用。它允许显着的性能优化,不仅仅是通过跳过响应来节省网络使用,而且还可以减少客户端和服务器的处理时间,因为客户端不需要记录和等待请求关联的响应和取消请求。

此交互模型对于支持有损的用例非常有用,例如非关键事件日志记录。

可以这样使用:

Future<Void> completionSignalOfSend = socketClient.fireAndForget(message);

4.2 Request/Response (single-response)(请求/响应(单响应))

仍然支持标准请求/响应语义,并且仍有望代表 RSocket 连接上的大多数请求。这些请求/响应交互可以被认为是优化的“只有 1 个响应的流”,并且是在单个连接上多路复用的异步消息。

消费者“等待”响应消息,所以它看起来像一个典型的请求/响应,但它从不同步阻塞。

可以这样使用:

Future<Payload> response = socketClient.requestResponse(requestPayload);

4.3 Request/Stream (multi-response, finite)(请求/流(多响应,有限))

从request/response延伸出来的是request/stream,它允许多条消息流回。将此视为“集合”或“列表”响应,但不是将所有数据作为单个响应返回,而是按顺序流回每个元素。

用例可能包括以下内容:

  • 获取视频列表
  • 在目录中获取产品
  • 逐行检索文件

可以这样使用:

Publisher<Payload> response = socketClient.requestStream(requestPayload);

4.4 Channel(通道)

通道是双向的,在两个方向上都有消息流。

受益于此交互模型的示例用例是:

  • 客户端请求一个数据流,该数据流最初会破坏当前的世界视图
  • 当发生变化时,增量/差异从服务器发送到客户端
  • 客户端随时间更新订阅以添加/删除标准/主题/等。

如果没有双向通道,客户端将不得不取消初始请求,重新请求并从头开​​始接收所有数据,而不是仅仅更新订阅并有效地获取差异。

可以这样使用:

Publisher<Payload> output = socketClient.requestChannel(Publisher<Payload> input);

五、协议形式

  • 连接上传输的数据是流(Stream)
  • 流(Stream)由帧(Frame)组成
  • 帧(Frame)包含了元数据(MetaData)与业务数据(Data)

基于 RSocket 协议,我们的业务数据会被打包成帧,并以帧流的形式在客户端与服务端互相传输。所以 RSocket 的所有特性都是基于这个帧流实现的。协议详情可以参考:https://rsocket.io/about/protocol

RSocket是一个二进制协议,也就是说在一个RSocket连接上传输的消息体对数据格式没有任何要求,应用程序可以为所欲为的压缩数据量的大小。

这样的二进制协议通常来说能给性能带来极大的提升,但是产生的代价是,网络中间件也会因为无法解读消息体中的数据,丧失了在对具体应用流量进行监控,日志和路由的能力。RSocket通过把每个消息体分成data和metadata的方式,在保证高效传输的前提下,提供了暴露少量元数据给网络中间件的能力。

对于每个data和metadata,应用可以采用不同的序列化方法。

  • data一般作为应用本身需要传递的业务数据,采取自定义的高效序列化方式,且对网络基础设施不可见。
  • metadata可以采用网络基础设施一致默认的格式。在分布式传输的过程中,这些中间件可以按需求对metadata进行读写,然后监控应用健康状况或者调整路由。

六、RSocket与其它协议有什么区别?

6.1 对比Http1.x

Http1.x只支持request/response,但是现实应用中并不是所有请求都需要有回应(Fire And Forget)、有的需求需要一个请求返回一个数据流(request/stream)、有的还需要双向数据传输(channel)。

6.2 对比Http2.x

http2.x不支持应用层流量控制、伪双向传输,即服务端push数据本质上还是对客户端请求的响应,而不是直接推送。RSocket做到了真正的双向传输,使得服务端可以调用客户端服务,使得服务端和客户端在角色上完全对等,即两边同时是Requester和Responder。

6.3 对比grpc

  • grpc需要依赖protobuf,本质上还是http2.x。RSocket不限制编解码,可以是xml、json、protobuf等。
  • 性能上grpc要差一些:详见压测对比,https://dzone.com/articles/rsocket-vs-grpc-benchmark

6.4 对比TCP

一个应用层的协议、一个传输层的协议,其实两者不在一个层面,为啥要作比较呢,因为netty让tcp层的编程也很容易,但是需要自定义传输协议,比如定义header、body长度等等,用起来还是很麻烦的。

6.5 对比WebSockets

websocket不支持应用层流量控制,本质上也是一端请求另一端响应,不支持连接修复。

七、RSocket适用于哪些场景?

  • 移动设备与服务器的连接
    • 数据双向传输,且支持流量控制。支持背压,背压的意思:如果客户端请求服务端过快,那么服务端会堆积请求,最终耗光资源。有了背压机制,服务端可以根据自己的资源来控制客户端的请求速度,即调用客户端告诉它别发那么快。
    • 支持连接修复,比如手机进地铁之后,网络断开一段时间,其他协议需要重新建立连接,RSocket则可以修复连接继续传输帧数据。
  • 微服务场景
    • spring cloud目前支持的http协议,不能fire and forget、不能请求流数据、不能单连接双向调用;替换成RSocket之后可以满足以上需求的同时提高性能。且针对服务治理、负载均衡等RSocket都在慢慢完善。
  • 由于微服务和移动设备的普及,RSocket火起来应该就是这几年的事儿,让我们拭目以待吧。

相关文章:

新一代通信协议—— RSocket

一、简介 RSocket 是一种二进制字节流传输协议&#xff0c;位于 OSI 模型中的5~6层&#xff0c;底层可以依赖 TCP、WebSocket、Aeron 协议。最初由 Netflix 开发&#xff0c;支持 Reactive Streams。其开发背后的动机是用开销更少的协议取代超文本传输协议(HTTP)&#xff0c;H…...

【编程实践】这个代码命名规范是真优雅呀!代码如诗!!(多读优秀的开源代码,多实践,你也可以一样优秀!)

目录 管理类命名 传播类命名 回调类命名 监控类命名 内存管理类命名 过滤检测类命名 结构类命名 常见设计模式命名 解析类命名 网络类命名 CRUD命名 其他 End 管理类命名 写代码&#xff0c;少不了对统一资源的管理&#xff0c;清晰的启动过程可以有效的组织代码…...

Linux->进程终止和等待

目录 1. 进程终止场景 1.1 进程退出码 1.2 进程常见退出方式 2. 进程等待 2.1 进程等待的必要性 2.2 进程等待的方式 wait()方式 waitpid()方式 options参数 status参数 1. 进程终止场景 代码运行完毕&#xff0c;结果正确 代码运行完毕&#xff0c;结果不正确 代码异…...

超店有数分享:tiktok数据分析工具推荐,助你成功出海!

现阶段的跨境电商人都纷纷入局tiktok&#xff0c;这是风口也是发展趋势。Tiktok的下载量已经超过了35亿&#xff0c;每月都有10亿用户活跃&#xff0c;在154国家/地区使用。Tiktok用户每天在平均花1小时左右进行浏览&#xff0c;打开率也很高。如今&#xff0c;tiktok也越来越成…...

2022 第十四届蓝桥杯模拟赛第三期(题解与标程)

第十四届蓝桥杯模拟赛第三期1. 最小的十六进制问题描述答案提交参考答案2. Excel的列问题描述答案提交参考答案3. 相等日期问题描述答案提交参考答案4. 多少种取法问题描述答案提交参考答案5. 最大连通分块问题描述答案提交参考答案6. 哪一天问题描述输入格式输出格式样例输入样…...

「TCG 规范解读」PC 平台相关规范(1)

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

HNU工训中心:直流电路测量分析实验报告

工训中心的牛马实验 实验目的 1.熟悉直流电路的测量和分析方法。 2.熟悉直流电源、电压表、电流表的使用法及其特性。 实验仪器和器材 1.实验仪器 直流稳压电源型号:IT6302 台式多用表型号:UT805A 2.实验&#xff08;箱&#xff09;器材 电路实验箱 元器件&#xff1a;电阻…...

tensorflow2.4--1.框架介绍

前言 虽然1.x版本tensorflow有很多项目都基于此构建&#xff0c;然而随着2.x版本的推出&#xff0c;很多架构已经发生了改变&#xff0c;代码发生了改变&#xff0c;同时很多模组已经废弃不用或者更新,tensorflow1.x已经不能再兼容最新的项目,与时俱进是必要的&#xff0c;因此…...

c++11 关键字 final 使用

写在最前。。。 请支持原创~~ 1. 功能 用以指定一个 virtual function 不能被派生类重写&#xff1b;或者指定一个 class 不能被继承&#xff1b;2. 语法 对于类中成员函数有两种情况&#xff1a; 只声明时&#xff0c;final 紧跟参数的右括号&#xff0c;如果是纯虚函数&a…...

力扣(LeetCode)426. 将二叉搜索树转化为排序的双向链表(2023.02.28)

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表&#xff0c;你可以将左右孩子指针作为双向循环链表的前驱和后继指针&#xff0c;第一个节点的前驱是最后一个节点&#xff0c;最后一个节点的后继是第一个节点。 特别地&#xff0c;我们希望可以…...

华为OD机试真题Python实现【玩牌高手】真题+解题思路+代码(20222023)

玩牌高手 题目 给定一个长度为N的整数数组,表示一个选手在N轮内选择的牌面分数, 选手基于规则选牌,请计算所有轮结束后其可以获得的最高总分数。 选择规则如下: 在每轮里选手可以选择获取该轮牌面,则其总分数加上该轮牌面分数为其新的总分数选手也可不选择本轮牌面,直接…...

“速通“ 老生常谈的HashMap [实现原理源码解读]

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 HashMap 实现原理&&源码解读 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f…...

Linux系统介绍及熟悉Linux基础操作

一、什么是Liunx Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&am…...

mysql数据库limit的四种用法

文章目录前言一、语法二、参数说明三、常用示例-4种用法总结前言 mysql数据库中limit子句可以被用于强制select语句返回指定的记录数。limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数&#xff0c;第一个参数指定第一个返回记录行的偏移量&#xff0c…...

嵌入式 linux 系统开发网络的设置

目录 一、前言 二、linux网络静态地址设置 前言 为什么要对linux系统下的ubuntu进行网络设置呢&#xff1f; 因为我们在嵌入式开发中&#xff0c;我们要保证windows系统、linux系统、开发板的ip要处于同一个网段&#xff0c;而默认ubuntu下的linux系统的ip是动态分配的&#…...

算法设计与分析——十大经典排序算法一(1--5)

目录 算法设计与分析——十大经典排序算法 第1关&#xff1a;冒泡排序 参考代码 第2关&#xff1a;选择排序 参考代码 第3关&#xff1a;插入排序 参考代码 第4关&#xff1a;希尔排序 参考代码 第5关&#xff1a;归并排序 参考代码 作者有言 一个不知名大学生&#x…...

六.慕课的冲击:知识何以有力量?

6.1知识就是力量?【单选题】关于技术进步,以下说法错误的是&#xff08; &#xff09;。A、技术进步可以不依靠知识积累B、知识的力量推动技术进步C、技术黑箱换句话说即是天上掉馅饼D、专利保护产生的垄断利润,构成创新动力我的答案&#xff1a;A【判断题】罗伯特索洛认为,技…...

SQL基础

sql基础笔记 DATEDIFF() 函数返回两个日期之间的时间。 DATEDIFF&#xff08;parameter1&#xff0c;parameter2&#xff0c;parameter3&#xff09; parameter1&#xff1a;可为 年月日时分秒或周 parameter2&#xff0c;parameter3&#xff1a;合法的日期 如&#xff1a…...

脏牛复现(CVE2016-5195)

nmap扫描全网段&#xff0c;发现存货主机&#xff0c;ip为192.168.85.141nmap 192.168.85.0/24nmap 扫描端口&#xff0c;发现80端口&#xff0c;访问该网站nmap -p1-65535 192.168.85.141扫描该网站目录&#xff0c;什么也没扫出来 &#xff0c;dirb扫描目录的字典在usr/share…...

Redis源码---内存友好的数据结构该如何细化设计

目录 前言 内存友好的数据结构 SDS 的内存友好设计 redisObject 结构体与位域定义方法 嵌入式字符串 压缩列表和整数集合的设计 节省内存的数据访问 前言 Redis 是内存数据库&#xff0c;所以&#xff0c;高效使用内存对 Redis 的实现来说非常重要而实际上&#xff0c;R…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...