Spring响应式编程之Reactor介绍

Reactor介绍

  • 1、异步执行技术
  • 2、实现方式

响应式编程(Reactive Programming)是一种面向数据流和变化传播的编程范式。Java中的Reactor是一个用于响应式编程的库,它建立在Reactive Streams规范之上,旨在帮助开发者构建非阻塞的、高效的、具有弹性的应用程序。

1、异步执行技术

在传统开发过程中,通常是同步阻塞式的开发模式。举个例子:

假设消费者为A,服务者为B。A向B发送数据处理请求,在B处理的整个过程中,A一直处于阻塞状态,直到B处理完成返回数据。在整个过程中, CPU 利用效率低下,很多时间线程被浪费在了 I/O 阻塞上,无法执行其他的处理过程。

而响应式编程引入异步式调用的技术来实现异步非阻塞的能力。具体机制包括:回调和Future

  • 回调:回调体现的是一种双向调用方式。

    即A的methodA调用B的methodB,待B的methodB执行完成后再主动调用A的callback方法,在回调callback之前,A可以执行其他任务,这样就实现了异步功能,使得调用链路不发生任何的阻塞。

    但是,回调的最大问题是复杂性,一旦在执行流程中包含了多层的异步执行和回调,那么就会形成一种嵌套结构,给代码的开发和调试带来很大的挑战。所以回调很难大规模地组合起来使用,因为很快就会导致代码难以理解和维护,从而造成所谓的“回调地狱”问题。

  • Future:Future相当于一个代理,有任务需要处理直接提交给Future,Future 就会在一定时间内完成这个任务,而在这段时间内我们可以去做其他事情。

回调的示例:

interface Callback {void onComplete(String result);
}class AsyncProcessor {void doAsyncTask(Callback callback) {new Thread(() -> {// 模拟耗时操作try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 操作完成,调用回调函数callback.onComplete("Task Completed");}).start();}
}public class CallbackExample {public static void main(String[] args) {AsyncProcessor processor = new AsyncProcessor();processor.doAsyncTask(result -> {// 处理回调结果System.out.println(result);});System.out.println("Async task started");}
}

在AsyncProcessor类定义了一个异步任务方法doAsyncTask,该方法接受一个回调接口Callback。当异步任务完成时,回调函数onComplete被调用并传递结果。

“回调地狱”示例:

doAsyncTask1(result1 -> {doAsyncTask2(result2 -> {doAsyncTask3(result3 -> {doAsyncTask4(result4 -> {// 处理最终结果System.out.println(result4);});});});
});

2、实现方式

异步式编程的实现采用发布-订阅模式。

在此模式下,发布者和订阅者之间没有直接的交互,而是通过发送事件到事件处理平台的方式来完成整合。当发布者有新消息需要发布,就将该事件发布到处理平台,处理平台再将消息通知给所有的订阅者;订阅者也可以主动请求订阅,查看是否有新事件发布。如下图:

在这里插入图片描述

这样即使业务场景多种多样,事件处理方式也不同,所有事件都可以在处理平台进行处理,不同的场景只需要发送不同的事件即可。而对于这些事件,异步式编程称之为数据流。

数据流的概念类似为商品,生产者生产放到商店,消费者从商店获取。

相较传统开发所普遍采用的“拉”模式,在响应式编程下,基于事件的触发和订阅机制,这就形成了一种类似“推”的工作方式。这种工作方式的优势就在于,生成事件和消费事件的过程是异步执行的,所以线程的生命周期都很短,也就意味着资源之间的竞争关系较少,服务器的响应能力也就越高。


其他相关内容参考:
Spring响应式编程之Reactor背压机制
Spring响应式编程之Reactor核心接口
Spring响应式编程之Reactor核心组件
Spring响应式编程之Reactor操作符

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

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

相关文章

iOS包ShaderVariantCollection预热慢问题

1)iOS包ShaderVariantCollection预热慢问题 2)使用SBP打Bundle如何读取AssetBundleManifest 3)如何将一张贴图经过Shader处理后的结果输出给另外一个Shader使用 4)为什么我的水这么干净,和UE教程里的有差别 这是第392篇…

20240627优雅草新产品取得原始软件著作权授权

https://doc.youyacao.com/22/2153 20240627优雅草新产品取得原始软件著作权授权 介绍 历程消息:优雅草2024年新产品最新取得原始著作权两份,2款产品将在近期完成为商业授权产品在蜻蜓松鼠官网售卖,本两款产品是智慧园区能源监测管理系统解…

ConvMixer 论文与代码解析

paper:Patches Are All You Need? official implementation:https://github.com/locuslab/convmixer 精度上去了,推理速度只有卷积和ViTs的四分之一! 出发点 文章讨论了卷积神经网络(CNN)在视觉任务中…

Pinia的基本用法

Pinia的安装和引入 1.安装Pinia npm install pinia2. 在vue项目的main.js文件中引入pinia import { createApp } from vue import { createPinia } from pinia import App from ./App.vueconst pinia createPinia() const app createApp(App)app.use(pinia) app.mount(#ap…

2024广东省职业技能大赛云计算赛项实战——Ansible部署Zabbix

Ansible部署Zabbix 前言 今年的比赛考了一道Ansible部署Zabbix的题目,要求就是用两台centos7.5的云主机,一台叫ansible,一台叫node,使用对应的软件包,通过ansible节点控制node节点安装zabbix服务。这道题还是算比较简…

OAuth 2.0资源授权机制与安全风险分析

文章目录 前言OAuth2.01.1 OAuth应用1.2 OAuth基础1.3 授权码模式1.4 其它类模式1.5 openid连接 安全风险2.1 隐式授权劫持2.2 CSRF攻击风险2.3 Url重定向漏洞2.4 scope校验缺陷 总结 前言 OAuth 全称为Open Authorization(开放授权),OAuth …

内网穿透与异地组网强强联合,这款工具屌爆了!!!

在数字化飞速发展的今天,远程访问的需求日益增长,网络已成为我们生活和工作中不可或缺的一部分。然而,远程网络连接的稳定性和安全性往往是我们关注的焦点。节点小宝作为一款创新型的远程管理工具,凭借其使用简单,高速…

【计算机网络篇】数据链路层(13)共享式以太网与交换式以太网的对比

文章目录 🍔共享式以太网与交换式以太网的对比🔎主机发送单播帧的情况🔎主机发送广播帧的情况🔎多对主机同时通信 🛸使用集线器和交换机扩展共享式以太网的区别 🍔共享式以太网与交换式以太网的对比 下图是…

【数据分享】《中国保险年鉴》1981-2022

而今天要免费分享的数据就是1981-2022 年间出版的《中国保险年鉴》并以多格式提供免费下载。(无需分享朋友圈即可获取) 数据介绍 《中国保险年鉴》自1981年首版发行以来,已连续出版了四十余年,见证了中国保险业从萌芽到繁荣的全…

怎么隐藏宝塔面板左上角绑定的手机号码?

宝塔面板后台的左上角会显示我们绑定的宝塔账号(手机号码),每次截图的时候都要去抹掉这个号码,那么能不能直接将这个手机号码隐藏掉呢? 如上图红色箭头所示的手机号码,其实就是我们绑定的宝塔账号&#xff…

NavicatforMySQL11.0软件下载-NavicatMySQL11最新版下载附件详细安装步骤

我们必须承认Navicat for MySQL 支援 Unicode,以及本地或远程 MySQL 服务器多连线,使用者可浏览数据库、建立和删除数据库、编辑数据、建立或执行 SQL queries、管理使用者权限(安全设定)、将数据库备份/复原、汇入/汇出数据&…

API-其他事件

学习目标: 掌握其他事件 学习内容: 页面加载事件元素滚动事件页面尺寸事件 页面加载事件: 加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件。 为什么要学?? 有些时候需要等…

NodeJs 使用中间件实现日志生成功能

写在前面 今天我们实现一个记录 nodejs 服务请求日志的功能,大概的功能包括请求拦截,将请求的信息作为日志文件的内容写入到 txt 文件中,然后输出到指定的日志到当天日期目录中,从而实现后续查找用户请求信息的功能,下…

10分钟微调专属于自己的大模型_10分钟微调大模型

1.环境安装 # 设置pip全局镜像 (加速下载) pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ # 安装ms-swift pip install ms-swift[llm] -U# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试) pip install -r r…

《web应用技术》第十二次课后作业

1.servlet基础知识 1.定义 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 2.生命周期 init 方法被设计成只调用一次。它在第一次创建 Servlet 时被…

如何高效使用 .http 文件记录和测试API接口

1. 前言 在现代软件开发中,API(应用程序接口)成为了系统间通信的重要桥梁。.http 文件作为一种轻量级的API请求描述方式,不仅便于开发者记录和分享API接口信息,还能够帮助自动化测试流程。本文将深入介绍如何有效地使…

暑假追高必备:ChildLife全新钙镁锌小绿钙

2024年暑假将至,家长们对于孩子的健康关注再次提升,其中补钙成为许多家长关注的重点。暑假期间,孩子有更多时间进行户外活动,加上高温流汗多,身体的钙更容易流失,因此需要额外地补充。为此,美国…

数据恢复篇:如何恢复丢失的Android短信?

许多用户发现自己处于重要短信意外从Android手机中删除的情况。幸运的是,有一些行之有效的方法可以在没有root的情况下恢复已删除的短信Android,这可以成为救命稻草。这些技术不需要深厚的技术知识,也不需要损害设备的安全性。为了帮助您摆脱…

iOS项目开发遇到问题杂项坑点记录

ios17 弹窗UIAlertController展示逻辑变化,单个词一行展示不下不换行(这前版本会换行),直接截断超出部分。 UINavigationController push立刻pop会异常,使用用setViewCollerllers可以避免这个问题 键盘切换后立刻切页…

通过搭建 24 点小游戏应用实战,带你了解 AppBuilder 的技术原理

本文将通过一个 24 点小游戏的案例,详细介绍百度智能云千帆 AppBuilder 的基本技术原理和使用方法,帮助读者快速掌握 AI 原生应用的开发流程。 1 三步构建 AI 原生应用方法论 AI 原生应用与传统应用的最大区别是交互形态彻底的拟人化,通过文…