Reactive & RSocket介绍

471 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Reactive响应式(反应式)编程是一种新的编程风格,其特点是异步或并发、事件驱动、推送PUSH机制以及观察者模式的衍生。 Rsocket 是用于字节流传输的二进制协议。它支持通过异步消息在单个连接上传递对称交互模型。它提供了 HTTP 等其他协议的替代方案。

Reactive Programming(响应式编程)

异步非阻塞就是响应式编程,与之相对应的是命令式编程。 Java Reactive Web设计与实现:segmentfault.com/a/119000001…

Reactive

Reactive响应式(反应式)编程是一种新的编程风格,其特点是异步或并发、事件驱动、推送PUSH机制以及观察者模式的衍生。reactive应用(响应式应用)允许开发人员构建事件驱动(event-driven),可扩展性,弹性的反应系统:提供高度敏感的实时的用户体验感觉,可伸缩性和弹性的应用程序栈的支持,随时可以部署在多核和云计算架构。

Reactive特性

1.Event-Driven事件驱动,异步非堵塞 3.Responsive响应式,必须能有响应,哪怕错误。 4.Resilient弹性,失败恢复是一等公民。

与 Reactive 发展相关的三种技术,微服务、云计算和 DDD

Reactive 与 微服务

随着业务的快速发展、业务复杂度越来越高,传统单体应用逐渐暴露出了一些问题,例如开发效率低、可维护性差、架构扩展性差、部署不灵活、健壮性差等等。而微服务架构是将单个服务拆分成一系列小服务,且这些小服务都拥有独立的进程,彼此独立,很好地解决了传统单体应用的上述问题,因此受到了业内的重视和推崇。

但是落地微服务架构就必须解决服务之间的通讯问题。传统的通讯方式是 RPC 调用,但是服务与服务之间通讯不只有 RPC,有些服务可能负责消费数据,有些可能负责数据采集或生成,有时服务之间的通讯是相互且对等的,服务的角色在分工细化之后,就需要一个更全面的通讯协议。

Reactive 与 云计算

我们常说:“现在大家讨论的已经不再是要不要上云的问题,而是上哪朵云、怎么上的问题了。”企业上云已经是大势所趋,但是上云之后,大家首先会关心的就是成本问题。

上云之前,企业一般是在年初的时候就做好一年的规划,购买足够多的机器,所以对于机器的利用率不是特别关心,只要保证不超出预算就可以。但是上云之后,机器利用率的高低直接关乎着每个月的 IT 费用,所以大家都想着利用率能不能高点、再高点,费用能不能省点,再省点。

而异步就是提升机器利用率最好的方法之一,因此云计算的发展也推动了 Reactive 的发展。

Reactive 与 DDD

领域驱动设计(DDD)是一个开放的软件设计方法论,从 Eric Evans 出版《领域驱动设计》之后,DDD 一直是业内推崇的设计方法学,其划分服务的 Bounded Context 理念已经被微服务设计所接受。但是在各个 Context 之间如何通讯,DDD 推荐的做法是基于消息 / 事件的理念,但是具体使用什么样的技术、什么样的协议等等,这些都没有明确,可以说是一个宽泛的概念。

2014 年,Dean Wampler 提出:“DDD 是针对设计诞生的,关于实现使用了更多抽象概念,也就是没有明确如何实现,也许 DDD 以一种非 OOP 方式也许更好,Reactive 方式很合适 DDD 实现。”

DDD + Reactive 的结合,就很好地解决了 Context 之间如何相互通讯的问题,将抽象的概念能够以非常直观方式进行实现,这个也是 DDD 倡导的从问题域到实现域一整套解决思路。

back pressure(背压)

Backpressure其实是一种现象:在数据流从上游生产者向下游消费者传输的过程中,上游生产速度大于下游消费速度,导致下游的 Buffer 溢出,这种现象就叫做 Backpressure 出现

RSocket

Rsocket 是用于字节流传输的二进制协议。它支持通过异步消息在单个连接上传递对称交互模型。它提供了 HTTP 等其他协议的替代方案。

RSocket特性

  • 具有语言无关性的二进制通信协议
  • 异步非阻塞消息驱动通信,高性能
  • 实现了网络通信的背压处理,在此基础上进行流量控制、连接恢复
  • 天然支持双向通信
  • 更加适合分布式通信场景

RSocket提供了四种交互模型

  • Request/Reponse(stream of 1):请求/响应;每个请求接收一个响应。
  • Request/Stream(finite stream of many):请求/响应流;单个请求可以接收多个响应。
  • Fire-And-Forget(no response):单向请求;客户机将不会收到来自服务器的响应。
  • Channel(bi-directional streams):双向通信;消息流在两个方向异步流动。

RSocket VS HTTP

HTTP是为了解决浏览器与服务器交互场景实现的协议 RSocket是为了解决服务器与服务器交互场景实现的协议

RSocket

  • 共享长连接
  • 多路传输消息
  • 沟通背压
  • 任何一方都可以发起请求
  • 支持取消/恢复流

HTTP

  • 每次请求创建新连接(HTTP 1.0)
  • 管道消息(HTTP 1.1)
  • 不通讯背压
  • 只有客户端可以发起连接
  • 不支持取消/恢复流

Alibaba RSocket Broker

Alibaba RSocket Broker是一款基于RSocket协议的反应式对等通讯系统,为通讯多方构建分布式的RPC, Pub/Sub, Streaming等通讯支持。

image.png

  • 配置推送: 通过 RSocket 的 metadataPush 可以完成应用配置推送;
  • 服务注册和发现:应用和 Broker 建立连接后,这个长连接就是服务注册和发现,不需要额外的服务注册中心;
  • 透明路由: 应用在调用服务时,不需要知道服务对应的应用信息, Broker 会完成路由;
  • Service-to-service 调用: RSocket 支持服务之间通讯的 4 个模型;
  • 负载均衡 (Load balance): 应用和 Broker 建立长连接后,基于长连接的负载均衡就会变得非常简单;
  • Circuit Breakers: 断路保护,现在调整为被压 (Back Pressure) 支持,服务保护策略更自然;
  • 分布式消息 (Distributed messaging) 通讯: RSocket 通讯策略本来就是基于消息的;

References

RSocket: rsocket.io/ RSocket Java SDK: github.com/rsocket/rso… Spring RSocket: docs.spring.io/spring/docs… Spring Boot RSocket Starter: docs.spring.io/spring-boot… Project Reactor: projectreactor.io/ Reactive Foundation: reactive.foundation/ RSocket By Example: rsocketbyexample.info/