作者简介

刘诚,携程酒店研发性能架构师。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实践相关推荐

  1. 干货 | 携程酒店安卓地图开发实践

    作者简介 亦枫,携程资深软件工程师,负责酒店业务 Android 客户端的相关研发工作. 当前大多数移动互联网 App 都会存在地图相关功能,尤其是 LBS(基于位置服务)相关的业务,依赖性更强,携程 ...

  2. 干货 | 携程酒店Flutter性能优化实践

    作者简介 Qifan,携程高级工程师,专注移动端开发:Yinuo,携程高级工程师,专注移动端开发:popeye,携程软件技术专家,关注移动端跨端技术,致力于快速,高性能地支撑业务开发. 一 .前言 携 ...

  3. 干货 | 携程酒店MOCK全链路实践

    作者简介 刘晓攀,携程酒店性能测试负责人,专注性能测试分析和辅助测试工具的开发. 一.前言 Mock在整个软件开发测试周期中已经非常普遍,我们也会经常有意无意地使用它.譬如开发了一段代码,这段代码强依 ...

  4. 千亿级携程酒店AWS实践

    作者简介 微末,携程软件技术专家,关注系统架构,致力于高可用高性能的支撑业务系统开发. 一.背景 随着携程海外酒店业务的发展,遍布全球的海外供应商与携程总部IDC之间的数据传输量快速增长.技术上,这种 ...

  5. 干货 | 携程酒店小程序开发背后的“黑科技”

    作者简介 崔广宇,携程酒店研发部小程序开发经理,曾负责过反爬虫开发以及H5开发. 本文将分享携程酒店小程序的一些开发经验, 和一些非技术的经验.这里的小程序包括微信小程序,支付宝,百度,头条.快应用因 ...

  6. 干货 | 携程酒店iOS动态View的探索

    作者简介 姜睿东,2009年加入携程,从事无线研发,现在大住宿事业群负责酒店无线研发工作. 一直以来,Native App因为审核的原因,新版本不能很及时地上线.尤其是iOS,碰到点审核问题,有时候一 ...

  7. 干货 | 携程酒店实时数仓架构和案例

    作者简介 秋石,携程数据仓库专家,关注大数据.数据仓库.数据治理等领域: 九号,携程数据技术专家,关注数据仓库架构.数据湖.数据治理: 魁伟,携程资深数据工程师,关注实时&离线大数据产品及技术 ...

  8. 干货 | 携程酒店搜索引擎AWS上云实践

    作者简介 宮娴,携程高级后端开发工程师:Spike,携程高级后端开发专家. 随着携程国际化业务的快速推进,搜索引擎作为用户体验中至关重要的一环,上云变得志在必行.本文主要分享酒店搜索引擎迁移AWS的探 ...

  9. 干货 | 携程Dynamo风格存储的落地实践

    作者简介 根泰,携程高级后端开发工程师,关注数据存储和数据库领域. 遐龄,携程研发总监,关注大数据存储.性能调优. Dynamo风格数据库来源于亚马逊的Dynamo: Amazon's Highly ...

最新文章

  1. plsql 为空显示 0 的函数_记住这三个检测函数,彻底清除公式当中的0值
  2. mysql 全值匹配什么意思
  3. Python怎么安装第三方库-numpy-libnum等; (详细版)
  4. Search For Mafuyu dfs,树的遍历,期望(济南)
  5. javascript获取asp.net服务器端控件的值(2009-10-31 15:24:26)转载标签:杂谈 分类:技术分类
  6. java学习笔记(3)——面向对象
  7. 有计算机信号专业吗,计算机医学图像及信号处理
  8. jpa 实体映射视图_JPA教程:实体映射-第3部分
  9. C# 繁体,简体互转
  10. 【grafana】grafana 添加 MySQL 本地无法连接
  11. paip.程序不报错自动退出的解决
  12. Keil5二步解决中文乱码,注释乱码问题
  13. CUDA编程技术汇总
  14. Java打印杨辉三角形
  15. 安卓Termux包下载
  16. 三只松鼠营收持续下滑:市值两天缩水28亿元,能否熬过漫漫转型路
  17. DNA甲基化数据分析专题
  18. 基于BP人工神经网络的手写英文字符识别
  19. 赵小楼《天道》深度解析(75)客观是对现有事实的认可,嘴上认可可不行,得心里认,否则就是自欺
  20. 兰州烧饼 南阳理工ACM 题目779

热门文章

  1. 北信源内网安全与补丁分发系统简单功能介绍
  2. R语言ggplot2可视化:使用patchwork包的align_patches函数将多个可视化图像对齐(align all plots)
  3. JavaScript高阶
  4. VC编译器与GCC编译器的区别
  5. 益聚星荣:DR钻戒,“一生只送一人”的暴利生意
  6. yilia-puls美化hexo个人博客
  7. Modbus协议的数据模型和地址模型,Modbus寄存器40001,30001是什么意思?
  8. 在windows7上搭建STF
  9. Python-Web前端概述
  10. Spring Boot面试必问:自动配置原理