干货 | 携程酒店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:
Dubbo3.0 snapshot
压测对比的是Dubbo2.7。Dubbo2.7的样例代码如下:
Dubbo3的样例代码如下:
SpringFlux的样例代码如下:
分别压测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类型的接口定义方式。
熟悉响应式编程的同学应该知道Mono是Pivotal Reactor Core中的一种类型。是一种特殊的发布者,最多只发布一次。
如果应用本身就是以非堵塞的方式写的,那这里就可以直接使用reactor core的所有API。当然也有同学会说,即使不返回Mono,例如Dubbo2.7中的返回CompletableFuture,我们只要自己内部转换一下即可。然后应用里面照样可以使用reactor core或者rxjava等响应式编程的框架。
的确如此,但是如果是Flux呢?可以多次、不断地往流里面写入结果的呢?CompletableFuture还能支持么?显然不行。因为flux本身就定义为最多可以发布n次。
那为什么要用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就可以使用下面的方式来实现:
看完上面的代码,然后我们可以思考一下如何用上面提供的API去实现下面的功能。你就会发现flux的这种Reactive Functional Programming的编程方式大大降低了编程的难度与代码量,提升了代码的可读性:
但是这还不是全部的好处,下面我们来看看RSocket的另外一种使用场景。
五、RSocket的展望
响应式编程中有一个比较有名的功能叫背压。例如:当上游服务调用下游服务,而下游服务来不及处理的时候,可以选择性的限制上游服务的调用。
而我们日常在刷手机的时候,经常会由于手机卡顿,无论是APP导致的还是网络导致的,重复点击或者刷新页面的情况。而HTTP本身是无状态的,所以只要有请求,无论是有效的还是无效的,服务器都会进行处理直到完成。
但是如果有背压,那我们就可以一定程度上减少APP的无效和重复的请求。
例如:用户查看订单列表,如果一下子过来10个请求,其实只要返回最后一个即可,前面9个都可以忽略。如果实现了,服务器就会减少流量,对硬件成本的控制有着非常积极的作用。InfoQ的文章中就提到:Facebook的工程师现在就是这样实现APP与服务器之间的通讯。
之所以称之为展望,因为这个也是我们下一个实践的目标。
参考资料
https://qconsp.com/system/files/presentation-slides/rsocket_and_spring_cloud_gateway-spencer.gibb_.pdf
https://projectreactor.io/docs/core/release/reference/
https://www.infoq.com/news/2018/10/rsocket-facebook/
大数据与人工智能沙龙
8月24日上海
火热报名中
↓↓↓
【推荐阅读】
万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案
单个场景秒级返回,携程机票持续集成之线上场景回放优化
跨多业务线挑战下,携程订单索引服务的1.0到2.0
携程机票 React Native 整洁架构实践
React Hook的实现原理和最佳实践
干货 | 携程酒店RSocket实践相关推荐
- 干货 | 携程酒店安卓地图开发实践
作者简介 亦枫,携程资深软件工程师,负责酒店业务 Android 客户端的相关研发工作. 当前大多数移动互联网 App 都会存在地图相关功能,尤其是 LBS(基于位置服务)相关的业务,依赖性更强,携程 ...
- 干货 | 携程酒店Flutter性能优化实践
作者简介 Qifan,携程高级工程师,专注移动端开发:Yinuo,携程高级工程师,专注移动端开发:popeye,携程软件技术专家,关注移动端跨端技术,致力于快速,高性能地支撑业务开发. 一 .前言 携 ...
- 干货 | 携程酒店MOCK全链路实践
作者简介 刘晓攀,携程酒店性能测试负责人,专注性能测试分析和辅助测试工具的开发. 一.前言 Mock在整个软件开发测试周期中已经非常普遍,我们也会经常有意无意地使用它.譬如开发了一段代码,这段代码强依 ...
- 千亿级携程酒店AWS实践
作者简介 微末,携程软件技术专家,关注系统架构,致力于高可用高性能的支撑业务系统开发. 一.背景 随着携程海外酒店业务的发展,遍布全球的海外供应商与携程总部IDC之间的数据传输量快速增长.技术上,这种 ...
- 干货 | 携程酒店小程序开发背后的“黑科技”
作者简介 崔广宇,携程酒店研发部小程序开发经理,曾负责过反爬虫开发以及H5开发. 本文将分享携程酒店小程序的一些开发经验, 和一些非技术的经验.这里的小程序包括微信小程序,支付宝,百度,头条.快应用因 ...
- 干货 | 携程酒店iOS动态View的探索
作者简介 姜睿东,2009年加入携程,从事无线研发,现在大住宿事业群负责酒店无线研发工作. 一直以来,Native App因为审核的原因,新版本不能很及时地上线.尤其是iOS,碰到点审核问题,有时候一 ...
- 干货 | 携程酒店实时数仓架构和案例
作者简介 秋石,携程数据仓库专家,关注大数据.数据仓库.数据治理等领域: 九号,携程数据技术专家,关注数据仓库架构.数据湖.数据治理: 魁伟,携程资深数据工程师,关注实时&离线大数据产品及技术 ...
- 干货 | 携程酒店搜索引擎AWS上云实践
作者简介 宮娴,携程高级后端开发工程师:Spike,携程高级后端开发专家. 随着携程国际化业务的快速推进,搜索引擎作为用户体验中至关重要的一环,上云变得志在必行.本文主要分享酒店搜索引擎迁移AWS的探 ...
- 干货 | 携程Dynamo风格存储的落地实践
作者简介 根泰,携程高级后端开发工程师,关注数据存储和数据库领域. 遐龄,携程研发总监,关注大数据存储.性能调优. Dynamo风格数据库来源于亚马逊的Dynamo: Amazon's Highly ...
最新文章
- plsql 为空显示 0 的函数_记住这三个检测函数,彻底清除公式当中的0值
- mysql 全值匹配什么意思
- Python怎么安装第三方库-numpy-libnum等; (详细版)
- Search For Mafuyu dfs,树的遍历,期望(济南)
- javascript获取asp.net服务器端控件的值(2009-10-31 15:24:26)转载标签:杂谈 分类:技术分类
- java学习笔记(3)——面向对象
- 有计算机信号专业吗,计算机医学图像及信号处理
- jpa 实体映射视图_JPA教程:实体映射-第3部分
- C# 繁体,简体互转
- 【grafana】grafana 添加 MySQL 本地无法连接
- paip.程序不报错自动退出的解决
- Keil5二步解决中文乱码,注释乱码问题
- CUDA编程技术汇总
- Java打印杨辉三角形
- 安卓Termux包下载
- 三只松鼠营收持续下滑:市值两天缩水28亿元,能否熬过漫漫转型路
- DNA甲基化数据分析专题
- 基于BP人工神经网络的手写英文字符识别
- 赵小楼《天道》深度解析(75)客观是对现有事实的认可,嘴上认可可不行,得心里认,否则就是自欺
- 兰州烧饼 南阳理工ACM 题目779
热门文章
- 北信源内网安全与补丁分发系统简单功能介绍
- R语言ggplot2可视化:使用patchwork包的align_patches函数将多个可视化图像对齐(align all plots)
- JavaScript高阶
- VC编译器与GCC编译器的区别
- 益聚星荣:DR钻戒,“一生只送一人”的暴利生意
- yilia-puls美化hexo个人博客
- Modbus协议的数据模型和地址模型,Modbus寄存器40001,30001是什么意思?
- 在windows7上搭建STF
- Python-Web前端概述
- Spring Boot面试必问:自动配置原理