Linux 之父出席、干货分享、圆桌讨论,精彩尽在 OpenCloudOS 社区开放日,报名戳 了解详情
写点什么

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

  • 2018 年 10 月 09 日
  • 本文字数:1769 字

    阅读完需:约 6 分钟

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

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

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

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

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

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

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

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

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

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

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

2018 年 10 月 09 日 19:007143
用户头像

发布了 1008 篇内容, 共 338.0 次阅读, 收获喜欢 320 次。

关注

评论

发布
暂无评论
发现更多内容

技术与思想:区块链的双重属性

CECBC

区块链 大数据

「架构师训练营第 1 期」第三周作业

张国荣

可穿戴的“舌头鼠标”,催生“黏腻”人机交互的新想象?

脑极体

时空停滞

Sean

调试 心得

那个百无一用的技术主管

极客思享

第一周-食堂就餐卡系统设计-UML设计

kawayi

中小企业如何启动产品科普直播?

boshi

内容 营销 直播 企业应用

第8周总结

Vincent

极客时间 极客大学

4 个问题图解浏览器垃圾回收的过程

Java架构师迁哥

第8周作业

Vincent

极客时间 极客大学

区块链即将涌现更多典型落地应用

CECBC

区块链 落地应用

spring-boot-route(八)整合mybatis操作数据库

Java旅途

Java Spring Boot mybatis

架构训练营-week4-作业

于成龙

作业 架构训练营

区块链更多典型落地应用即将涌现

CECBC

区块链 落地应用

阿里互联网神话,超级工程双十一如何打造终于开源了(共4篇)

小Q

学习 架构 面试 算法 阿里

《我想进大厂》之MQ夺命连环11问

艾小仙

kafka 面试 MQ 程序语言

手把手教你锤面试官 02——设计模式轻松答

慵懒的土拨鼠

Java 面试 设计模式

week03作业

xxx

「国庆」忆读书生涯

我是程序员小贱

美食 旅行

洞察:区块链的危机与契机

CECBC

比特币 区块链 数字货币

白玉试毒 | 灰度架构设计方案

高翔龙

架构设计 互联网架构设计 灰度 灰度发布 发布流程

技术人为什么该坚持写作?

极客思享

架构训练营-week4-学习总结

于成龙

架构 作业 互联网架构 架构训练营

LeetCode题解:429. N叉树的层序遍历,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

菜鸟工程师的超神之路 -- 从校园到职场

极客思享

week03总结

xxx

共享服务中心建设原则-《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》

Man

中台 研发管理 DDD

演化过程中的技术与业务双驱引擎

boshi

云计算 架构 中台 成长 数字化

在互联网站上怎么准确分辨别出MG平台真假VX(LGF7998)黑网的验证方法?

InfoQ_6b6a6317a692

惊艳!腾讯微软内部5大算法文档+源码,大厂offer拿到手软

小Q

学习 架构 数据结构 面试 算法

算法岗有没有泡沫

极客思享

GPU容器虚拟化:用户态和内核态的技术和实践详解

GPU容器虚拟化:用户态和内核态的技术和实践详解

RSocket:一个面向反应式应用程序的新型应用网络协议_Facebook_Charles Humble_InfoQ精选文章