干货 | 携程酒店RSocket实践

背压-相关技术及概念笔记 背压-相关技术及概念笔记。 阅读详情

作者简介

刘诚,携程酒店研发性能架构师。2014年加入携程,致力于通过架构的演进,控制企业硬件成本。

一、初识RSocket

在QCon2019北京大会上第一次得知RSocket。印象深刻的是Netifi公司通过他们研发的RSocket帮助企业实现微服务,在40,000RPS的场景下,Istio需要每月3495美金,而Netifi每月只要388美金,同时性能提升10倍,这无疑对任何企业都是极具吸引力的。

Netiffi的创始人在会上也谈到,使用Netiffi的Broker,得益于RSocket协议,无需独立部署监控、服务发现、健康检查、负载均衡等等中间件。如果是跨云部署,例如谷歌云与亚马逊云之间,或者亚马逊云与企业本地数据中心,都只要通过Netiffi的Broker即可无缝沟通,无需处理复杂的适配问题。

回来查询了不算丰富的资料后发现,Istio的技术专家发文称RSocket Broker的service mesh比Istio有将近10倍的速度提升。考虑到Istio专家的观点还有一定说服力的,那么RSocket真的有那么厉害?

二、RSocket生产实践

我们决定到生产上面去实践RSocket,看看性能到底如何。现在已经支持RSocket的service框架有Spring Flux:

640?wx_fmt=png

 

Dubbo3.0 snapshot

640?wx_fmt=png

压测对比的是Dubbo2.7。Dubbo2.7的样例代码如下:

640?wx_fmt=png

Dubbo3的样例代码如下:

640?wx_fmt=png

SpringFlux的样例代码如下:

640?wx_fmt=png

分别压测QPS200,400和800的情况,结果显示CPU、内存和响应时间基本一致。是不是压测方式有问题,为什么性能一点也没有提高?


三、RSocket的定义

在解答上面的问题之前,我们先来看看RSocket到底是什么?

官方定义:RSocket是基于reactive stream flow control的双向的、多路的、基于消息的、二进制通讯协议。它提供了4种交互模式:

  • request - response:一个请求,一个响应。现在的Restful服务既是如此;

  • fire-and-forget:对于那些不关心结果的请求,直接返回;

  • request – stream:一个请求,多次结果返回;

  • channel:服务器可以发多个请求给客户端,客户端也可以发多个结果给服务器;

几个特点:

  • 可取消:请求和响应都可取消,能够高效的清理系统资源;

  • 可中断后继续:如果被调用方卡住了,请求方可断开后,过一会再过来重试;

  • 可租赁:响应者可根据自己的实际情况来控制调用方的频率,其实就是响应式编程中的背压的实现;

上面只是定义了RSocket协议,在具体的实现上面是非常灵活的。

进一步查询资料后发现,现有JAVA的RSocket实现一般都是基于TCP长连接。熟悉Dubbo的朋友,立刻就会想到Dubbo不就是基于TCP长连接进行服务调用的么。是的,但是不同之处在于RSocket是一系列的协议规范,原先的Dubbo虽然也是基于TCP长连接实现的,但是并没有完全按照RSocket的规范来进行实现。

更加确切的来说,那个时候应该还没有RSocket。这个也就帮助我们理解为什么Dubbo3开始接入RSocket,以及阿里为什么也是RSocket的拥护者之一。至此就能理解为什么性能没提高了,在我们实践的场景中,只是把原来基于HTTP的请求方式变成了基于TCP的实现。就生产结果而言,并没有性能大幅提升,更别提10倍的提升。

那RSocket只有TCP长连接的优势?


四、RSocket协议的业务开发优势

作为一名一线业务开发者,可能更关心的是使用RSocket协议写业务代码时的优劣势。就我个人而言,感觉还是很棒的。例如下面这个传入参数为Mono,返回也为Mono类型的接口定义方式。

640?wx_fmt=png

熟悉响应式编程的同学应该知道Mono是Pivotal Reactor Core中的一种类型。是一种特殊的发布者,最多只发布一次。

640?wx_fmt=png

如果应用本身就是以非堵塞的方式写的,那这里就可以直接使用reactor core的所有API。当然也有同学会说,即使不返回Mono,例如Dubbo2.7中的返回CompletableFuture,我们只要自己内部转换一下即可。然后应用里面照样可以使用reactor core或者rxjava等响应式编程的框架。

的确如此,但是如果是Flux呢?可以多次、不断地往流里面写入结果的呢?CompletableFuture还能支持么?显然不行。因为flux本身就定义为最多可以发布n次。

640?wx_fmt=png

那为什么要用flux?

flux是响应式编程中的一种常用对象,其实就是request -> stream一种实现。一个请求发起后,结果可以分批写回。好处是什么?例如:A服务调用B服务,B服务调用C和D服务,但是D服务很慢,如果是request -> response模式,那必须要等到C和D完成后,才能返回结果给A。如果是Request -> stream模式,则可以先把C的结果返回给A,然后等D的结果拿到了,在返回给A。这样就可以高效的利用系统资源,减少等待。

熟悉Dubbo的同学可能会说,request -> stream这种模式也不是RSocket独有的吧,例如Dubbo就可以使用下面的方式来实现:

640?wx_fmt=png

看完上面的代码,然后我们可以思考一下如何用上面提供的API去实现下面的功能。你就会发现flux的这种Reactive Functional Programming的编程方式大大降低了编程的难度与代码量,提升了代码的可读性:

640?wx_fmt=png

但是这还不是全部的好处,下面我们来看看RSocket的另外一种使用场景。


五、RSocket的展望

响应式编程中有一个比较有名的功能叫背压。例如:当上游服务调用下游服务,而下游服务来不及处理的时候,可以选择性的限制上游服务的调用。

640?wx_fmt=png

而我们日常在刷手机的时候,经常会由于手机卡顿,无论是APP导致的还是网络导致的,重复点击或者刷新页面的情况。而HTTP本身是无状态的,所以只要有请求,无论是有效的还是无效的,服务器都会进行处理直到完成。

但是如果有背压,那我们就可以一定程度上减少APP的无效和重复的请求。

例如:用户查看订单列表,如果一下子过来10个请求,其实只要返回最后一个即可,前面9个都可以忽略。如果实现了,服务器就会减少流量,对硬件成本的控制有着非常积极的作用。InfoQ的文章中就提到:Facebook的工程师现在就是这样实现APP与服务器之间的通讯。

之所以称之为展望,因为这个也是我们下一个实践的目标。

参考资料

   


大数据与人工智能沙龙

8月24日上海

火热报名中

↓↓↓

640?wx_fmt=png

【推荐阅读】

640?wx_fmt=jpeg

【自动驾驶学习笔记——Prescan和Simulink 学习笔记和问题记录(1)】 主要记录一些Prescan/Simulink 联合仿真出现的问题。 阅读详情

相关推荐

Agent Skills:AI智能体规模化落地的基础设施

摘要:AgentSkills体系已成为AI智能体落地的核心基础设施,解决了能力扩展和行业知识沉淀两大核心难题。该开放标准通过语义优先、渐进式披露等设计原则,实现了工具调用的标准化和可控化,同时支持轻量化知识沉淀。Skill作为最小能力单元,将传统软件功能、行业知识等封装为可被智能体调用的标准化模块,推动了软件产业从"工具时代"向"智能体时代"的范式变革。目前该体系已被主流Agent工具广泛兼容,形成完整生态,未来将持续演进,进一步降低落地门槛,推动AI原生转型。

技术引领业务创新 1158

spring响应式编程13 RSocket:一种新的高性能网络通信协议

前面几讲我们讨论了如何使用 WebFlux 构建响应式 Web 服务的实现方案。WebFlux 和 WebMVC 一样,都是基于 HTTP 协议实现请求-响应式的交互方式。这种交互方案很简单,但不够灵活,也无法应对所有的响应式应用场景。那么,有没有在网络协议层上提供更加丰富的交互方式呢?答案是肯定的,那就是我们今天要讨论的 RSocket 协议。这一讲,我将从 RSocket 协议的特性、交互模式以及与主流开发框架之间的集成等几个方面来和你讨论,相信学完之后,你就会发现。

sucaiwa的博客 1734

华中科技大学计算机组成原理-单总线CPU设计(全部通关)

【计算机组成原理】 单总线CPU实验 华中科技大学-计算机组成原理 实验三 单总线CPU设计 第1关 MIPS指令译码器设计 第2关 单总线CPU微程序入口查找逻辑 第3关 单总线CPU微程序条件判别测试逻辑 第4关 单总线CPU微程序控制器设计 第5关 采用微程序的单总线CPU设计 第6关 现代时序硬布线控制器状态机设计 第7关 现代时序硬布线控制器设计

紫荆鱼的博客 4万+

新一代通信协议—— RSocket

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

riemann_的博客 3860

eNSP-Pro配置又丢了?手把手教你用导出功能防患于未然

本文详细介绍了eNSP-Pro配置防丢失的全套方案,包括运行时内存、虚拟存储设备和宿主机文件系统的配置存储机制,以及多维度备份策略和特殊场景下的恢复技巧。通过优化保存流程、自动化定时导出和版本化管理,帮助网络工程师有效防止配置丢失,提升工作效率。

weixin_42665725的博客 239

pi/4QPSK调制解调原理

文章目录1. π/4\pi/4π/4QPSK 信号的调制原理2. 匹配滤波器与成形滤波器 1. π/4\pi/4π/4QPSK 信号的调制原理 减小相位突变量的QPSK由偏置键控QPSK(OK-QPSK)和 π/4\pi/4π/4偏置的QPSK( π/4\pi/4π/4QPSK)。由于 π/4\pi/4π/4QPSK是用差分相位编码产生的(因此也叫做 π/4\pi/4π/4DQPSK),能有效地进行差分解调和鉴频器解调,在一些不易提取相干载波的场合很有用。 在常规的QPSK中,输入数据经过串/并变换后,分成

gemengxia的博客 2万+

RSocket协议初识(一)

前言 前几天无聊翻SpringBoot官方文档,无意中发现文档中增加了一个章节叫RSocket协议的鬼东西,遂研究了一下。 RSocket是什么? RSocket是一种二进制字节流传输协议,位于OSI模型中的5~6层,底层可以依赖TCP、WebSocket、Aeron协议。 RSocket设计目标是什么? 1、支持对象传输,包括request\response、request\stream、fir...

后厂村老司机 2587

PHM 2010数据集解读

PHM数据挑战赛是一项面向所有潜在与会者的竞赛。今年的挑战集中在使用测力仪、加速度计和声发射数据估计高速数控铣床刀具的RUL上。 博客对PHM 2010数据集的组成和信号进行了可视化。

cnjs1994的博客 7647

RSocket协议初识

文章目录前言RSocket是什么?RSocket设计目标是什么?RSocket与其他协议有什么区别?对比Http1.x对比Http2.x对比grpc对比TCP对比WebSocket结论RSocket适用于哪些场景?1、移动设备与服务器的连接。2、微服务场景。3、由于微服务和移动设备的普及,RSocket火起来应该就是这几年的事儿。 前言 前几天无聊翻SpringBoot官方文档,无意中发现文档中增加了一个章节叫RSocket协议的鬼东西,遂研究了一下。 RSocket是什么? RSocket是一种二进制字节

jast 1232

基于深度学习YOLOv10的障碍物检测系统

为了方便用户使用,我们将开发一个图形用户界面(GUI),允许用户上传图像或视频流并查看检测结果。我们使用PySide6开发GUI界面,它是Qt框架的Python绑定,适用于开发跨平台的桌面应用程序。本文详细介绍了如何基于YOLOv10模型构建一个障碍物检测系统,包括数据集准备、模型训练和推理到图形用户界面的开发。通过这一系统,用户可以方便地上传图像或视频流并进行障碍物检测,广泛应用于自动驾驶、机器人导航等领域。

斌擎科技 1052

OpenClaw 子代理配对失败问题分析与解决方案

OpenClaw子代理配对失败问题分析与解决方案 问题核心在于agent设备权限不足,仅有operator.approvals权限而缺少operator.admin权限,导致子代理启动时形成权限死锁。本文提供三种解决方案: 直接编辑设备配对文件(推荐):修改本地JSON文件,为agent设备添加完整operator.admin权限,操作简单快捷。 标准重新配对流程:删除现有agent设备后重新配对,通过正常审批流程获取完整权限,符合系统安全设计。 修改源码降低权限要求(仅限开发环境):调整子代理代码避免强制

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 148

springboot学习(四十) springboot下rsocket的使用

RSocket RSocket是一个二进制的协议,以异步消息的方式提供4种对等的交互模型,以字节流的方式运行在TCP, WebSockets, Aeron等传输层之上。RSocket专门设计用于与Reactive风格应用配合使用,这些应用程序基本上是非阻塞的,并且通常(但不总是)与异步行为配对。它是传输无关的,支持 TCP、WebSocket和Aeron UDP协议,并支持无语义损失的混合传输协议——回压和流量控制仍然有效。 它还支持连接恢复。当你建立 RSocket 连接时,你可以指定前一个连接的 ID.

文若书生的专栏 1522

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

rscocket

官网 https://rsocket.io/ example C++ server: // RSocket server accepting on TCP auto rs = RSocket::createServer(TcpConnectionAcceptor::create(FLAGS_port)); // global request handler auto handler = std::make_shared<HelloStreamRequestHandler>

kevin_darkelf的专栏 239

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring WebFlux (6): RSocket 服务实现

RSocket官网:https://rsocket.io/ RSocket是一种二进制协议,可用于字节流传输,例如TCP,WebSockets和Aeron。 提供了四中交互模式: request/response (stream of 1) 请求/响应(单响应)大多数请求就是这种模式,仅1个响应的流,是在单个连接上多路复用的异步消息 request/stream (finite stream of many) 可以将其视为“集合”或“列表”响应,但不是将所有数据作为单个响应返回,而是按顺序流回每个元素

泛泛之素 2238

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Istio、eBPF 和 RSocket Broker:深入研究服务网格

在微服务时代,一个复杂的应用程序被分解为多个组件化、协作和连接的单元,服务往往会承担越来越多的业务责任,这使得服务治理的难度前所未有。仅仅依靠微服务框架级的治理是不够的,构建一个高维深度的治理体系需要解决。本文通过不同的视角讨论服务治理。通过查看传统和现代方法,您将对 Service Mesh、Istio、eBPF 和 RSocket Broker 有一个很好的理解。治理是指建立和实施微服务如何协同工作以实现系统设计和构建的业务目标的过程。服务不要超出其上下文边界非常重要。服务治理可以通过多种方式实现:稍后

技术宅,专注云原生、Go、Linux、Java等技术分享,原创文章、效率工具、实战解决方案!关注我,了解互联网动态,学 IT 不迷路 974

RSocket背压机制-Lease(三)

前言 背压,响应式编程中的概念。意思是当服务端资源不足的时候能够通知客户端请求慢一点。 在RSocket中使用Lease机制实现,Lease的构造方法里有两个参数,ttl和nums-of-requests,两个参数通知客户端在接下来的ttl时间里服务端最多可以处理nums-of-requests个请求。 机制详解 以下机制都是需要我们自己处理的业务逻辑,RSocket底层机制只定义了leas...

后厂村老司机 1107

云原生实践之 RSocket 从入门到落地:Servlet vs RSocket

©Robert Ruggiero技术实践的作用在于:除了用于构建业务,也是为了验证某项技术或框架是否值得大规模推广。本期开始,我们推出《RSocket 从入门到落地》系...

阿里巴巴中间件 783

为什么要用RSocket

欢迎各位来到普鲁士Java的地盘!我叫普鲁士Java(因为我英文名叫bruce),也可以叫我社会文,目前专注于微服务。 关于为什么要用RSocket,官网给了详细说明:https://rsocket.io/docs/motivations 基于大家可能和我一样英文不好,我再次勉为其难为大家翻译一下: 1.一个技术的更新和发展始终紧跟时代的潮流和趋势 Java自从Java8 开始已经开始陆续向响应式开发靠拢,诞生了一大堆的Java 响应式组件和框架,例如:Reactive Streams、Srping

bruce520java的博客 426

RSocket:又一个REST的挑战者

\n本文要点\n\n表征状态转移(REST)已经成为微服务通信事实上的标准。作者认为,这不是一件好事——事实上,这是一件非常糟糕的事,尤其是对于微服务通信来说。\nREST是基于HTTP实现的。使用REST的一个常见理由是,它很容易调试,因为它是“人类可读的”。不容易阅读是工具问题。\n在微服务通信协议设计中,我们需要的部分特性包括二进制序列化、双向通信、多路复用以及元数据交换能力。\n工程师希望...

测试0901-1 396

Apache Dubbo RSocket Gateway 入门教程

Apache Dubbo是一个流行的Java RPC框架,尤其是在中国。有很多项目使用Dubbo。虽然它正在通过适配Reactive Streams 和 Service Mesh来实现未来的新版本Dubbo 3.0,但有许多遗留项目不可能在短期之内被彻底修改。 RSocket是一个支持Reactive Streams语义的二进制通讯协议,主要支持的通讯层包括TCP, WebSockets和Aero...

东子的博客 细节决定成败,点滴铸就辉煌。 2213

Spring Boot与RSocket实现高效实时数据通信

✌️大厂。

Yaml4的博客 1450

响应式编程之网络新约:RSocket

响应式reactive是Java中高效应用的下一个前沿,但它目前主要有两个障碍:数据访问和网络。RSocket是一种新的第7层语言无关的应用网络协议(解决后者),它由Facebook,Netifi和Pivotal等工程师开发,提供Java,JavaScript,C ++和Kotlin等实现,RSocket与Servlet并不是同类的产品。 RSocket RSocket RSocket是一个二...

布道 2万+

RSocket 从入门到落地:两种微服务对比

✏️Pic by Alibaba Tech on Facebook技术实践的作用在于:除了用于构建业务,也是为了验证某项技术或框架是否值得大规模推广。这是《RSocke...

阿里巴巴中间件 9161

从微服务治理的角度看RSocket、. Envoy和. Istio

© Nathan Dumlao很多同学看到这个题目,一定会提这样的问题:RSocket是个协议,Envoy是一个 proxy,Istio是service mesh...

阿里巴巴中间件 429

RSocket一种新的响应式应用新协议

简介 RSocket是在华盛顿特区举行的SpringOne平台会议上宣布的,是一种新的第7层语言无关的应用网络协议。它是一种基于Reactive Streams背压的双向,多路复用,基于消息的二进制协议。它由Facebook,Netifi和Pivotal等工程师开发,提供Java,JavaScript,C ++和Kotlin等实现。 开源RSocket专为服务而设计。它是一种面向连接的消息...

FeelTouch Labs 2724

【术语】背压机制

这个是Reactive(反应) 的概念,当订阅者的消费能力,远低于发布者时,订阅者(也就是消费者)有通知取消或终止,发布者生产数据的机制,这种机制可以称作为‘背压’。 该术语也用于类似领域中的信息技术来描述的积聚数据的I / O交换机后面如果缓冲器已满,不能接收任何更多的数据;发送设备停止发送数据分组,直到缓冲区已被清空并再次能够存储信息。它还涉及根据拥塞梯度路由数据的算法 ...

daohangtaiqian的博客 2307
上一篇: 干货 | 单个场景秒级返回,携程机票持续集成之线上场景回放优化
下一篇: 干货 | 携程酒店MOCK全链路实践
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值