想让系统更具有弹性?了解背压机制和响应式流的秘密!

简介: 想让系统更具有弹性?了解背压机制和响应式流的秘密!

分析传统开发模式和响应式编程实现方法之间的差别引出了数据流的概念

1 引言

从“流”的概念出发,并引入响应式流程规范,从而分析响应式编程中所包含的各个核心组件。

2 流的概念

由生产者生产,并由一或多个消费者消费的元素序列。这种生产者/消费者模型也称发布/订阅模型。


Reactive Streams 是 2013 年底由 Netflix、Lightbend 和 Pivotal 的工程师发起的一项计划,旨在为无阻塞异步流处理提供一个标准。解决处理元素流的问题——如何将元素流从发布者传递到订阅者,而不需要发布者阻塞,或订阅者有无限制的缓冲区或丢弃。

3 流的处理模型

拉模式

消费者主动从生产者拉取元素。

推模式

生产者将元素推送给消费者

4 流量控制

4.1 v(生产者生产数据) < v(消费者消费数据)

消费者消费数据没有任何压力,也就不需要进行流量的控制。

4.2 v(生产者生产数据) > v(消费者消费数据)

消费者可能因为无法处理过多的数据而发生崩溃。

一般就是在生产者与消费者之间加一个队列做缓冲。我们知道队列具有存储与转发的功能,所以可以用它来进行一定的流量控制。

5 队列选型

无界队列

  • 优势:确保消费者消费到所有的数据
  • 劣势:系统的回弹性降低,任何一个系统不可能拥有无限的资源,一旦内存等资源耗尽,系统就可能会有崩溃的风险。

有界丢弃队列

有界丢弃队列考虑了资源的限制,适用于允许丢消息的业务场景。但消息重要性很高的场景显然不可能采取这种队列。

有界阻塞队列

6 背压(Backpressure)机制

纯“推”模式下的数据流量会有很多不可控制的因素,需要在“推”模式和“拉”模式之间考虑一定的平衡性,从而优雅地实现流量控制

下游能够向上游反馈流量请求的机制。

如果消费者消费数据的速度赶不上生产者生产数据的速度,它就会持续消耗系统的资源。使得消费者可以根据自身当前的处理能力通知生产者来调整生产数据的速度,这就是背压。

7 响应式流规范

针对流量控制的解决方案以及背压机制都包含在响应式流规范中,其中包含了响应式编程的各个核心组件。

8 响应式流的核心接口

8.1 Publisher

一种可以生产无限数据的发布者。

public interface Publisher<T> {
    /**
     * 请求 Publisher 开始流式传输数据。
     * 这是一个“工厂方法”,可以多次调用,每次开始一个新的 Subscription.
     * 每个 Subscription 只能为一个 Subscriber.
     * A Subscriber 只能订阅一次 Publisher
     * 如果 拒绝 Publisher 订阅尝试或失败,它将通过 发出 Subscriber.onError(Throwable)错误信号
     */
    public void subscribe(Subscriber<? super T> s);
}

Publisher 里的 subscribe 方法传入 Subscriber 接口,这里用的是回调,Publisher 根据收到的请求向当前订阅者 Subscriber 发送元素。


,发出信号的元素类型。

8.2 Subscriber

可以从发布者那里订阅并接收元素的订阅者。

public interface Subscriber<T> {
    public void onSubscribe(Subscription s);
    public void onNext(T t);
    public void onError(Throwable t);
    public void onComplete();
}

Subscriber 接口定义的这组方法构成了数据流请求和处理的基本流程,其中,onSubscribe() 从命名上看就是一个回调方法,当发布者的 subscribe() 方法被调用时就会触发这个回调。而在该方法中有一个参数 Subscription,可以把这个 Subscription 看作是一种用于订阅的上下文对象。Subscription 对象中包含了这次回调中订阅者想要向发布者请求的数据个数。


当订阅关系已经建立,那么发布者就可以调用订阅者的 onNext() 方法向订阅者发送一个数据。这个过程是持续不断的,直到所发送的数据已经达到 Subscription 对象中所请求的数据个数。这时候 onComplete() 方法就会被触发,代表这个数据流已经全部发送结束。而一旦在这个过程中出现了异常,那么就会触发 onError() 方法,我们可以通过这个方法捕获到具体的异常信息进行处理,而数据流也就自动终止了。

8.3 Subscription

确保生产者、消费者针对数据处理速度达成一种动态平衡的基础,流量控制中实现背压的关键。

public interface Subscription {
    public void request(long n);
    public void cancel();
}

响应式流规范非常灵活,还可提供独立的“推”模型和“拉”模型。

响应式流是一种规范,而该规范的核心价值,就在于为业界提供了一种非阻塞式背压的异步流处理标准。

业界主流响应式开发库包括:

  • RxJava
  • Akka
  • Vert.X
  • Project Reactor

总结

本文分析了数据流的概念的分类以及“推”流模式下的流量控制问题,从而引出了响应式系统中的背压机制。

响应式流规范是对响应式编程思想精髓的呈现

对于开发人员而言,理解这一规范有助于更好的掌握开发库的使用方法和基本原理。

FAQ

简要描述响应式流规范中数据的生产者和消费者之间的交互关系。


响应式流规范中,数据的生产者和消费者之间的交互关系是基于观察者模式实现的。生产者通过创建一个可观察的数据流并向消费者提供订阅方法,消费者可以通过订阅这个数据流来获取数据。一旦生产者有新的数据产生,它会将数据发送给所有已订阅该数据流的消费者。消费者可以通过取消订阅方法来停止接收数据。这种交互关系使得生产者和消费者之间解耦,同时也允许消费者按需获取数据,从而实现了高效的异步编程。


目录
相关文章
|
前端开发 JavaScript
构建一个动态时钟
构建一个动态时钟
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
222371 69
|
11月前
|
人工智能 安全 Java
SonarQube Server 2025 Release 3 发布 - 代码质量、安全与静态分析工具
SonarQube Server 2025 Release 3 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
417 6
SonarQube Server 2025 Release 3 发布 - 代码质量、安全与静态分析工具
|
JSON 安全 Java
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
Spring Security 与 JWT、OAuth 2.0 整合详解:构建安全可靠的认证与授权机制
1993 0
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
|
运维 监控 Devops
DevOps实践:从理论到落地的旅程
在软件开发和运维日益融合的今天,DevOps已不仅仅是一个流行词汇。它代表了一种文化和实践的转变,旨在打破部门间的壁垒,加速产品从构思到市场的流程。本文将带你了解DevOps的核心理念,并通过实际案例展示如何将这些理念应用到日常工作中,实现高效协作和持续改进。无论你是DevOps新手还是资深专家,这篇文章都将为你提供新的视角和实用的技巧。
|
存储 安全 大数据
对象存储的意义:探索数据新纪元的关键基石
在信息爆炸时代,数据成为核心资产,而高效安全的数据存储至关重要。对象存储作为一种新兴技术,起源于20世纪90年代,旨在解决传统文件系统的局限性。随着云计算和大数据技术的发展,它已成为关键技术之一。对象存储具备高可扩展性、高可靠性、低成本、易于管理和多协议支持等优点。它支撑大数据发展、推动云计算繁荣、助力企业数字化转型并保障数据安全。未来,对象存储将进一步提升性能,实现智能化管理,并与边缘计算融合,获得政策支持,成为数据新时代的关键基石。
584 3
|
安全 Android开发 iOS开发
安卓与iOS操作系统的比较分析
【6月更文挑战第5天】本文将深入探讨安卓和iOS两大主流操作系统的特点、优势和劣势。通过对比分析,我们将揭示这两个系统在性能、安全性、用户体验等方面的差异,帮助用户更好地了解这两个系统,从而做出更明智的选择。

热门文章

最新文章

下一篇
开通oss服务