11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

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:007479
用户头像

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

关注

评论

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

Java高手怎样炼成?阿里大牛一份火爆GitHub的1046页笔记帮你解决

钟奕礼

Java 程序员 架构 后端 java面试

阿里面试官内部题库,阿里发布2022年Java岗(正式版)面试题

程序知音

Java java面试 后端技术 秋招 Java面试八股文

Embedded SIG | 树莓派的UEFI支持和网络启动

openEuler

开源 树莓派 操作系统 openEuler

【docker】软链接迁移docker存储目录

非晓为骁

Docker 存储 迁移

设计消息队列存储消息数据的 MySQL 表格

张立奎

跟着卷卷龙一起学Camera--内存池浅析04

卷卷龙

ISP 9月月更

面试凉凉,阿里学长甩我一份24w字Java核心技术面试手册,真香

钟奕礼

Java 架构 后端 java面试

iMazing怎么恢复备份?iMazing恢复备份教程分享

淋雨

ios iphone

开源实习 | 毕昇JDK发布国密算法实习任务

openEuler

开源 openEuler 毕昇 JDK

【云原生 | 从零开始学Kubernetes】十一、k8s污点、容忍度和pod状态

泡泡

Docker 云计算 云原生 k8s 9月月更

编译器优化那些事儿(6):别名分析概述

openEuler

开源 编译器 openEuler 毕昇 JDK

开源之夏 | 【结项报告】毕昇Fortran编译器内联动态库函数str_copy

openEuler

开源 操作系统 openEuler 毕昇 JDK

openEuler 资源利用率提升之道 04:CPU 抢占和 SMT 隔离控制

openEuler

开源 openEuler

iMazing高效便捷的数据转移功能

淋雨

ios iphone

StratoVirt 中的 PCI 设备热插拔实现

openEuler

开源 操作系统 虚拟机 openEuler

如何在笔记本上安装openEuler 22.03 LTS

openEuler

开源 操作系统 openEuler

八家知名大厂联合手写的Java面试手册刚上线!竟就到达巅峰?

钟奕礼

Java 架构 后端 java面试

数据治理的核心:维度建模下的数仓构建

Taylor

数据仓库 维度建模 维度 数仓分层 分层划域

一次 Rancher 和 openEuler 的上云之旅

openEuler

Linux 开源 openEuler rancher suse

揭开HPC应用的神秘面纱

openEuler

开源 openEuler

【Python实践】使用Python实时语音控制电脑全局音量

迷彩

人工智能 语音识别 9月月更 控制电脑 语音控制

22年程序员更卷了,金九银十“面试必备小册”最新开源

程序知音

Java 阿里 后端技术 秋招 Java面试题

2021 金三银四面试必备?体系化带你学习:分布式进阶技术手册

钟奕礼

Java 架构 后端 java面试

阿里被转载上100W次的Java面试题教程!已助我拿下9家大厂offer!

钟奕礼

Java 架构 后端 java面试

面试突击87:说一下 Spring 事务传播机制?

王磊

Java 面试

GitHub获百万推荐的面试涨薪秘籍(Java岗)惨遭封杀?

钟奕礼

Java 后端 java面试 后端架构

别让你的 SaaS 产品由赋能变为“负能”

产品海豚湾

产品设计 产品运营 SaaS平台 B端产品 9月月更

千峰课程网安笔记(1)

吉师职业混子

9月月更

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