热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RSocket一种新的响应式应用新协议

简介RSocket是在华盛顿特区举行的SpringOne平台会议上宣布的,是一种新的第7层语言无关的应用网络协议。它是一种基于ReactiveStreams背压的双

简介

RSocket是在华盛顿特区举行的SpringOne平台会议上宣布的,是一种新的第7层语言无关的应用网络协议。它是一种基于Reactive Streams背压的双向,多路复用,基于消息的二进制协议。它由Facebook,Netifi和Pivotal等工程师开发,提供Java,Javascript,C ++和Kotlin等实现。

开源 RSocket 专为服务而设计。它是一种面向连接的消息驱动协议,在应用程序级别具有内置流控制。它既可以在浏览器中同样使用,也可以在 服务器上使用。这意味着您可以流式传输数据或执行Pub / Sub而无需设置应用程序队列。它也是二进制的。它对文本和二进制数据同样有效,并且对传输的内容负荷进行分段。

该协议专门设计用于与Reactive风格应用配合使用,这些应用程序基本上是非阻塞的,并且通常(但不总是)与异步行为配对。使所谓Reactive背压: 即发布者无法向订户发送数据直到该订户已经准备就绪的想法,这是与“异步”的关键区别。反应式编程(响应式reactive)是 Java 中高效应用的下一个前沿。但有两个主要障碍 - 数据访问和网络。RSocket旨在解决后一个问题,而R2DBC旨在解决前者问题。

HTTP vs RSocket

HTTP的一个重要问题是,它强迫客户端负担起所有责任来处理不同类型的错误上,包括重试逻辑,超时,断路器等。使用Reactive架构构建的应用程序可以提高效率并扩展。

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

  1. Fire-and-Forget:优化请求/响应,在不需要响应时非常有用,例如非关键事件日志记录。
  2. 请求/响应:当您发送一个请求并收到一个响应时,就像HTTP一样。即使在这里,该协议也具有优于HTTP的优点,因为它是异步和多路复用的。
  3. 请求/流:类似于返回集合的请求/响应,集合被回送而不是查询直到完成,因此例如发送银行帐号,用实时的帐户事务流进行响应。
  4. 频道:允许任意交互模型的双向消息流。

基于消息意味着协议可以支持单个连接上的多路复用。此外,与TCP一样,它是真正的双向,因此一旦客户端启动与服务器的连接,连接中的双方就变得彼此等同 - 实质上,服务器可以从客户端请求数据。

RSocket 特性

RSocket还支持基于每个消息的流量控制

RSocket还支持基于每个消息的流量控制。在主题演讲中,Facebook工程师Steve Gury表示:

当您发送消息时,您还要指定您能够满足多少响应,并且服务器必须满足该约束,但是当我完成处理这些响应后,我可以要求更多。RSocket也可以在链中工作,因此如果链接多个RSocket连接,流控制将是端到端地工作。

实质上,RSocket解决的问题是跨流进程的背压,即网络上的背压。

当必须在服务网格中调用另一个微服务时会发生什么,我如何保证它不会出现调用一大堆数据,并且它不会尝试向我客户端发送所有这些数据?

RSocket与传输无关,支持TCP,WebSocket和Aeron UDP,支持混合传输协议,不会造成语义损失 - 背压和流量控制都将继续工作。

它还支持连接恢复。建立RSocket连接时,您可以指定先前连接的ID,如果服务器仍在内存中有流,则可以恢复流的消耗。

它是一种消息驱动的二进制协议,在指定网络连接的情况下,请求者 - 响应者交互被分解为一组离散的帧,这些帧中的每一个都封装了某种消息。

框架是二进制的,而不是人类可读的,如 JSON 或XML,为机器到机器的通信提供了显着的效率。与所有消息传递协议一样,消息传递的内容有效负荷只是字节流,因此可以是您想要的任何内容,包括 XML 或JSON。

在Facebook,RSocket用于名为LiveServer的服务,该服务负责响应可被视为GraphQL订阅的实时查询。服务器响应数据,但也响应未来的更新流

RSocket 实例

Demo Java Server:

RSocketFactory.receive().frameDecoder(Frame::retain).acceptor(new PingHandler()).transport(TcpServerTransport.create(7878)).start().block().onClose();

Demo Java Client:

Mono client =RSocketFactory.connect().frameDecoder(Frame::retain).transport(TcpClientTransport.create(7878)).start();PingClient pingClient = new PingClient(client);Recorder recorder = pingClient.startTracker(Duration.ofSeconds(1));int count = 1_000;pingClient.startPingPong(count, recorder).doOnTerminate(() -> System.out.println("Sent " + count + " messages.")).blockLast();

参考:响应式应用新协议RSocket


推荐阅读
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • React 小白初入门
    推荐学习:React官方文档:https:react.docschina.orgReact菜鸟教程:https:www.runoob.c ... [详细]
  • 程序员_阿里Antd藏圣诞节彩蛋 程序员被离职
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了阿里Antd藏圣诞节彩蛋程序员被离职相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 我正在尝试使用scrapycrallsingle运行完美运行的scrapy蜘蛛,但我无法在python脚本中运行它.主要问题是从不执行SingleBlogSpider.parse方 ... [详细]
author-avatar
书友52745226
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有