技术动向 | 反应式编程的通讯协议:RSocket 101

Posted 脚本之家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了技术动向 | 反应式编程的通讯协议:RSocket 101相关的知识,希望对你有一定的参考价值。

脚本之家

你与百万开发者在一起

技术动向 | 反应式编程的通讯协议:RSocket 101

反应式编程的出现已经有好几年的历史了。它是基于反应式编程宣言。但是,它的推广速度确实是比较缓慢。以至于很多人现在还对反应式编程不是很了解。本文将通过介绍一个反应式编程的通讯协议: RSocket,来走进反应式编程。


技术动向 | 反应式编程的通讯协议:RSocket 101
1

RSocket的定义

RSocket 是Reactive Socket的意思,也就是反应式编程的网络协议。

它的官方 文档 的标语是:

 Application protocol providing Reactive Streams semantics

这里有几层意思:

  • 首先RSocket确保的是网络通讯的语义是符合反应流的规范。

  • 第二它是应用层的协议,所以它并不介意传输层的协议。

接着,文档中给出了它的具体定义:

RSocket is a binary protocol for use on byte stream transports such as TCP, WebSockets, and Aeron.

这里强调的是RSocket协议是二进制的编码,与文本编码有很大的不同。


技术动向 | 反应式编程的通讯协议:RSocket 101
2

设计的思想

随着微服务的发展,传统的反应式编程的实现也受到挑战,特别在网络传输的部分,需要把背压作端到端的传输,而不是在一跳以后就丢失了。

另一方面,反应式编程的本身就要求反应式编程是消息驱动的。

这两个方向的方向的合力,就是把反应式编程从CPU和内存延伸到网络,这就是RSocket。这里的网络,是指应用层的,RSocket 努力的方向是让应用的语义可以在网络上传播。而对于传输层,RSocket 的原则是尽量兼容。目前它支持的传输层有WebSockets, TCP, 或者 Aeron。


技术动向 | 反应式编程的通讯协议:RSocket 101
3

RSocket 的四种通讯模式

RSocket 先定义了一套规范,然后才有实现。这套规范定义了数据帧的格式。此外,RSocket 总结了分布式应用的通讯共同特点,定义了四种不同的反应流通讯方式。

技术动向 | 反应式编程的通讯协议:RSocket 101

  • request/response (stream of 1):就是传统的RPC

  • request/stream (finite stream of many):是指单向的流

  • fire-and-forget (no response):是指无返回值的RPC

  • channel (bi-directional streams):是指双向的流

技术动向 | 反应式编程的通讯协议:RSocket 101
4

与反应式编程的关系

反应式编程的两个主要方面(非官方解释),就是非阻塞线程管理和背压。RSocket 主要是实现背压的网络部分。有的语言,如Java, 有好几个反应式编程的库,如RxJava, Reactor等。这种情况下,RSocket 就是和这些已有的库整合,不会重新发明轮子。但是,如果有的语言没有这样的库,那么RSocket 就要自己实现这部分的功能。

一个完整的RSocket SDK, 是包括非阻塞线程管理+背压+网络的,应该把它当作是反应式编程的扩展,而不是一个单独的模块。没有了其他的部分,RSocket 是根本没有用的。


技术动向 | 反应式编程的通讯协议:RSocket 101
5

与gRPC的比较

gRPC 也分两部分(非官方版本):protobuf 和 HTTP/2。与HTTP2的比较下一节讲。Protobuf 要解决的问题,是多语言定义服务的问题。这个和RSocket 要解决的问题不是一个方向的。所以,RSocket 可以支持protobuf 的IDL。在负载编码的问题上,RSocket 很中立,它支持protobuf,Json, 或者是Java interface。


技术动向 | 反应式编程的通讯协议:RSocket 101
6

与HTTP/2的比较

HTTP/2 是1.1的增强版,但它还是HTTP。这个协议有几个比较大的问题:

1. 它是为 web 通讯开发的, 它的主要特点是通信的单向性。对一个链接来说,一定有一个 client, 一个server。而RSocket 是针对应用间的通讯而设计的,通讯像对话一样,是双向的,是流式的。所谓client和server的关系也是比较模糊的。HTTP/2著名的server push是为浏览器开发的。对应用而言,要么是用websocket, 要么是用SSE,即ascii编码。

2. HTTP/2所支持的语义是基于HTTP 方法,GET, PUT, DELETE,等。这些对于应用来说是不够的。而额外操作的定义就要在应用中自行完成。

3. HTTP/2的流控是在字节的层级上,而不是应用的层级(帧)。这样的转化也会增加应用的负担。

技术动向 | 反应式编程的通讯协议:RSocket 101
7

RSocket 自身的特点

我们暂时忘掉反应式编程。不管叫什么名字,它最终要为应用带来好处。我们就RSocket 为应用带来的好处做个介绍:

1. 面向链接。这个特点以后我们会展开讲。简单说就是链接的状态会被保存下来。当然,与kafka等不同,这个状态不落盘。但是只要有一边不重启,链接状态是可以恢复的。

2. 双向传输。就是复用同一个链接,双方没有主次之分。一旦链接建立,双方都可以用背压方式要求数据传输。

3. 端到端的流控。这条以后也会展开说。简单地说,HTTP/2 的流控是一站一站,就是说假设A-B-C,A-B的流控对B-C是无效的。而用了RSocket,A-C的流控是应用程序可控的。比如A说给我8条记录,(这就是背压的实现),C就会知道并传8条记录到A。

这些特点,会让RSocket 在应用间的通讯表现比起HTTP/2有很大的提升。

声明:本文为脚本之家专栏作者 投稿,版权归原作者所有。

技术动向 | 反应式编程的通讯协议:RSocket 101

● 技术动向 | 反应式编程的通讯协议:RSocket 101 

● 技术动向 | 反应式编程的通讯协议:RSocket 101 

●  

● 

● 

●  

小贴士

返回 上一级 搜索“Java 程序员 大数据 留言送书 运维 算法 Chrome 黑客 Python javascript 人工智能 女朋友 mysql 书籍 等关键词获取相关文章推荐。

以上是关于技术动向 | 反应式编程的通讯协议:RSocket 101的主要内容,如果未能解决你的问题,请参考以下文章

初探Rsocket

浅谈RSocket与响应式编程

带有消息代理(例如 Kafka)的事件驱动微服务与反应式编程(RxJava、Project Reactor)以及改进的协议(RSocket)

浅谈 RSocket 与响应式编程

RSocket:反应式应用网络协议(转)

响应式应用新协议RSocket