简介: RSocket是高效一个二进制的网络通讯协议,能够满足很多场景下使用。另外,RSocket也是一个激进的响应式捍卫者,激进到连API都跟响应式无缝集成。本文我们将和大家分享RSocket与响应式编程。

作者 | 素渡

来源 | 阿里技术公众号

一 RSocket的主要特性

首先,RSocket是高效一个二进制的网络通讯协议,能够满足很多场景下使用。其次,RSocket是一个激进的响应式捍卫者,激进到连API都跟响应式无缝集成。

1 四种通讯模式

即发即忘FireAndForget

立即发送一个请求,无需为这个请求发送响应报文。适用于监控埋点,日志上报等,这种场景下无需回执,丢失几个请求无伤大雅。

请求响应RequestResponse

请求方发送一条请求消息,响应方收到请求后并返回一条响应消息。传统的HTTP是典型的RequestResponse。

流RequestStream

请求方发送一个请求报文,响应方发回N个响应报文。传统的MQ是典型的RequestStream。

通道RequestChannel

创建一个通道上下文,双方可以互相发送消息。IM是个典型的RequestChannel通讯场景。

2 双向通讯Bi-Directional

RSocket的Client连接到Server,这个过程称为Setup,在连接成功后,会约定收发消息的方向逻辑:

  • 当Client请求Server时,发送的请求ID永远为奇数
  • 当Server请求Client时,发送的请求ID永远为偶数

正是因为这个奇偶性确定方向的特性,不同于传统的如HTTP请求,RSocket可以做到双向请求。

3 其他

  • 二进制协议,紧凑高效
  • 多路复用
  • 基于帧(Frame)的背压,与ReactiveStreams语义契合
  • 灵活的传输层切换: TCP/UDP/WebSocket等
  • 支持Cancel、断点续传、租约等高级特性

综上与HTTP做一些比较,RSocket的效率更高,支持的通讯场景更丰富,也没有队头阻塞的问题。与SocketIO这种基于纯事件的框架相比,RSocket的请求具有很清晰的上下文,API精炼易用。

二 RSocket的内部实现

1 帧的设计

帧(Frame)是RSocket协议报文的最小单位。

  • 一个帧由6 bytes的Header和剩余的Body构成,其中Header的4 bytes表示 StreamID,6 bits表示Frame Type, 10 bits作为Flags。Body根据不同的帧类型,结构也不同,常用的带Payload的帧一般会包括Metadata和Data两个部分。
  • 传输层如果本身不支持分帧特性的(如TCP),那么RSocket会用3 bytes的uint24表示帧长度,所以最大的帧大小是16MB。
  • 如果帧超出16MB,RSocket支持帧分裂重组,也就是拆成更小的帧,接收端再自动重组。

2 数据载体——Payload

基于帧之上,一般开发者接触到的是Payload, 它类似一个HTTP报文,可以是一个Request,也可以是一个Response。由两个二进制部分组成:

  • Metadata——元数据,类似HTTP的header
  • Data——数据,类似HTTP的body

3 架构

这里基于笔者在实现Golang版SDK的基础上整理的架构图,Java版基本也类似。

  • Transport层将网络二进制流编解码为Frames。
  • RSocket支持自定义最大Frame Size,默认16MB,当某个Frame超出时,会被拆解为N个小Frame,收到时再重组,在介绍帧的时候也提到了,这个特性称为Fragmentation。
  • DuplexConnection转换Frames为Payload,抽象为一个个Request/Response上下文,并负责读写。
  • RSocket组装Connection为RSocket Interface,其中Resumable支持断点续传,连接断开重连也能自愈,个人觉得这个特性有点鸡肋,在弱网环境有些优势,但是因为期间会缓存住未处理完毕的帧,所以会耗费大量的系统资源。
  • RSocket使用Reactor核心库暴露为4种通讯模式,抽象为高级API。

4 玩法

RSocket有很多玩法,传统的RPC自然不在话下,用来做IM也未尝不可,某些特性也可以用来做代理或者网络穿透。

IoT的场景,比如小明的家里有个智能空调,小明想在外面通过手机APP来控制空调开关,如何优雅地描述这个控制问题?最精炼的解决方案就是"小明调用空调上开关的API"。

另外最经典的玩法就是Broker了,Broker类似一种“软路由”的方案,可以让服务的发布访问变得简单。发布服务只要连接到Broker,调用方通过反向请求的方式来让Broker透明转发即可,摒弃了传统的注册中心,端口管理等常见的服务治理手段。

5 关于RSocket Broker

Broker有很多优势,发布服务不需要监听端口,无需Sidecar,服务注册变得简单,无需zk、etcd之类,LoadBalance变得简单,也更安全,没监听端口后很难攻击。也有很多劣势,网络上多了一跳,性能是有一定损耗的,Broker是中心化设计,类似我们平时全局的Nginx一样,但是Broker的优雅启停显然更加复杂,受限于整个Broker集群的瓶颈等等。上帝为你关闭了一扇门,就一定会为你打开一扇窗。

目前高德落地的FaaS中大量使用了基于RSocket架构的集团Broker,支撑了今年的五一长假,峰值QPS超20万,平稳零故障。

这里笔者也准备了一个教学用的Mini Broker,演示了两个浏览器之间相互上下文调用彼此服务的场景,有兴趣的同学可以查看。

三 响应式编程

响应式编程是个老话题了,它早已无处不在,甚至你在Excel里SUM求和,本质上也是种响应式的思维。响应式本质上就是响应变化的数据流。RSocket这个协议本身就是以响应式之名,将其扩展到网络层面。

1 响应式编程大概长这样

而在我们平时工作中,必然会引入各种操作和变换:

2 Reactive Streams

JDK推出了响应式标准API,撇开Processor之外,其核心接口就Publisher/Subscriber/Subscription,非常精炼。

  • Publisher:发布者,负责生产数据。唯一的方法subscribe,接收一个Subscriber开始一次新的订阅。
  • Subscriber:订阅者,负责订阅消费数据。
  • Subscription:订阅,某次订阅的上下文控制,如取消、通知获取下N条数据。

Spring的Reactor是一个标准的实现,其一次完整的执行过程如下图:

  • 创建subscriber,开始订阅Publisher。
  • 生成上下文subscription。
  • Publisher就绪,调用onSubscribe。
  • Publisher开始生产数据。
  • 每条成功生产的数据回调onNext。
  • 当生产失败时,回调onError并结束当前订阅。
  • 当所有数据生产完毕时,回调onComplete并结束当前订阅。
  • 中途可以调用subscription随时cancel取消订阅,或者通过request(n)通知生产下N个元素,这个过程即背压。

由于Java天生的语言优势,很适合使用RxJava或Reactor之类的框架,代码逻辑清晰可读性会非常高。笔者在实现Go版的Reactor时,深深地体会到了没有泛型支持的API表现力是多么匮乏,也期待Go2的泛型能够有所改善。

四 总结

RSocket是个很有趣的网络协议,它可能不会普及流行,但贵在它解决问题的思路和设计很令人耳目一新。如果大家有兴趣,可以去它的官网了解下。

原文链接

本文为阿里云原创内容,未经允许不得转载。

浅谈RSocket与响应式编程的更多相关文章

  1. 响应式编程库RxJava初探

    引子 在读 Hystrix 源码时,发现一些奇特的写法.稍作搜索,知道使用了最新流行的响应式编程库RxJava.那么响应式编程究竟是怎样的呢? 本文对响应式编程及 RxJava 库作一个初步的探索. ...

  2. [转帖]浅谈响应式编程(Reactive Programming)

    浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22 ...

  3. 浅谈Spring 5的响应式编程

    这篇使用Spring 5进行响应式编程的入门文章展示了你现在可以使用的一些新的non-blocking, asynchronous.感谢优锐课老师给予的指导! 近年来,由于响应式编程能够以声明性的方式 ...

  4. Unity基于响应式编程(Reactive programming)入门

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  5. Reactive(1) 从响应式编程到"好莱坞"

    目录 概念 面向流设计 异步化 响应式宣言 参考文档 概念 Reactive Programming(响应式编程)已经不是一个新东西了. 关于 Reactive 其实是一个泛化的概念,由于很抽象,一些 ...

  6. Java reactor响应式编程

    转载自:https://www.cnblogs.com/lixinjie/p/a-reactive-streams-on-jvm-is-reactor.html 响应式编程 作为响应式编程方向上的第一 ...

  7. 07-Spring5 WebFlux响应式编程

    SpringWebFlux介绍 简介 SpringWebFlux是Spring5添加的新模块,用于Web开发,功能和SpringMvc类似的,WebFlux使用当前一种比较流行的响应式编程框架 使用传 ...

  8. iOS开发--Swift RAC响应式编程初探

    时间不是很充足, 先少说点, RAC的好处是响应式编程, 不需要自己去设置代理委托, target, 而是主要以信息流(signal), block为主, 看到这里激动吧, 它可以帮你监听你的事件, ...

  9. IOS响应式编程框架ReactiveCocoa(RAC)使用示例

    ReactiveCocoa是响应式编程(FRP)在iOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# :在网上看了几 ...

  10. 函数响应式编程(FRP)—基础概念篇

    原文出处:http://ios.jobbole.com/86815/. 一函数响应式编程 说到函数响应式编程,就不得不提到函数式编程,他们俩有什么关系呢?今天我们就详细的解析一下他们的关系. 现在下面 ...

随机推荐

  1. 广汽传祺E9上市,3DCAT实时云渲染助力线上3D高清看车体验

    2023年5月21日,中国智电新能源旗舰MPV--广汽传祺智电新能源E9在北京人民大会堂举办上市发布会. 发布会现场(图源官方) 为了让更多的消费者能够在线上感受到广汽传祺E9的魅力,3DCAT实时渲 ...

  2. 4项关键技术提升 XR 扩展现实体验-XR应用云流化

    无论是使用户能够协作设计电动赛车,还是帮助观众通过数字世界与自然互动,越来越多的企业利用XR扩展现实为用户提供沉浸式逼真的虚拟环境. 下一代沉浸式技术的应用越来越广泛,图形和人工智能的最新突破正在扩展 ...

  3. 游戏引擎中的实时渲染和在V-Ray中渲染有什么区别 2022-11-25

    游戏引擎中的实时渲染和在V-Ray中渲染有什么区别,下面我们一起来分析一下,从2个方面来具体分析实时渲染和在V-Ray中渲染种的不一样的区别. 原理区别 VRay等渲染器原理上叫做离线渲染(Offli ...

  4. C#通义千问apl

    1.在阿里申请和开通模型服务灵积:链接地址 2.在gitee下载代码:Gitee链接 3.在代码中更换你的API-KEY 4.注意要开通:通义千问/qwen-turbo模型 5.如图所示

  5. 记录--Uni-app接入腾讯人脸核身

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 人脸核身功能有多种接入方式,其中包含微信H5.微信小程序.APP.独立H5.PC端.API接入6种方式. ​ 我们的产品是使用uni-ap ...

  6. KingbaseES 最老事务阻止vacuum freeze

    前言 最近生产环境发生几次由于长事务导致表.库年龄没法回收的情况.我们要规避这种情况的发生,不要等发生了再去强制中断会话连接.当数据库中存在最老事务版本xmin,那么早于他的快照可以被标记为froze ...

  7. KingbaseES V8R3集群部署案例之---通用机无ssh环境脚本部署集群

    案例说明: 在一些通用机的生产环境,不允许主机之间通过ssh通讯,或者不允许root用户建立ssh互信或登录.默认KingbaseES V8R3集群通用机环境部署需要建立数据库用户及root用户,在集 ...

  8. 网站优化之开启tomcat的gzip压缩传输特性

    本文于2015年底完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 基于tomcat 8.0.x版本的文档,可以了解到tomcat支持基于g ...

  9. Python smtp发送邮件怎么设置抄送人

    设置抄送人,非常简单,只需要添加一条信息就可以了,例: cc_list = ['xx@xxx.cn', 'xx@xxx.cn'] msg['Cc'] = ','.join(cc_list) smtp. ...

  10. 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(3)

    1.问题描述: 调用HarmonyOS API发送通知,能查到状态是送达终端设备,但是终端设备上没收到通知卡片. 解决方案: 通知应用大图标不能超过30kb,通知参数限制,参考如下:https://g ...