热门标签 | 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


推荐阅读
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 编写了几个500行左右代码的程序,但基本上解决问题还是面向过程的思维,如何从问题中抽象出类,形成类的划分和设计,从而用面向对象的思维解决问题?有这方面的入门好书吗?最好是结合几个具体的案例分析的 ... [详细]
  • 本文详细介绍了如何在Kendo UI for jQuery的数据管理组件中,将行标题字段呈现为锚点(即可点击链接),帮助开发人员更高效地实现这一功能。通过具体的代码示例和解释,即使是新手也能轻松掌握。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本文详细介绍了Ionic框架的使用方法及其与Angular的集成。Ionic框架是一个强大的前端开发工具,适用于构建跨平台的移动应用程序。文章将探讨如何引入必要的CSS和JavaScript文件,并解释bundle.js中包含的核心功能,如路由等。 ... [详细]
  • Java每日一题:876. 链表的中间节点解析
    本文详细介绍了LeetCode上编号为876的题目——链表的中间节点,包括问题描述、解决方案和代码实现。 ... [详细]
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社区 版权所有