响应式编程-reactor

news2024/11/5 14:15:23

什么是响应式编程

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

基础介绍

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.coloradmin.cn/o/2233618.html

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

相关文章

在Microsoft Outlook日历中添加多个时区

在Microsoft Outlook日历中添加多个时区 1.单击Outlook中的文件选项卡&#xff0c;单击选项 2.左侧菜单中选择日历 3.向下滚动到时区部分&#xff0c;并标记当前时区&#xff0c;比如China 4.选中“显示第二个时区”框 5.选择第二个时区并给它一个标签&#xff0c;比如Germa…

考公人数攀升?地信、测绘、地质、遥感等专业,能报考哪些单位

近年来&#xff0c;考公人数持续飙升&#xff0c;国考报名人数更逐年攀升。2025年国家公务员考试共有341.6万人通过资格审查&#xff0c;报录比达86:1。国考报名人数再创新高。 国家公务员考试时间安排 地理学相关岗位分析 地信属于地理科学类&#xff0c;测绘类中不包括地信&…

大华乐橙设备私有平台EasyCVR视频设备轨迹回放平台支持哪些摄像机?摄像机如何选型?

在现代安全监控系统中&#xff0c;视频监控设备扮演着至关重要的角色。视频设备轨迹回放平台EasyCVR以其卓越的兼容性和灵活性&#xff0c;支持接入多种品牌和类型的摄像机。这不仅为用户提供了广泛的选择空间&#xff0c;也使得视频监控系统的构建和管理变得更加高效和便捷。本…

PyCharm中pylint安装与使用

目录 1. 安装插件2. pycharm中使用该功能3. 命令行使用 1. 安装插件 然后重启 2. pycharm中使用该功能 3. 命令行使用 前提是先 pip install pylint pylint demo01.py下面红框内容的意思是&#xff0c;得到10分/ 满分10分&#xff0c;上次运行获得8.33分&#xff0c;经调整…

客户服务数据分析:洞察客户需求,优化服务策略

在数字经济时代&#xff0c;数据已成为企业决策的重要依据。特别是在客户服务领域&#xff0c;通过深度挖掘和分析客户服务数据&#xff0c;企业能够更精准地洞察客户需求&#xff0c;优化服务策略&#xff0c;从而提升客户满意度和忠诚度&#xff0c;增强市场竞争力。 一、客户…

【Python】Python自习课:第一个python程序

【Python】Python自习课&#xff1a;第一个python程序 示例

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…

ONLYOFFICE 8.2版本产品评测——遥遥领先,助力自动化办公

ONLYOFFICE 产品测试体验报告总结 知孤云出岫-CSDN博客 目录 产品介绍——篇【1】 一.关于 ONLYOFFICE 桌面编辑器 二.关于 ONLYOFFICE 协作空间 三.关于 ONLYOFFICE 文档 四.关于 ONLYOFFICE的版本介绍 产品新功能——篇【2】 一.关于 ONLYOFFICE的新增功能介绍 二.ONL…

[vulnhub]DC: 1

https://www.vulnhub.com/entry/dc-1,292/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是156 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-28 12:48 CST Nmap scan rep…

人脑与机器连接:神经科技的伦理边界探讨

内容概要 在当今科技飞速发展的时代&#xff0c;人脑与机器连接已成为一个引人注目的前沿领域。在这一背景下&#xff0c;神经科技的探索为我们打开了一个全新的世界&#xff0c;从脑机接口到人工智能的飞跃应用&#xff0c;不仅加速了技术的进步&#xff0c;更触动了我们内心…

Visual Studio | 配置管理

文章目录 一、配置管理1、项目属性1.1、常规1.2、VC 目录1.3、C/C -> 常规1.4、C/C -> 预处理器1.5、C/C -> 预编译头1.6、连接器 -> 常规1.7、连接器 -> 输入 2、编辑2.1、显示空格或tab符 一、配置管理 1、项目属性 1.1、常规 字段功能目标平台版本用于生成…

如何将VMware ESXi中的虚拟机迁移到Workstation

我们前面介绍了如何将VMware workstation中的虚拟机迁移到ESXi中&#xff08;将OpenWrt 23.05.3部署到VMware ESXi&#xff09;&#xff0c;那怎么将ESXi中的虚拟机迁移到workstation中呢&#xff1f; 首先&#xff0c;我们回顾一下&#xff0c;在将workstation中的虚拟机迁移到…

电脑如何不断网切换IP:实用方法与注意事项‌

在数字化时代&#xff0c;网络已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;有时我们可能需要在保持网络连接的同时&#xff0c;切换电脑的IP地址&#xff0c;以满足特定的需求&#xff0c;如绕过地域限制、提升网络安全性或进行网络测试。本文将详细介绍如何在不…

【编译器】KEIL 静态链接库和动态链接库

【编译器】KEIL 静态链接库和动态链接库 文章目录 [TOC](文章目录) 前言一、工程1——生成静态链接库1. 代码准备2. 生成lib文件 二、工程2——调用静态链接库1.添加.h文件路径2. 调用生成的lib文件 三、参考资料总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;…

【Linux】编辑器vim 与 编译器gcc/g++

目录 一、编辑器vim&#xff1a; 1、对vim初步理解&#xff1a; 2、vim的模式&#xff1a; 3、进入与退出&#xff1a; 4、vim命令模式下的指令集&#xff1a; 移动光标&#xff1a; 删除&#xff1a; cv&#xff1a; 撤销&#xff1a; 其他&#xff1a; 5、vim底行模…

成都栩熙酷网络科技有限公司抖音小店电商新篇章

在数字经济蓬勃发展的今天&#xff0c;电子商务行业迎来了前所未有的发展机遇。而在这股浪潮中&#xff0c;成都栩熙酷网络科技有限公司&#xff08;以下简称“栩熙酷”&#xff09;凭借其敏锐的市场洞察力和强大的技术实力&#xff0c;与抖音小店这一新兴电商平台携手共进&…

科研绘图系列:R语言组合连线图和箱线图(linechart+boxplot)

文章目录 介绍加载R包数据数据预处理画图1画图2系统信息介绍 连线图(Line Chart)是一种常用的数据可视化图表,它通过将一系列数据点用直线段连接起来来展示数据随时间或有序类别变化的趋势。以下是连线图可以表示的一些内容: 时间序列数据:展示数据随时间变化的趋势,例如…

征程 6 工具链性能分析与优化 2|模型性能优化建议

01 引言 为了应对低、中、高阶智驾场景&#xff0c;以及当前 AI 模型在工业界的应用趋势&#xff0c;地平线推出了征程 6 系列芯片。 在软硬件架构方面&#xff0c;征程 6 不仅保持了对传统 CNN 网络的高效支持能力&#xff0c;还强化了对 Transformer 类型网络的支持&#xf…

HarmonyOS第一课 07 从网络获取数据-习题

判断题 1. 在http模块中&#xff0c;多个请求可以使用同一个httpRequest对象&#xff0c;httpRequest对象可以复用&#xff1a;F 正确(True) 错误(False) 每次请求时,都需要一个新的httpReq对象 每次使用完,都需要destory对象 2. 使用on(type: headersReceive)订阅响应头事…

Kubernetes——part10-1 kubernetes日志收集方案 ELK

一、为什么收集日志 收集日志可以用于&#xff1a; 分析用户行为监控服务器状态增强系统或应用安全性等。 二、收集哪些日志 kubernetes集群节点系统日志kubernetes集群节点应用程序日志kubernetes集群中部署的应用程序日志 三、日志收集方案 3.1 日志收集技术栈ELK(ELKB…