java使用semaphore对单接口进行限流(代码片段)

dituirenwu dituirenwu     2023-01-23     474

关键词:

java使用Semaphore对单接口进行限流

目录一、实战说明1.1 效果说明1.2 核心知识点二、?环境搭建三、限流演示3.1 并发请求工具3.2 效果示例图

一、实战说明

1.1 效果说明

本篇主要讲如何使用Semaphore对单接口进行限流,例如有如下场景

a. A系统的有a接口主要给B系统调用,现在希望对B系统进行限流,例如处理峰值在100,超过100的请求快速失败

b. 接口作为总闸入口,希望限制所有外来访问,例如某个房间只能同时100个玩家在线,只有前面的处理完后面的才能继续请求

c. 其他类型场景,也就是资源固定的情况下需要轮流使用资源的可以采用Semaphore

不适用场景

a. 由于是针对总入口进行限流,所以不能根据IP或者token等进行限流,适用场景比较固定

b. 后续的博客中会介绍如何使用其他的针对IP/Token级别的限流,例如AOP+Redis+Lua进行限流

优点主要有

a. 相比针对IP级别的限流,Semaphore实现相对简单,对上述场景能快速实现限流效果

实现难度:3颗星

1.2 核心知识点

主要使用以下技术点

a. springboot

b. juc包中的Semaphore(tryAcquire、release方法)

Semaphore主要说明

a. Semaphore中可以通过和acquire获取到一个许可证(默认),通过release释放许可证

b. 两个获取许可证的主要区别就是前者是非阻塞而后者阻塞,如果我们要实现快速失败的效果,就必须使用非阻塞获取许可证方法

注意点

a. 一定要确保release方法被调用,例如放到finally中,否则许可证得不到释放,将会导致接口被全部陷死,无法接收请求

二、?环境搭建

环境使用idea+spring initializr创建

新建springboot web项目

包目录说明

新建SemaphoreController,请求路径为limit

a. 注意点已经代码注释说明

package com.codecoord.semaphore.controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.Semaphore;

@RestConywEGmttroller

public class SemaphoreController

private static final int MAX_SEMAPHORE=3;



private static final Semaphore SEMAPHORE=new Semaphore(MAX_SEMAPHORE);

@RequestMapping("/limit")

public String limit() 

    // 01.使用非阻塞tryAcquire,如果获取不到就快速返回失败

    if (!SEMAPHORE.tryAcquire()) 

        return "请求频率超过限制:" + MAX_SEMAPHORE;

    

    // 02. 如果能进入到这里,说明一定获取到了许可证

    /// todo 可能的参数校验,注意如果参数校验不通过,一定要调用release方法

    

    try 

        // 03. 模拟业务处理,假如需要1s

        Thread.sleep(1000);

        return "业务处理成功";

     catch (InterruptedException e) 

        // 错误处理

        return "业务处理失败";

     finally 

        // 04. 一定要释放,否则导致接口假死无法处理请求

        SEMAPHORE.release();

    


三、限流演示

3.1 并发请求工具

并发请求将基于apache-jmeter-5.2.1进行测试,jmeter的使用相对简单,请读者自行百度

此处线程组的线程数量为10个,真实环境中根据需要调整配置大小

3.2 效果示例图

启动测试,可以看到处理成功的只有三个,剩下7个全部失败

a. 请求成功

b. 请求失败

并发限流利器semaphore(代码片段)

文章目录1Semaphore是什么?2Semaphore充当互斥锁3Semaphore源码解析4Semaphore主要方法5Semaphore应用案例1Semaphore是什么?Semaphore,一个计数信号量,JDK1.5开始提供的一个同步工具。Semaphore信号量被用来限制对某些资源同时... 查看详情

死磕java同步系列之semaphore源码解析(代码片段)

问题(1)Semaphore是什么?(2)Semaphore具有哪些特性?(3)Semaphore通常使用在什么场景中?(4)Semaphore的许可次数是否可以动态增减?(5)Semaphore如何实现限流?简介Semaphore,信号量,它保存了一系列的许可(permits),每次调... 查看详情

死磕java同步系列之semaphore源码解析(代码片段)

问题(1)Semaphore是什么?(2)Semaphore具有哪些特性?(3)Semaphore通常使用在什么场景中?(4)Semaphore的许可次数是否可以动态增减?(5)Semaphore如何实现限流?简介Semaphore,信号量,它保存了一系列的许可(permits),每次调... 查看详情

java并发编程(十四):semaphore源码逐行深度分析(代码片段)

目录前言使用源码实现构造函数获取信号量释放信号量Semaphore早期BUG总结前言  Semaphore即信号量,可以控制并发访问特定的资源的线程数量,比如可用于接口请求限流,和ReentrantLock一样依赖AQS实现。其整体结构和... 查看详情

android之semaphore使用(代码片段)

Semaphore(信号量),是一种共享锁,多个线程同时访问一个资源时,通过它实现同一时刻的访问线程数量。位于java.util.concurrent.Semaphore,最常见的使用场景就是高并发下的限流。举个例子:有10000辆车... 查看详情

轻松两步,我在springboot服务上实现了接口限流

...且带有可视化操作界面。在日常开发中,限流功能时常被使用,用于对某些接口进行限流熔断,譬如限制单位时间内接口访问次数;或者按照某种规则进行限流,如限制ip的单位时间访问次数等。之前我们已经讲过接口限流的工... 查看详情

java并发编程之semaphore(代码片段)

Semaphore,信号量,一般用来控制同时访问特定共享资源的线程数,它通过协调各个线程来保证使用公共资源的合理性。应用场景Semaphore,从字面上其实不太好理解它的意思,换个通俗易懂的比喻吧,Semaphore... 查看详情

使用google的guova开发高并发下的接口限流

使用google的guova开发高并发下的接口限流使用google的guova进行限流1、guova的限流方式,在定时产生定量的令牌,令牌的数量限制了流量2、增加一个订单接口限流类OrderRateFilter,继承ZuulFilter,并重载方法;filterType、filterOrder、shouldFi... 查看详情

semaphore简介

是什么Semaphore是向外分发资源的许可证,可以允许一个或多个任务同时访问资源。Semaphore通过构造参数来指定许可证的数量;acquire方法阻塞式获取许可证;release方法释放许可证。可以将其比喻为地铁的安检,每当人流量高峰的... 查看详情

python的线程13简易限流器实现(代码片段)

...住,别错过这个从0开始的文章!前篇学委提出了Semaphore信号量来制作限流器的思路。简单总结就是:动态的release,保证任意时刻都有固定数量可用的信号量。我们通常会这样使用信号量xuewei_semaphore=threading.Sema... 查看详情

python的线程13简易限流器实现(代码片段)

...住,别错过这个从0开始的文章!前篇学委提出了Semaphore信号量来制作限流器的思路。简单总结就是:动态的release,保证任意时刻都有固定数量可用的信号量。我们通常会这样使用信号量xuewei_semaphore=threading.Sema... 查看详情

限流实现与解决方案(代码片段)

...用缓存数据库,把热点数据get到缓存中,redis,ES4、善于使用连接池业务层面:1、加入交互,排队等待二、应用级别限流与限流实现:方法一、使用google的guava,令牌桶算法实现:平滑突发限流(SmoothBursty)、平滑预热限流(SmoothWarm... 查看详情

如何计算服务限流的配额

...报错:HystrixRuntimeException occurred! , failureType:REJECTED_SEMAPHORE_EXECUTION, message:apiHystrixKey could n 查看详情

java并发工具类semaphore(代码片段)

...有的语言都支持信号量机制,Java也不例外。Java中提供了Semaphore并发工具类来支持信号量机制。下面我们就来了解Java实现的信号量机制。首先介绍信号量模型,然后介绍如何使用,最后使用信号量来实现一个限流器。回到目录信... 查看详情

使用 sklearn 对单变量时间序列进行聚类

】使用sklearn对单变量时间序列进行聚类【英文标题】:Clusteringuni-variateTimeseriesusingsklearn【发布时间】:2015-11-1309:04:37【问题描述】:我有一个pandaDataFrame,我想对每个列进行聚类。我正在使用sklearn,这就是我所拥有的:data=pd.re... 查看详情

限流接口限流(代码片段)

如果某个接口可能出现突发情况,比如“秒杀”活动,那么很有可能因为突然爆发的访问量造成系统奔溃,我们需要最这样的接口进行限流。在上一篇“限流算法”中,我们简单提到了两种限流方式:1)(令牌桶、漏桶算法)... 查看详情

用synchronized实现semaphore(代码片段)

介绍基于Semaphore的功能,主要用来实现并发和限流,本文采用synchronized来实现Semaphore基础功能。关于Semaphore的说明,请参考JDK1.8信号量(Semaphore)的基本使用代码实现publicclassMySemaphoreprivatevolatileintcount;privatevolatileintwaitCo 查看详情

无法使用 django 的 render_to_string 对单引号 (') 进行编码

】无法使用django的render_to_string对单引号(\\\')进行编码【英文标题】:can\'tencodesinglequote(')usingdjango\'srender_to_string无法使用django的render_to_string对单引号(\')进行编码【发布时间】:2011-04-2917:24:54【问题描述】:我对django的rende... 查看详情