响应式编程-reactor

什么是响应式编程

正如我们所知道的过程式编程、命令式编程、面向对象编程、事件驱动编程范式,响应式编程也是编程范式的一种。

基础介绍

reactor作为一种响应式编程具体实现,能够跟踪异步场景下的数据流和数据状态变更。在Java9中已经集成了响应式编程的接口,类名为Flow。

现在的硬件已经非常厉害了,但是随着并发量的增加,仍然会达到瓶颈。现在主要有两个方式解决程序的系统:
(1)并行:单机维度增加线程,集群维度扩机器;
(2)高效的资源利用:寻找更有效的方式利用当前已有的资源;

现在我们传统的做法是写阻塞式的代码,如果出现性能瓶颈,可能会想办法提升并发度,但是这种方式可能会导致竞争和并发等问题。更糟糕的是,可能由于等待IO资源,导致线程一直处于空闲等待,导致资源浪费。

目前在jvm中听过了两种异步编程的模式:Callbacks、Futures。
Callbacks模式很难实现组合,从而导致读和理解都较困难,而Futures模式比Callbacks模式好一些,但是也存在多种问题:不支持懒计算、缺失多值及错误处理等机制。

多种异步写法的比较

Callbacks写法

// 定义回调接口
interface Callback {void callback(String res);
}// 异步回调模拟调用
public void asyncWork(Callback callback) {new Thread(()->{// 先做某些事情String s = doSomething();// 等事情做完之后,执行回调函数callback.callback(s);}).start();
}// 模拟做的事情
private String doSomething() {try{Thread.sleep(5000);}catch (Exception ignored){}return "test";
}

Futures写法

// 异步执行
CompletableFuture.runAsync(() ->{doSomething();
});// 模拟做的事情
private String doSomething() {try{Thread.sleep(5000);}catch (Exception ignored){}return "test";
}

Reactor写法

@Test
public void test10() {// 创建一个流式数据Flux<String> flux = Flux.just("a", "b", "c");// 在一个异步调度器中执行数据打印flux.subscribeOn(Schedulers.parallel()).subscribe(System.out::println);
}

优缺点

优点

  • 非阻塞式;
  • 更好的资源利用;
  • 可组合性;
  • 错误处理;

缺点

  • 学习曲线可能复杂些;
  • 调试麻烦些;
  • 过度使用可能导致性能问题;

使用方式

引入依赖包

<dependencyManagement> <dependencies><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-bom</artifactId><version>2023.0.11</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId> </dependency><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-test</artifactId> <scope>test</scope></dependency>
</dependencies>

进行Flux或者Mono封装

@Test
public void test3() {Mono<String> future1 = Mono.fromCallable(() -> {Thread.sleep(5000);return "Result 1";}).subscribeOn(Schedulers.elastic());Mono<String> future2 = Mono.fromCallable(() -> {Thread.sleep(5000);return "Result 2";}).subscribeOn(Schedulers.elastic());long start = System.currentTimeMillis();Mono<List<String>> mono = Flux.merge(future1, future2).collectList().timeout(Duration.ofSeconds(9));List<String> res = mono.block();System.out.println(res);System.out.println("cost:" + (System.currentTimeMillis() - start));
}@Test
public void test9() {Mono<String> mono = Mono.fromSupplier(()-> {try {System.out.println("name:" + Thread.currentThread().getName());Thread.sleep(5000);}catch (Exception e){}return "hello";});long start = System.currentTimeMillis();mono.subscribeOn(Schedulers.parallel()).block();System.out.println("cost:" + (System.currentTimeMillis() - start));
}

Q&A

Q:publishOn和subscribeOn的区别
A:参考下面文档:
https://blog.csdn.net/qq_33797928/article/details/105005629
https://juejin.cn/post/7147655449695748126
https://juejin.cn/post/7251894360722292792

个人思考

1、计算机涉及多种资源,比如:CPU资源、IO资源(网络设备、存储设备)等,如果很容易出现资源瓶颈,会导致计算机资源没法充分利用。比如当CPU资源使用率为30%时,IO资源使用率已达到100%,这时候会导致CPU资源出现严重的浪费。如果能通过合理的系统调度,保证CPU、IO等资源都能进行合理的利用,可能会导致整体的性能有很大的提升。

参考文档

1、reactor问题社区
https://stackoverflow.com/questions/tagged/reactor
2、官方文档
https://projectreactor.io/docs/core/release/reference/#_blocking_can_be_wasteful

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

LinkedIn怎么养号:2024最新养号技巧揭秘

LinkedIn领英作为全球最大的职场社交平台&#xff0c;是跨境外贸企业与潜在客户、业务伙伴和同事进行交流的重要平台。然而&#xff0c;许多人在注册和使用LinkedIn时&#xff0c;常常会遇到账户受限甚至被封的困扰。想要拥有一个安全稳定的LinkedIn账户&#xff0c;养号是必不…

RHCE—web服务器

一、web服务器简介 web服务器一般指的是“网站服务器”&#xff0c;是某种驻留在因特网上的计算机程序&#xff0c;可以向请求终端提供服务&#xff0c;主要功能时存储、处理和传递网页给“客户”&#xff0c;传递内容一般是HTML文档、图像、样式表或脚本等&#xff0c;也可以…

块存储、文件存储和对象存储详细介绍

块存储、文件存储和对象存储介绍 块存储&#xff1a;像跑车&#xff0c;因为它们都能提供快速的响应和高性能&#xff0c;适合需要即时数据访问的场景&#xff0c;比如数据库和虚拟化技术。 文件存储&#xff1a;像货车&#xff0c;因为它们都能承载大量货物&#xff08;文件&…

ARM base instruction -- umaddl

Unsigned Multiply-Add Long multiplies two 32-bit register values, adds a 64-bit register value, and writes the result to the 64-bit destination register. 将两个32位寄存器值相乘&#xff0c;添加一个64位寄存器值&#xff0c;并将结果写入64位目标寄存器。 64-bit…

bossplayersCTF: 1 靶场渗透

靶场&#xff1a;bossplayersCTF: 1 bossplayersCTF: 1 ~ VulnHubhttps://www.vulnhub.com/entry/bossplayersctf-1,375/ 攻击机&#xff1a;kali-linux-2024 第一部分&#xff1a;信息收集 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;…

【linux学习指南】磁盘分区挂载到目录,形成文件系统挂载点

文章目录 &#x1f4dd;前言&#x1f320; 查看系统分区&#x1f309;制作一个大的磁盘块&#xff0c;就当做一个分区&#x1f309;格式化写入文件系统&#x1f309;将分区挂载到指定的目录&#x1f309;在分区重创建文件&#x1f309;卸载分区&#x1f309;分区挂载到目录才能…

STM32CUBEIDE FreeRTOS操作教程(八):queues多队列

STM32CUBEIDE FreeRTOS操作教程&#xff08;八&#xff09;&#xff1a;queues多队列 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&#…

redis 原理篇 25 网络模型 信号驱动IO 及 异步IO

剩下这两种&#xff0c;用得少&#xff0c;快速过一下&#xff0c; 说啥队列太小&#xff0c;这个不是问题&#xff0c;搞个持久化&#xff0c; 说啥队列元素太频繁导致开销大&#xff0c;这个也没问题&#xff0c;搞成批量入队&#xff0c;减少频率&#xff0c;增大吞吐量&am…

某事业单位转型公益二类后岗位梳理项目纪实

某事业单位转型公益二类后岗位梳理项目纪实 ——公益一类事业单位转型二类后&#xff0c;如何优化岗位配置&#xff0c;梳理岗位职责 【客户行业】事业单位 【问题类型】岗位梳理 【客户背景】 某地公证机构于20世纪90年代经批准设立&#xff0c;是该市司法局直属国家公证…

DNS域名解析服务器--RHCE

1.DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网 DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。 DNS 使用的是…

Linux案例:DNS服务器配置

Linux案例&#xff1a;DNS服务器配置 实验一&#xff1a;正向解析 服务端配置&#xff1a; [rootserver ~]# setenforce 0 [rootserver ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.70.131/24 ipv4.gateway 192.168.70.2 ipv4.dns 114.114.114.11…

京东创作平台旋转验证码识别

昨天京东创作平台验证码又更新了&#xff0c;变成了这种旋转验证码。经过我们一天的努力&#xff0c;终于完成了这款验证码的数据标记&#xff0c;模型训练。现在正确率达到了几乎100%。 识别代码 只需要获取图片链接&#xff0c;下载图片得到原图&#xff0c;使用下面代码就可…

Spring DispatcherServlet详解

文章目录 Spring DispatcherServlet详解一、引言二、DispatcherServlet的初始化与工作流程1、DispatcherServlet的初始化1.1、加载配置和建立WebApplicationContext1.2、初始化策略 2、DispatcherServlet的工作流程2.1、请求分发2.2、代码示例 三、总结 Spring DispatcherServl…

Ubuntu 安装CUDA, cuDNN, TensorRT(草稿)

文章目录 写在前面一、CUDA, cuDNN, TensorRT 三个库的版本的确定二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04, 本文安装的版本&#xff1a; cuda_11.1.0&#xff1b;cuDNN-8.2.1&#xff1b;TensorRT-8.2.4.2 一、CUDA, cuDNN, TensorRT 三个库…

[GDKOI2024 普及组] 读书(线段树)

luogu 传送门https://www.luogu.com.cn/problem/P10077 解题思路 我们可以贪心地思考&#xff1a;每次寻找最小值&#xff0c;然后去阅读这一章。 直到阅读的章数达到 。 这样&#xff0c;你就可以写出一个 的暴力&#xff0c;拿 40 分。 但是&#xff0c;如果你并不满足于…

TCP/IP基础

TCP/IP的概念 TCP/IP是一个协议簇&#xff0c;包括多个协议 定义了计算机操作系统如何连入因特网&#xff0c;以及数据如何在他们之间传输的标准。 TCP/IP的分层结构 TCP/IP按照层次可以分成四层&#xff0c;应用层、传输层、网络层和数据链路层 应用层 包括虚拟终端协议…

数据迁移: 安全高效转移数据, 满足企业业务需求和技术改进

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

可视化建模与UML《类图实验报告》

史铁生&#xff1a; 余华和莫言扛着我上火车&#xff0c; 推着走打雪仗&#xff0c; 还带我偷西瓜&#xff0c; 被人发现后他们拔腿就跑&#xff0c; 却忘了我还在西瓜地里。 一、实验目的&#xff1a; 1、熟悉类图的构件事物。 2、熟悉类之间的泛化、依赖、聚合和组合关系…

Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的引领者

近期&#xff0c;《黑神话&#xff1a;悟空》的爆火不仅让 AAA 游戏重回焦点&#xff0c;也引发了玩家与开发者的热议。Web2 游戏的持续成功导致部分 Web3 玩家们的倒戈&#xff0c;对比之下 Web3 游戏存在生命周期短且商业模式难以明确的问题&#xff0c;尤其在当前加密市场环…

C++11的简介

杀马特主页&#xff1a;羑悻的小杀马特.-CSDN博客 ------ ->欢迎阅读 欢迎阅读 欢迎阅读 欢迎阅读 <------- 目录 一列表初始化的变化&#xff1a; 二左右值即各自引用的概念&#xff1a; 2.1左右…