spring 项目实现限流方法示例


Posted in Java/Android onJuly 15, 2022

01、为什么AUSTIN项目需要限流

众所周知,服务器能处理的请求数是有限的,如果请求量特别大,我们就可能需要做限流。

限流处理的姿势:要么就让请求等待,要么就把请求给扔了

spring 项目实现限流方法示例

从系统架构来看,我们的统一处理入口在austin-api接入层上,austin-api接入层做完简单的参数校验以及参数拼接后,就将请求转发到消息队列上了

spring 项目实现限流方法示例

按正常来说,因为接了消息队列且接入层没有什么耗时的操作,那对外的接口压力不大的。

没错的,austin要接入限流也并不是在austin-api接入层上做,是在austin-handler消息处理下发层。austin-handler消息处理下发层我们是用线程池去隔离不同的消息渠道不同的消息类型。

spring 项目实现限流方法示例

在系统本身上其实没有性能相关的问题,但我们下发的渠道可能就需要我们去控制调用的速率。

腾讯云短信默认限制3000次/秒调用下发接口

spring 项目实现限流方法示例

钉钉渠道对应用消息和群机器人消息都有接口调用的限制

spring 项目实现限流方法示例

....

在保证下发速度的前提下,为了让业务方所下发的消息其用户能正常接收到和下游渠道的稳定性,我们需要给某些渠道进行限流

于是在这个背景下,我目前定义了两种限流策略:

1、按照请求数限流

2、按照下发用户数限流

spring 项目实现限流方法示例

02、如何实现限流?

想要实现限流,摆在我们面前有两个选择:

1、单机限流

2、分布式限流

咋一看,线上不可能只部署一台机器去发送整个公司的消息推送的,我们的系统应用在线上环境绝对是集群部署的,那肯定就需要上分布式限流了,对吧?

但实际上分布式限流实现并不简单,目前分布式限流的方案一般借助两个中间件

1、Redis

2、Sentinel

我们可能会用Redis的setnx/incrby+expire命令(从而实现计数器、令牌桶限流)/zset数据结构(从而实现滑动窗口限流)

Redis实现的限流想要比较准确,无论是哪种方式,都要依靠lua脚本

而Sentinel支持单机限流和分布式限流,Sentinel分布式限流需要部署Token服务器

对于分布式限流而言,不管用哪一种方案,使用的成本和技术挑战都是比较大的。

如果用单机限流的话,那就简单得多了,省事直接用Guava包下的RateLimiter就完了。缺点就在于:它只能控制单机的限流,如果发生了服务器扩容和缩容,它是感知不到的。

有的人就给出了方案:那我用Zookeeper监听服务器的数量不就好了吗。理论上确实是这样的:每台机器限流值=限流总值/服务器数量

不过这又要去依赖Zookeeper,Zookeeper集群本身也有一堆状态相关的问题。

我是怎么实现的?单机限流一把梭

03、代码设计

从上面的描述可以看到,austin的限流我是要做在具体渠道上的,根据现有的代码设计我要的就是在各个的Handler上写上限流的代码。

我本身就设计了BaseHandler抽象类作为模板方法设计模式,此次限流的设计我的是:

1、将flowControl定义为abstract抽象方法,子类渠道去实现限流的代码

2、子类在初始化的时候定义限流参数,BaseHandler父类根据限流参数统一实现限流的逻辑

我选择了第二种方式,主要是我认为对于各个渠道而言,只是限流值是不同的,限流的逻辑应该都是一样的,没必要在每个子类上实现类似的逻辑。

spring 项目实现限流方法示例

而限流的逻辑就比较简单了,主要就使用RateLimit提供的易用API实现

spring 项目实现限流方法示例

没错,限流值的大小我是配置在apollo分布式配置中心的。假设以后真的要扩缩容了,那到时候提前把分布式配置中心的值给改掉,也能解决一部分的问题。

spring 项目实现限流方法示例

04、总结

扯了半天,原来就用了Guava包的RateLimit实现了单机限流,就这么简单,只是把限流值配置在分布式配置中心上而已。

很多时候,设计简单的代码可能实现并不完美,并不智能,并不优雅,但它付出的代价往往是最小的。

虽说如此,如果大家想要了解Redis+lua实现的同学可以fetch下austin最新的代码,就我写文章这段时间里,已经有老哥提了pull request用Redis+lua实现了滑动窗口去重的功能了,本质上是一样的。我已经merge到master分支了。

austin消息推送平台项目源码Gitee链接:gitee.com/austin

austin消息推送平台项目源码GitHub链接:github.com/austin

以上就是spring 项目实现限流方法示例的详细内容,更多关于spring 项目限流的资料请关注三水点靠木其它相关文章!


Tags in this post...

Java/Android 相关文章推荐
Spring Boot两种全局配置和两种注解的操作方法
Jun 29 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
关于springboot 配置date字段返回时间戳的问题
Jul 25 Java/Android
SpringBoot+VUE实现数据表格的实战
Aug 02 Java/Android
OpenCV实现普通阈值
Nov 17 Java/Android
Java9新特性对HTTP2协议支持与非阻塞HTTP API
Mar 16 Java/Android
Java实现二分搜索树的示例代码
Mar 17 Java/Android
springboot 自定义配置 解决Boolean属性不生效
Mar 18 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
详解Flutter网络请求Dio库的使用及封装
Apr 14 Java/Android
Java多线程并发FutureTask使用详解
Jun 28 Java/Android
Spring Boot优化后启动速度快到飞起技巧示例
Jul 23 Java/Android
SpringBoot详解整合Redis缓存方法
Jul 15 #Java/Android
maven 解包依赖项中的文件的解决方法
Jul 15 #Java/Android
SpringBoot详解自定义Stater的应用
Jul 15 #Java/Android
MyBatis XPathParser解析器使用范例详解
Jul 15 #Java/Android
SpringBoot接入钉钉自定义机器人预警通知
Jul 15 #Java/Android
SpringBoot深入分析讲解监听器模式下
Jul 15 #Java/Android
tree shaking对打包体积优化及作用
Jul 07 #Java/Android
You might like
php实现多张图片上传加水印技巧
2013/04/18 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
nodejs基础应用
2017/02/03 NodeJs
详解js的异步编程技术的方法
2017/02/09 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
2017/05/11 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
基于webpack4.X从零搭建React脚手架的方法步骤
2018/12/23 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
Python实现京东抢秒杀功能
2021/01/25 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
《争吵》教学反思
2014/02/15 职场文书
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
公司聘任书模板
2014/03/29 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
学生保证书
2015/01/16 职场文书
给学校的建议书400字
2015/09/14 职场文书
导游词之上海豫园
2019/10/24 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
HTML中的表格元素介绍
2022/02/28 HTML / CSS
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏