重学SpringBoot3-Reactive-Streams规范

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

在这里插入图片描述

重学SpringBoot3-Reactive-Streams规范

  • 1. 什么是 Reactive-Streams 规范?
  • 2. Reactive-Streams 的核心组件
    • 2.1 Publisher(发布者)
    • 2.2 Subscriber(订阅者)
    • 2.3 Subscription(订阅)
    • 2.4 Processor(处理器)
  • 3. 背压机制(Backpressure)
  • 4. Reactive-Streams 与 Reactor
  • 5. 为什么选择 Reactive-Streams?
  • 6. 总结

随着现代系统对高吞吐量、低延迟和可扩展性需求的增加,响应式编程逐渐成为处理异步数据流的重要范式。上一篇文章介绍了 Reactor核心概念,而 Reactor 的基础就是 Reactive-Streams 规范,它定义了一套标准化的异步数据处理接口,用于在不同的响应式编程框架和库之间实现兼容性。

在这篇博客中,我们将详细介绍 Reactive-Streams 规范的核心概念和它在实际编程中的重要性。

1. 什么是 Reactive-Streams 规范?

Reactive-Streams 是由多家技术公司(包括 Lightbend、Netflix、Pivotal 等)联合发布的一套处理异步流式数据的标准。其核心目标是定义一个兼容的、非阻塞的背压(Backpressure)处理模型,帮助开发者处理高速数据流中可能产生的压迫问题。

Reactive-Streams 规范主要针对以下几个问题:

  • 异步数据流的处理:以非阻塞方式处理数据,保证资源高效使用。
  • 背压处理:当消费者的处理速度低于生产者时,合理管理数据流的流量,避免系统崩溃。
  • 跨框架兼容性:在不同响应式框架(如 Reactor、RxJava 等)之间实现互操作。

2. Reactive-Streams 的核心组件

Reactive-Streams 规范定义了四个核心接口,分别为 PublisherSubscriberSubscriptionProcessor。这些接口共同构成了异步数据流的处理模型。

2.1 Publisher(发布者)

Publisher 负责发布数据,它是数据源的一部分,向订阅者(Subscriber)发送数据。Publisher 接口非常简单,定义了一个方法:

public interface Publisher<T> {void subscribe(Subscriber<? super T> subscriber);
}

通过 subscribe 方法,Publisher 可以向多个 Subscriber 注册,通知其数据流的到达。

2.2 Subscriber(订阅者)

Subscriber 是数据的消费者,接收 Publisher 发布的数据流。Subscriber 需要实现四个方法,分别处理不同的状态变化:

public interface Subscriber<T> {void onSubscribe(Subscription s);  // 初始化时调用void onNext(T t);                  // 当有新数据到达时调用void onError(Throwable t);         // 当发生错误时调用void onComplete();                 // 当数据流结束时调用
}
  • onSubscribe:接收到 Subscription 对象,订阅者可以通过它控制数据的请求和取消。
  • onNext:每当有数据发布时,Publisher 会调用该方法。
  • onError:如果发生错误,onError 会被调用,终止数据流。
  • onComplete:当所有数据发布完成时调用。

2.3 Subscription(订阅)

Subscription 是连接 PublisherSubscriber 的纽带,它允许 Subscriber 控制数据流的数量。背压机制就依赖于 Subscription 进行数据流量控制:

public interface Subscription {void request(long n);   // 请求 n 个数据元素void cancel();          // 取消数据流
}
  • requestSubscriber 使用 request 方法向 Publisher 请求一定数量的数据,避免数据泛滥。
  • cancel:终止数据流,停止接收任何新的数据。

2.4 Processor(处理器)

Processor 是一种特殊的组件,它既是 Subscriber 也是 Publisher,充当中间处理器,允许在接收到数据后对其进行处理再发布给下游。

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {// 既能订阅数据,也能发布处理后的数据
}

3. 背压机制(Backpressure)

背压是 Reactive-Streams 规范中的关键概念。它用于处理生产者发送数据过快(正压),而消费者无法及时处理的情况。没有背压机制的系统很容易出现内存溢出或性能下降。

通过 Subscriptionrequest(n) 方法,消费者可以根据自己的处理能力,向生产者请求合适数量的数据。如果消费者处理不过来,它可以在没有请求更多数据之前停止接收。

以下是一个简单的背压示例:

package com.coderjia.boot3webflux.controller;import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;/*** @author CoderJia* @create 2024/10/21 下午 10:56* @Description**/
public class MySubscriber implements Subscriber<String> {private Subscription subscription;@Overridepublic void onSubscribe(Subscription subscription) {this.subscription = subscription;subscription.request(5); // 一次请求5个数据}@Overridepublic void onNext(String s) {System.out.println("Received: " + s);// 每处理一个数据,继续请求一个数据subscription.request(1);}@Overridepublic void onError(Throwable t) {System.err.println("Error: " + t.getMessage());}@Overridepublic void onComplete() {System.out.println("All data processed");}
}

在这个例子中,Subscriber 控制每次只处理 5 个数据,然后根据处理速度继续请求。

4. Reactive-Streams 与 Reactor

Reactor 是 Spring 的响应式编程库,完全基于 Reactive-Streams 规范。它通过 FluxMono 两种 Publisher 来实现数据流的发布。

  • Mono:表示一个包含 0 或 1 个数据的异步流。
  • Flux:表示一个包含 0 到多个数据的异步流。

Reactor 的底层实现遵循了 Reactive-Streams 规范,并扩展了许多强大的操作符,用于流的转换、过滤、组合等操作。

例如,Reactor 中的一个简单数据流处理示例:

Flux.just("A", "B", "C").map(String::toLowerCase).subscribe(new MySubscriber());
  • 生产者Flux.just("A", "B", "C") 是生产者,它负责发布数据(即 "A", "B", "C"),形成一个包含这三个元素的异步数据流。FluxPublisher 的实现。
  • 消费者subscribe(new MySubscriber()) 是消费者,它订阅了数据流并消费数据。System.out::println 作为 Subscriber,每接收到一个数据就执行打印操作。

在这个流程中,Flux 作为发布者通过 map 操作符对数据流中的每个元素进行转换,最后在 subscribe 处进行消费。

5. 为什么选择 Reactive-Streams?

Reactive-Streams 是构建响应式应用的基础,它提供了以下优势:

  • 兼容性:由于 Reactive-Streams 是一个标准,不同的响应式库(如 Reactor 和 RxJava)可以无缝互操作。
  • 非阻塞:避免了传统阻塞式 IO 模型中的性能瓶颈。
  • 背压支持:通过背压机制,可以控制数据流量,防止消费者过载。
  • 简洁的异步数据处理:通过标准化的接口和操作符,处理异步流数据变得更加简洁和直观。

6. 总结

Reactive-Streams 规范是现代响应式编程的基础,它为处理异步数据流提供了标准化的接口定义,并解决了异步处理中的背压问题。通过 PublisherSubscriberSubscriptionProcessor,开发者可以轻松地实现高效、可扩展的响应式系统。

在 Spring 生态系统中,Reactor 是最重要的响应式编程库,它完全遵循 Reactive-Streams 规范,并为我们提供了强大的功能,简化了异步数据流的处理。

下一步,可以结合实际项目,尝试使用 Reactive-Streams 和 Reactor 实现异步数据流的处理,提升应用的性能与可扩展性。

这篇博客详细介绍了 Reactive-Streams 规范的核心概念和它的作用,希望能为你提供清晰的理解。如果你对 Reactor 或响应式编程有更深入的兴趣,欢迎继续探索!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/456219.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞睿智能超宽带UWB音频传输模块,超低延迟数据传输,实时音频声音更纯净

在信息爆炸的时代&#xff0c;音频传输技术正以未有的速度发展&#xff0c;创新我们进入一个全新的听觉世界。今天&#xff0c;我们要探讨的&#xff0c;就是这场技术创新中的一颗璀璨明星——飞睿智能超宽带&#xff08;UWB&#xff09;音频传输模块。它以其独特的优势&#x…

光谱指标-预测含水量-多种特征提取方式

目录 1 介绍1.1 变量投影重要性&#xff08;VIP&#xff09;分析1.2. 灰色关联度&#xff08;GRA&#xff09;分析1.3. 皮尔逊相关性分析1.4 总结 2 GRA灰色关联度3 皮尔逊(Person)相关性4 变量投影重要性(Variable importance in projection&#xff0c;VIP)分析5 机器学习 1 …

webpack 老项目升级记录:从 node-sass 限制的的 node v8 提升至支持 ^node v22

老项目简介 技术框架 vue 2.5.17webpack 4.16.5"webpack-cli": "3.1.0""node-sass": "^4.7.2" 几个阶段 第一步&#xff1a;vue2 升级到最新 第一步&#xff1a;升级 vue2 至最新版本&#xff0c;截止到目前&#xff08;2024-10-…

戴维南,叠加,稳态笔记

一点点学习笔记,仅做个人复习使用 节点电压分清电流电压源&#xff0c;电流源才能写在右边&#xff0c;容易混淆 叠加定理仅适用于线性电路&#xff0c;且不能用于计算功率&#xff0c;主要是方向&#xff0c;要看源的方向判断等效之后的&#xff0c;受控源不参与除源&#x…

DMVPN协议

DMVPN&#xff08;Dynamic Multipoint VPN&#xff09;动态多点VPN 对于分公司和分总公司内网实现通信环境下&#xff0c;分公司是很多的。我们不可能每个分公司和总公司都挨个建立ipsec隧道 &#xff0c;而且如果是分公司和分公司建立隧道&#xff0c;就会很麻烦。此时我们需…

iPhone当U盘使用的方法 - iTunes共享文件夹无法复制到电脑怎么办 - 如何100%写入读出

效果图 从iPhone复制文件夹到windows电脑 步骤windows 打开iTunes通过USB连接iPhone和电脑手机允许授权iTunes中点击手机图标&#xff0c;进入到点击左边“文件共享”&#xff0c;在右边随便选择一个App&#xff08;随意...&#xff09;写入U盘&#xff1a;拖动电脑的文件&am…

随机抽取学号

idea 配置 抽学号 浏览器 提交一个100 以内的整数。&#xff0c;后端接受后&#xff0c;根据提供的整数&#xff0c;产生 100 以内的 随机数&#xff0c;返回给浏览器&#xff1f; 前端&#xff1a;提供 随机数范围 &#xff0c;病发送请求后端&#xff1a;处理随机数的产生&…

信息安全工程师(66)入侵阻断技术与应用

#1024程序员节&#xff5c;征文# 前言 入侵阻断技术是网络安全主动防御的重要技术方法&#xff0c;其基本原理是通过对目标对象的网络攻击行为进行阻断&#xff0c;从而达到保护目标对象的目的。 一、入侵阻断技术的核心原理 入侵阻断技术的核心在于对网络攻击行为的实时检测和…

震撼叶珂“假胸”引发热议黄晓明无辜躺枪

【一场关于美的争议】在这个信息爆炸的时代&#xff0c;每一个细微的风吹草动都可能成为公众关注的焦点。近日&#xff0c;一则关于叶珂“假胸”的传闻在网络上掀起了轩然大波。有网友爆料称&#xff0c;叶珂的胸部整形过度&#xff0c;甚至“隆得比肚子还大&#xff0c;都垂到…

Node + HTML搭建自己的ChatGPT [基础版]

文章目录 明明外面的ChatGPT产品那么多了&#xff0c;为什么要在本地搭建自己的ChatGPT呢&#xff1f;整体架构流程1. 获取APIKey1.1 常见的AI模型1.2 为什么选DeepSeek1.3 怎么获取DeepSeek的APIKey1.3.1 注册并登录DeepSeek开放平台1.3.2 选择API keys1.3.3 创建API key1.3.4…

VSCode编译器改为中文

1. 通过快捷键设置中文 打开命令面板&#xff1a;按住键盘上的CtrlShiftP组合键&#xff0c;打开命令面板。 输入并设置语言&#xff1a;在命令面板中输入Configure Display Language。 点击Configure Display Language选项。 在弹出的语言选择列表中&#xff0c;选择zh-cn…

node.js下载安装以及环境配置超详细教程【Windows版本】

node安装以及环境变量配置 Step1&#xff1a;选择版本进行安装Step2&#xff1a;安装Node.jsStep3&#xff1a;环境配置Step4&#xff1a;检查node.js是否成功安装Step5&#xff1a;npm修改下载镜像 Step1&#xff1a;选择版本进行安装 Node.js 安装包及源码下载地址为 Node.…

基于Spring Boot的宿舍管理系统设计与实现(源码+定制+开发)宿舍信息管理平台、智能宿舍系统开发、学生宿舍管理平台设计、宿舍入住与信息管理

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

QT-使用QSS美化UI界面

一、QSS简介&#xff1a; Qt Style Sheet&#xff1a;Qt样式表&#xff0c;用来自定义控件外观的一种机制&#xff0c;可以把他类比成CSS&#xff08;CSS主要功能与最终目的都是能使界面的表现与界面的元素分离&#xff09;。QSS机制使应用程序也能像web界面那样随意地改变外观…

vue3移动端可同时上传照片和视频的组件

uni-app中的uni-file-picker可单独上传照片或视频&#xff0c;但不支持同时上传照片和视频。本篇博客使用image标签和video标签实现移动端&#xff08;H5app小程序&#xff09;中照片和视频的同时上传。 本篇博客采用的是照片和视频的单独上传&#xff0c;但可同时展示&#xf…

Qt 学习第 天:线程与多线程

1024程序员快乐&#xff0c;如果这博客让你学习到了知识&#xff0c;请给我一个免费的赞❤️ 一、创建界面文件 LCDnumber 二、创建mythread类&#xff0c;继承QObject 三、在MyThread.h文件做修改&#xff0c;并且加上函数声明 引入头文件&#xff0c;改变继承 #ifndef MY…

Nginx+Tomcat 动静分离

1. NginxTomcat 环境 Nginx 处理静态资源的优势同样可以应用在 Tomcat 环境中 。从实现方法上来说&#xff0c;NginxTomcat 环境的搭建思路与前面完成的 NginxApache 环境是完全相同的&#xff0c;只需要将 Nginx 与 Tomcat 的站点文档目录配置到同一目录下&#xff0c;利用 N…

C# 委托简述

1.委托 1.1什么是委托 委托委托 官网解释: 委托是安全封装方法的类型&#xff0c;类似于 C 和 C 中的函数指针。 与 C 函数指针不同的是&#xff0c;委托是面向对象的、类型安全的和可靠的。 委托的类型由委托的名称确定。 个人理解:委托就是一个方法的模板。它可以接收…

ASP.NET MVC-font awesome-localhost可用IIS不可用

环境&#xff1a; win10, .NET 6.0&#xff0c;IIS 问题描述 本地IIS正常显示&#xff0c;但放到远程服务器上&#xff0c;每个icon都显示?。同时浏览器的控制台报错&#xff1a; fontawesome-webfont.woff2:1 Failed to load resource: the server responded with a statu…

uni-app 开发微信小程序,实现图片预览和保存

1.使用 uni.previewImage() 预览图片 1.1 图片列表 1.2 预览 1.2.1 样式无法调整 1.2.2 微信小程序不支持预览本地文件路径图片&#xff08;图片上传到小程序的临时文件存储或云服务存储&#xff09; 1.3 无法绑定 longpress"saveImage(item)" 长按保存图片事件 …