没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
项目中用到了限流,受限于一些实现方式上的东西,手撕了一个简单的服务端限流器。 服务端限流和客户端限流的区别,简单来说就是: 1)服务端限流 对接口请求进行限流,限制的是单位时间内请求的数量,目的是通过有损来换取高可用。 例如我们的场景是,有一个服务接收请求,处理之后,将数据bulk到Elasticsearch中进行索引存储,bulk索引是一个很耗费资源的操作,如果遭遇到请求流量激增,可能会压垮Elasticsearch(队列阻塞,内存激增),所以需要对流量的峰值做一个限制。 2)客户端限流 限制的是客户端进行访问的次数。 例如,线程池就是一个天然的限流器。限制了并发个数max_connecti
资源推荐
资源详情
资源评论
python分布式环境下的限流器的示例分布式环境下的限流器的示例
项目中用到了限流,受限于一些实现方式上的东西,手撕了一个简单的服务端限流器。
服务端限流和客户端限流的区别,简单来说就是:
1)服务端限流)服务端限流
对接口请求进行限流,限制的是单位时间内请求的数量,目的是通过有损来换取高可用。
例如我们的场景是,有一个服务接收请求,处理之后,将数据bulk到Elasticsearch中进行索引存储,bulk索引是一个很耗费资
源的操作,如果遭遇到请求流量激增,可能会压垮Elasticsearch(队列阻塞,内存激增),所以需要对流量的峰值做一个限
制。
2)客户端限流)客户端限流
限制的是客户端进行访问的次数。
例如,线程池就是一个天然的限流器。限制了并发个数max_connection,多了的就放到缓冲队列里排队,排队搁不下了
>queue_size就扔掉。
本文是服务端限流器。本文是服务端限流器。
我这个限流器的优点:
1)简单
2)管事
缺点:
1)不能做到平滑限流
例如大家尝尝说的令牌桶算法和漏桶算法(我感觉这两个算法本质上都是一个事情)可以实现平滑限流。什么是平滑限流?举
个栗子,我们要限制5秒钟内访问数不超过1000,平滑限流能做到,每秒200个,5秒钟不超过1000,很平衡;非平滑限流可
能,在第一秒就访问了1000次,之后的4秒钟全部限制住。•2)不灵活
只实现了秒级的限流。
支持两个场景:支持两个场景:
1)对于单进程多线程场景(使用线程安全的Queue做全局变量)
这种场景下,只部署了一个实例,对这个实例进行限流。在生产环境中用的很少。
2)对于多进程分布式场景(使用redis做全局变量)
多实例部署,一般来说生产环境,都是这样的使用场景。
在这样的场景下,需要对流量进行整体的把控。例如,user服务部署了三个实例,对外暴露query接口,要做的是对接口级的
流量限制,也就是对query这个接口整体允许多大的峰值,而不去关心到底负载到哪个实例。
题外话,这个可以通过nginx做。
下面说一下限流器的实现吧。下面说一下限流器的实现吧。
1、接口、接口BaseRateLimiter
按照我的思路,先定义一个接口,也可以叫抽象类。
初始化的时候,要配置rate,限流器的限速。
提供一个抽象方法,acquire(),调用这个方法,返回是否限制流量。
class BaseRateLimiter(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def __init__(self, rate):
self.rate = rate
资源评论
weixin_38592134
- 粉丝: 4
- 资源: 885
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功