响应式编程实战(02)-响应式编程的适用场景

news2024/11/16 7:53:52

0 知识前提

已掌握响应式编程中的核心概念:响应式流、背压机制以及响应式流规范。

1 引言

响应式编程能够应用到那些具体的场景呢?

目前有哪些框架中使用到了这一新型的技术体系呢?

2 响应式编程的应用场景分析

可以认为响应式编程并不仅仅是一种编程技术,更是一种架构设计的系统方法,因此可以应用于任何地方。

既可以用于简单的 Web 应用系统,也可以用于大型企业解决方案。

数据流处理是响应式编程的一大应用场景,流式系统的主要特点:

  • 低延迟
  • 高吞吐量

通过使用非阻塞式通信,可确保资源得到高效利用,实现低延迟和高吞吐量。

针对高并发流量,通常涉及大量 I/0 操作,相比传统的同步阻塞式 I/0 模型,响应式编程所具备的异步非阻塞式I/0 模型非常适合应对处理高并发流量的业务场景。网关的作用是用来响应来自前端系统的流量并将其转发到后端服务。

核心诉求

构建一个具有异步非阻塞式的请求处理流程的 Web 服务,需要高效处理跨服务之间的网络请求。

响应式编程在日常开发过程中日益得到广泛的应用:如Netflix Hystrix、Spring Cloud Gateway 及 Spring WebFlux,解析这些框架背后所应用的响应式编程技术。

3 响应式流规范

3.1 Netflix Hystrix 中的滑动窗口

Spring Cloud Netflix Hystrix 组件基于 Netflix Hystrix 实现了服务熔断功能

Netflix Hystrix,Netflix 开源的一款容错库,使用了HystrixCircuitBreaker 类实现熔断器。

HystrixCircuitBreaker 如何动态获取系统运行时的各项数据呢?

HealthCountsStream 设计上采用滑动窗口 (Rolling Window) 机制,大量采用数据流处理方面的技术及 RxJava 响应式编程框架。Hystrix 以秒为单位统计系统中所有请求的处理情况,然后每次取最近 10 秒的数据来进行计算,如果失败率超过一定闯值,就进行熔断。

如何实现这个滑动窗口?

把系统运行时所产生的所有数据都视为一个个的事件,这样滑动窗口中每个桶的数据都来自源源不断的事件,通常需要对其进行转换以便进行后续的操作。

Hystrix 采用基于响应式编程思想的 RxJava。使用 RxJava 的一大好处,可通过 RxJava 的一系列操作符来实现滑动窗口:

  • window 操作符,把当前流中的元素收集到另外的流序列
  • flatMap 操作符,把流中的每个元素转换成一个流,再把转换之后得到的所有流中的元素进行合并
  • reduce 操作符,对流中包含的所有元素进行累积操作,得到一个包含计算结果的流

Hystrix 巧妙运用 RxJava 的 window、flatMap等操作符来将单位窗口时间内的事件。以及将一个窗口大小内的 Bucket 聚集到一起形成滑动窗口,并基于滑动窗口集成指标数据。

3.2 Spring Cloud Gateway 中的过滤器

Spring 官方自己开发的一款 API 网关,基于最新的Spring5和Spring Boot2以及用于响应式编程的Proiect Reactor框架提供的是响应式、非阻塞式I/0 模型。

只需实现GlobalFilter接口,重写 filter()即可。

public class IPLimitFilter implements GlobalFilter

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        // 1. 获取当前的请求路径
        String url = exchange.getRequest().getURI().getPath();

        // 2. 获得所有的需要进行ip限流校验的url list
        List<String> ipLimitList = excludeUrlProperties.getIpLimitUrls();

        // 3. 校验并且判断
        if (ipLimitList != null && !ipLimitList.isEmpty()) {
            for (String limitUrl : ipLimitList) {
                if (antPathMatcher.matchStart(limitUrl, url)) {
                    // 如果匹配到,则表明需要进行ip的拦截校验
                    log.info("IPLimitFilter - 拦截到需要进行ip限流校验的方法:URL = " + url);
                    return doLimit(exchange, chain);
                }
            }
        }

        // 4. 默认直接放行
        return chain.filter(exchange);
    }
}

filter()返回了一个 Mono 对象,它就是在响应式编程框架 Project Reactor 中代表单个返回值的流式对象

案例

@Component
public class PreGatewayFilterFactory extends AbstractGatewayFilterFactory<PreGatewayFilterFactory.Config> {

	public PreGatewayFilterFactory() {
		super(Config.class);
	}

	@Override
	public GatewayFilter apply(Config config) {
		// grab configuration from Config object
		return (exchange, chain) -> {
			//If you want to build a "pre" filter you need to manipulate the
			//request before calling chain.filter
			ServerHttpRequest.Builder builder = exchange.getRequest().mutate();
			//use builder to manipulate the request
			return chain.filter(exchange.mutate().request(builder.build()).build());
		};
	}

	public static class Config {
		//Put the configuration properties for your filter here
	}

}

3.3 Spring Webflux 中的请求处理流程

Spring 5 中引入的全新的响应式 Web 服务开发框架。

针对涉及大量I/O 操作的服务化架构,WebFlux也是一种非常有效的解决方案。

工作流程图

示例

总结

通过理论联系实际,讨论了响应式编程的具体应用场景。

响应式编程技术已经应用到了日常开发的很多开源框架中,这些框架在分布式系统和微服务架构中得到了广泛的应用。

FAQ

描述 Netflix Hystrix 中基于响应式流的滑动窗口实现机制?

Netflix Hystrix 中基于响应式流的滑动窗口实现机制是通过在数据流中使用滑动窗口来实现的。滑动窗口是一种将数据流分成固定大小的块的技术,每个块的大小和时间范围是可配置的。在 Hystrix 中,滑动窗口被用来收集服务调用的响应时间、成功率等指标,并在这些指标上执行断路器逻辑。

具体实现方式如下:

  1. Hystrix 会为每个服务调用创建一个独立的滑动窗口,滑动窗口中包含了最近一段时间内的所有调用指标。
  2. 滑动窗口会根据配置的时间范围和块大小进行分割,并在每个块中记录指标数据。
  3. 每个块都有一个计数器来记录成功和失败的调用次数以及响应时间等指标。
  4. 在每个块的结束时,Hystrix 会根据计数器中的数据计算出该块的成功率、平均响应时间等指标,并将这些数据发送到断路器中进行判断。
  5. 如果断路器发现连续若干个时间段内的成功率低于阈值或平均响应时间超过阈值,就会触发断路器打开操作,停止向该服务发送请求。
  6. 当断路器打开后,Hystrix 会定期尝试发送一个测试请求到该服务,如果测试请求成功,则断路器关闭,否则继续保持打开状态。

通过基于响应式流的滑动窗口实现机制,Hystrix 可以快速地检测到服务调用失败、超时等问题,并在出现问题时快速地停止向该服务发送请求,从而提高了系统的可靠性和稳定性。

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

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

相关文章

OpenPCDet系列 | 8.1 nuScenes数据集的处理流程与gt_sample的database构建

1. nuScenes Dataloader 对nuScenes数据集处理的了解&#xff0c;大体上的核心还是getitem函数、prepare_data函数&#xff0c;以及collate_batch函数三个部分的处理。其中prepare_data函数和collate_batch函数是在Dataset这个父类实现的&#xff0c;基本的处理流程基本不变&a…

《Redis 核心技术与实战》课程学习笔记(六)

哨兵集群 哨兵机制的基本流程 在 Redis 主从集群中&#xff0c;哨兵机制是实现主从库自动切换的关键机制。 哨兵其实就是一个运行在特殊模式下的 Redis 进程&#xff0c;主从库实例运行的同时&#xff0c;它也在运行。哨兵主要负责的就是三个任务&#xff1a;监控、选主&…

三种SQL实现聚合字段合并(presto、hive、mysql)

需求&#xff1a;按照项目名&#xff0c;以逗号合并参与人 presto select item_name,array_join(array_agg(name),,) as group_name from test.test_04 group by item_name order by item_name hive select item_name,concat_ws(,,collect_set(name)) as group_name from tes…

全志V3S嵌入式驱动开发(四种启动方式)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于v3s的启动方式分析,怎么研究都不为过。对我们整个系列文章比较熟悉的同学来说,这幅图真的是太熟悉了, 整个流程不复杂。它主要是告诉我们,v3s加载的顺序是怎么样的…

【Linux后端服务器开发】进程控制与替换

目录 一、进程控制 1. 进程退出 2. 进程等待 2.1 阻塞等待 2.2 status位图结构 2.3 非阻塞等待 二、进程替换 1. exec*系列函数 2. 进程替换高级语言可执行程序 一、进程控制 1. 进程退出 进程退出会进入僵尸态&#xff0c;把自己的退出结果写入到自己的task_struct…

一种使得大模型输出结构化数据的简易方法

最近在用大模型跑一些数据&#xff0c;于是就不可避免的遇到了如何让大模型输出的格式便于处理这个问题。经过一些研究发现了一套比较有用的方法&#xff0c;在这里总结一下。 背景 任务是这样的&#xff0c;我需要用大模型&#xff08;比如ChatGPT&#xff0c;ChatGLM等等&a…

Springboot启用HTTP响应压缩

官方文档:https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/htmlsingle/#how-to-enable-http-response-compression

Java面试题大全(2023牛客网最新版)大厂面试题附答案详解

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#…

解决mysql的count()函数条件表达式不生效的问题

示例 表数据 统计错误的sql select count(age 10) as count from student查询结果 原因 count(‘任意内容’)都会统计出所有记录数&#xff0c;因为count只有在遇见null时才不计数&#xff0c;即count(null)0 解决 方法1&#xff1a;count()函数中条件表达式加上or n…

1、计算机网络核心

序号地址1计算机网络核心2数据库相关3Redis4Linux相关5JVM的内容6GC相关的7Java多线程与并发8Java多线程与并发-原理9Java常用类库与技巧10Java框架-Spring 文章目录 1、OSI开放式互联参考模型2、TCP/IP3、TCP报文头4、TCP的三次握手5、TCP的四次挥手6、为什么会有TIME_WAIT状态…

【unity】燧光MR设备极简教程(使用篇)

燧光MR设备极简教程&#xff08;使用篇&#xff09; 一、硬件的基础使用二、定位信标三、投屏直播1、第三人称视角同步MR2、第一人称视角无线投屏 相关文章&#xff1a;燧光MR设备极简教程&#xff08;开发篇&#xff09; 一、硬件的基础使用 官方使用文档&#xff1a;https:…

【LLM】Prompt tuning大模型微调实战

文章目录 一、Propmt tuning1. peft库中的tuning2. prompt tuning怎么搞 二、Prompt tuning代码实战1. tuning训练2. 模型推理比较3. 其他tuning技术 Reference 一、Propmt tuning 1. peft库中的tuning 之前提到过可以借助peft库&#xff08;Parameter-Efficient Fine-Tuning…

基于MeanShift的图像滤波方法

前言 在视觉领域中&#xff0c;图像滤波是一种常用的技术&#xff0c;用于去除图像中的噪声和平滑图像。其中&#xff0c;MeanShift滤波是一种基于颜色和空间信息的非参数化滤波算法。 MeanShift滤波原理 MeanShift滤波是一种基于密度估计的非参数化滤波技术&#xff0c;它对每…

【Go】Go 语言教程--GO语言数组(十一)

往期回顾&#xff1a; Go 语言教程–介绍&#xff08;一&#xff09;Go 语言教程–语言结构&#xff08;二&#xff09;Go 语言教程–语言结构&#xff08;三&#xff09;Go 语言教程–数据类型&#xff08;四&#xff09;Go 语言教程–语言变量&#xff08;五&#xff09;Go …

希尔排序及其时间复杂度(图文详解)

&#x1f63e; 博客主页: 爱吃bug的猿 &#x1f680;博客专栏: 数据结构,C语言初阶进阶全流程讲解 &#x1f63d;&#x1f63d;&#x1f63d;如果喜欢博主的文章&#xff0c;可以给博主点波赞和关注加速博主更新 文章目录 前言1. 代码思路代码实现法1代码实现法2&#xff08;不…

【KingbaseES】数据库如何查询数据库,模式及表大小

新建数据kingbase及kingbase模式 CREATE DATABASE kingbase OWNER kingbase; CREATE SCHEMA kingbase AUTHORIZATION "kingbase";在数据库kingbase的kingbase模式下新建两张测试表test_size,test_size1并插入数据 CREATE TABLE "kingbase"."test_sz…

课时9:PKI证书基础知识

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:Secureboot从入门到精通-[目录] 👈👈👈目录 1、CA证书的一般用法2、x509证书3、openssl证书命令行4、X509v3证书格式

第十五章 原理篇:YOLOv8

找工作也太难了吧根本找不到工作我哭死。 参考教程&#xff1a; https://mmyolo.readthedocs.io/en/latest/recommended_topics/algorithm_descriptions/yolov8_description.html https://zhuanlan.zhihu.com/p/599761847【这个写的挺不错】 https://zhuanlan.zhihu.com/p/63…

Linux进程监控及控制【命令ps的使用】

ps命令详解 Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照&#xff0c;就是执行ps命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用top命令。 要对进程进行监测…

EcoVadis 2023年最新评分细则

【EcoVadis 2023年最新评分细则】 Ecovadis 的四大主题 EcoVadis 企业社会责任评级方法的目标是通过其方针政策、实施执行和绩效反馈来衡量一家公司的企业社会责任管理系统的质量。 EcoVadis企业社会责任&#xff08;CSR&#xff09;评估方法基于七项基本原则&#xff08;如图&…