前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对接口进行限流?

对接口进行限流?

作者头像
用户9919783
发布2023-09-05 14:28:53
2300
发布2023-09-05 14:28:53
举报
文章被收录于专栏:后端从入门到精通

在高并发的情况下,我们可以把消息放入队列,在从队列消费,达到限流的目的。但这里说的限流指的是当我们请求其他服务器接口,防止高并发下把对面服务器压垮,于是对我们要求每秒限制在100QPS。

如果使用springCloud可以用hystrix限流,如果使用springCloud-alibaba可以使用sentinal实现限流,那么如果不依赖组件,如何实现接口限流呢?

限流的策略有:拒绝服务,等待排队,服务降级。

最简单拒绝服务可以直接返回异常抛出,请用户稍后再试。

但对一些重要的接口,比如下单,秒杀等,我们不希望用户请求太快,也不希望拒绝失败,这种可以放到队列。

那么服务降级则是触发限制条件,直接返回兜底数据,比如查询库存默认返回有库存。

一、计数器限流(固定窗口限流)

我们可以通过AtomicLong来限制发送的数量,比如一分钟之内发送60条数据,那么平均每秒发送1条数据,当超过一分钟的时候,再把计数器归零,如果没有超过一分钟,则大于60的时候,不允许继续访问接口。

但这样有一个致命缺点,如果有恶意用户进行访问,在59s的时候发送60条,在1min01s的时候发送60条,那么在2s之内就处理了120条数据,这时候很有可能把服务器压垮而且这种情况下,剩余的59s都属于空闲状态,也是不合理的。。

说到底,这是颗粒度太大,不够精细导致的,那么如何解决呢?

二、滑动窗口

先定义一个key,在通过redis管道实现滑动窗口判断是否符合限流行数。

管道里放入的是这个滑动窗口的数据量,每次新增都会删除超过时间的元素,而且限流最大请求次数是灵活的。

三、漏桶算法

算法实现是,我们有一个固定容量的桶,有水流进来,也有水流出去,我们可以控制水流出的速率和,对于进来的水,我们无法控制进来多少和速率,当桶满的时候,则进入拒绝策略。

我们只要把算法里的水换成用户请求。

这个算法也有缺陷,因为当拒绝的时候,会丢弃,而且在高并发的情况下,处理效率不高,于是有了下面广泛使用的令牌漏桶算法。

四、令牌漏桶算法

系统会维护一个令牌桶,以恒定的速度往里面放令牌,这时候如果有请求,则先看要有没有令牌,没有则限制请求。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端从入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档