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

RSocket:一个面向反应式应用程序的新型应用网络协议

SpringOne平台华盛顿大会上宣布的RSocket是一个新的、语言无关的第七层应用网络协议。它是一个双向、多路复用、基于消息、基于反应流回压的二进制协议。它是由Facebook、Netifi和Pivotal等开发的,有Java、JavaScript、C++和Kotlin实现。该协议是专门为反应式应用程序设计的,这类应用程序基本上都是非阻塞的,并且常常(但并不总是)与异步行为相结合。使用反应式回压,即发布者不能向订阅者发送数据,直到该订阅者表明它已就绪,这是它与“async”的一个关键区别。

\\

Cloud Foundry Java Experience团队负责人Ben Hale说,“我个人认为,反应式编程是Java高效应用的下一个前沿。”Hale指出,反应式编程有两个主要障碍——数据访问和网络。RSocket旨在解决后一个问题,而R2DBC用于解决前一个问题。

\\

在微服务风格的应用程序中,HTTP是广泛使用的通信协议。Pivotal Reactor项目负责人Stephane Maldini在阐述开发新协议的原因时指出,HTTP是为一个完全不同的世界而设计的。

\\
\

我们有iphone和Android手机,我们等听通知,所以我们不需要通过请求来得到回复,我们可以得到多个回复,而不需要与设备进行交互。我们在运动时还会使用智能手表,它与后台服务器交互,提供统计信息。我们有智能助手与后端服务器交互。所有这些交互模型都是我们所说的连接体验的一部分。HTTP真不是为此而设计的。

\
\\

Maldini认为,HTTP的一个重要问题是,它把所有的职责都放在客户端,用重试逻辑、超时、断路器等来处理不同类型的错误。使用反应式架构构建的应用程序可以提高效率并有很好的扩展性,但Maldini认为,“反应式支持停留在应用程序边界上”。

\\

RSocket与HTTP的不同之处在于它定义了四种交互模型:

\\
  1. 即发即忘(Fire-and-Forget):这是对请求/响应的优化,在不需要响应时非常有用,比如用于非关键事件的日志记录。\\t
  2. 请求/响应:当你发送一个请求并接收一个响应时,就像HTTP一样。即使在这种情况下,该协议也比HTTP更具优势,因为它是异步且多路复用的。\\t
  3. 请求/流:类似于返回集合的请求/响应,集合将以流的方式返回,而不是等到查询完成,例如,发送一个银行帐号,使用一个实时的帐户事务流进行响应。\\t
  4. 通道:允许任意交互模型的双向消息流。\

基于消息意味着该协议可以在单个连接上支持多路复用。此外,与TCP一样,它是真正双向的,一旦客户端初始化了到服务器的连接,连接双方就变得彼此对等——实际上,服务器可以从客户端请求数据。

\\

RSocket还支持以消息为单位的流量控制。在主题演讲中,Facebook工程师Steve Gury表示:

\\
\

当你发送消息时,你同时得指定你能够满足多少响应,服务器必须满足这个约束,但是,当我处理完这些响应后,我可以要求更多的响应。RSocket也是在整个链上工作,因此,如果你链接多个RSocket连接,那么流控制也将作用到端到端。

\
\\

c980d10b03e98740b414c0db2fdb4d83.jpg

\\

实际上,正如Hale在当天晚些时候的后续会议中所说的那样,RSocket解决的问题是跨进程回压,即网络上的回压。

\\
\

我可以保证,我不会请求超出进程内部处理能力的数据,但是当我不得不调用服务网格中的另一个微服务时会发生什么。我如何保证,它不会突然出现一大堆数据,也不会试图给我发送所有的数据。

\
\\

RSocket是传输无关的,支持TCP、WebSocket和Aeron UDP协议,并支持无语义损失的混合传输协议——回压和流量控制仍然有效。

\\

8a14a59fabd6ce33f3657e223f67c2d2.jpg

\\

它还支持连接恢复。当你建立RSocket连接时,你可以指定前一个连接的ID,如果流仍然在服务器的内存中,则你可以继续消费你的流。

\\

在前面提到的演讲中,Hale给出了更多关于协议工作原理的细节。如上所述,它是一个消息驱动的二进制协议。Hale说:“我们的想法是,在给定网络连接的情况下,请求者-响应者交互被分解成一组离散的帧。这些帧中的每一个都封装了某种信息。”帧是二进制的,而不是像JSON或XML那样是人类可读的,对于机器对机器的通信,这显然更有效率。与所有消息传递协议一样,有效负载只是字节流,因此可以是你想要的任何内容,包括XML或JSON。

\\

在Facebook上,使用RSocket的一个地方是一个叫LiveServer的服务,它负责响应一个在线查询,这个查询可以视为一个GraphQL订阅。服务器使用数据进行响应,同时还将提供一个未来更新的流。

\\

查看英文原文:RSocket, a New Application Network Protocol for Reactive Applications, Announced at SpringOne

相关文章:

  • Spring Bean生命周期-registerBeanPostProcessors(七)
  • C#指定用户启动进程
  • ServletRequest和ServletResponse学习笔记
  • Ubuntu16.04 System program problem detected
  • MariaDB10.3 增补AliSQL补丁---安全执行Online DDL
  • shell脚本中打印所有匹配某些关键字符的行或前后各N行
  • 数组遍历的方法(loop)
  • 18-10-11
  • clipboard.js无法复制粘贴
  • android SAF存储访问框架
  • Oracle SQL执行计划基线总结(SQL Plan Baseline)
  • php相关笔记
  • Scss 与 Sass 是什么,他们的区别在哪里?
  • adb connect命令连接多个Android设备
  • python(二) urllib2.URLError
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Cumulo 的 ClojureScript 模块已经成型
  • js ES6 求数组的交集,并集,还有差集
  • ng6--错误信息小结(持续更新)
  • node入门
  • Objective-C 中关联引用的概念
  • PermissionScope Swift4 兼容问题
  • php的插入排序,通过双层for循环
  • ViewService——一种保证客户端与服务端同步的方法
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 从零开始的无人驾驶 1
  • 后端_ThinkPHP5
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 如何设计一个微型分布式架构?
  • 微服务框架lagom
  • 我是如何设计 Upload 上传组件的
  • 在weex里面使用chart图表
  • 中文输入法与React文本输入框的问题与解决方案
  • ionic异常记录
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 正则表达式-基础知识Review
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #FPGA(基础知识)
  • (02)vite环境变量配置
  • (26)4.7 字符函数和字符串函数
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (LeetCode C++)盛最多水的容器
  • (笔试题)分解质因式
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计大学生兼职系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (十六)串口UART
  • (四)Linux Shell编程——输入输出重定向
  • (算法)前K大的和
  • (小白学Java)Java简介和基本配置
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)ABI是什么