当前位置: 首页 > 科技观察

队列中消息过多,下游无法处理怎么办?

时间:2023-03-21 15:45:07 科技观察

作为一名后端程序员,在日常工作中难免要和消息队列打交道,而在目前的微服务场景下,很多服务的性能是我们无法控制的。这不是阿芬最近遇到的一幕。由于上游业务流量增加,发送到消息队列的消息数量增加。阿粉在处理消息的时候,需要依赖一个下游的服务。处理的太多了,CPU居高不下。昨天看过我们文章的朋友应该知道,这个时候我们需要限流。为了避免下游服务被known,我们会进行单机限流操作。这里我们模拟操作过程。首先我们通过一段伪代码模拟一个大流量,然后通过配置sentinel控制台来配置规则,达到单机QPS20的限制。创建一个SpringBoot服务首先我们创建一个SpringBoot服务,在pom.xml文件中添加如下配置。<依赖>org.springframework.bootspring-boot-starter-webcom.alibaba.cspsentinel-core1.8.4然后我们对外提供一个http接口,通过访问该接口来触发我们的限流代码。接口代码如下:代码如下:packagecom.example.demo.controller;importcom.alibaba.csp.sentinel.SphO;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;/***
*功能:
*作者:@authorziyou
*日期:2022-05-0812:56
*Desc:
*/@RestControllerpublicclassLoginController{@GetMapping(value="/login")publicvoidlogin(Stringusername,Stringpassword){System.out.println("login");//模拟一百万条消息for(inti=0;i<1000000;i++){booleanentry=false;尝试{entry=SphO.entry("HelloWorld");while(!entry){try{线程。睡觉(50);System.out.println("输入错误");entry=SphO.entry("HelloWorld");}catch(InterruptedExceptione){}}System.out.println("entrytrue");catch(Exceptione){}finally{if(entry){SphO.exit();}}}}}调用接口后,循环100万次模拟一个大流程。下面我们将对SphO的以下内容进行说明。entry("HelloWorld"):是Sentinel的资源控制器,"HelloWord"是资源的名字,资源是sentinel很重要的一个概念,所有的限流都是针对资源操作的;SphO.entry()返回值布尔值。如果为真,则表示该资源可用且未受限。如果为false,说明资源有限。这里模拟程序在限流后等待一段时间,再判断是否限流。只有当资源不受限时,才能继续处理;SphO.exit();最后需要操作。当限流时,即SphO.entry()==true后,必须执行SphO.exit();否则将创建代码MultipleEntry对象。程序运行时间长后,会造成内存泄漏,引起FullGC。这个时候我们启动一个服务,调用接口。可以看到如下效果。马上就要跑完了,还没到限流。效果是因为此时我们还没有配置限流规则,所以没有触发限流的逻辑。配置sentinel控制台接下来我们安装sentinel控制台,通过控制台配置限流规则,达到限流的目的。控制台的构造非常简单。我们通过官方地址下载指定版本的jar,在本地运行。能。通过地址https://github.com/alibaba/Sentinel/releases/download/1.8.4/sentinel-dashboard-1.8.4.jar下载。然后运行命令java-Dserver.port=8081-Dcsp.sentinel.dashboard.server=localhost:8081-Dproject.name=sentinel-dashboard-jarsentinel-dashboard-1.8.4.jar,如下图:这里我们指定端口8081访问哨兵。启动成功后,我们就可以通过浏览器登录了。默认初始账号和密码为sentinel。因为我们在上面的命令中指定了sentinel-dashboard项目,所以默认只会看到sentinel-dashboard项目。这时候我们需要修改代码,在pom.xml中添加如下配置。com.alibaba.cspsentinel-transport-simple-http1.8.4然后在启动参数中JVM添加-Dcsp.sentinel.dashboard.server=localhost:8081指定sentinel的地址和端口号,然后启动我们的应用程序。启动后,我们需要手动调用接口,然后就可以看到我们的程序项目连接到了sentinel。但是此时只有我们的程序和sentinel连接成功,并没有限流规则。接下来,我们需要配置限流规则。按照上图配置好后,我们再次调用接口,可以看到此时我们的处理速度明显变慢了,每秒只能20QPS才能获取资源。至此,我们基于sentinel的单机限流QPS20的目标就完成了。