国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python分布式環(huán)境下的限流器的示例

2020-02-16 10:30:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

項(xiàng)目中用到了限流,受限于一些實(shí)現(xiàn)方式上的東西,手撕了一個(gè)簡(jiǎn)單的服務(wù)端限流器。

服務(wù)端限流和客戶端限流的區(qū)別,簡(jiǎn)單來(lái)說(shuō)就是:

1)服務(wù)端限流

對(duì)接口請(qǐng)求進(jìn)行限流,限制的是單位時(shí)間內(nèi)請(qǐng)求的數(shù)量,目的是通過(guò)有損來(lái)?yè)Q取高可用。

例如我們的場(chǎng)景是,有一個(gè)服務(wù)接收請(qǐng)求,處理之后,將數(shù)據(jù)bulk到Elasticsearch中進(jìn)行索引存儲(chǔ),bulk索引是一個(gè)很耗費(fèi)資源的操作,如果遭遇到請(qǐng)求流量激增,可能會(huì)壓垮Elasticsearch(隊(duì)列阻塞,內(nèi)存激增),所以需要對(duì)流量的峰值做一個(gè)限制。

2)客戶端限流

限制的是客戶端進(jìn)行訪問(wèn)的次數(shù)。

例如,線程池就是一個(gè)天然的限流器。限制了并發(fā)個(gè)數(shù)max_connection,多了的就放到緩沖隊(duì)列里排隊(duì),排隊(duì)擱不下了>queue_size就扔掉。

本文是服務(wù)端限流器。

我這個(gè)限流器的優(yōu)點(diǎn):

1)簡(jiǎn)單
2)管事

缺點(diǎn):

1)不能做到平滑限流

例如大家嘗嘗說(shuō)的令牌桶算法和漏桶算法(我感覺(jué)這兩個(gè)算法本質(zhì)上都是一個(gè)事情)可以實(shí)現(xiàn)平滑限流。什么是平滑限流?舉個(gè)栗子,我們要限制5秒鐘內(nèi)訪問(wèn)數(shù)不超過(guò)1000,平滑限流能做到,每秒200個(gè),5秒鐘不超過(guò)1000,很平衡;非平滑限流可能,在第一秒就訪問(wèn)了1000次,之后的4秒鐘全部限制住。•2)不靈活

只實(shí)現(xiàn)了秒級(jí)的限流。

支持兩個(gè)場(chǎng)景:

1)對(duì)于單進(jìn)程多線程場(chǎng)景(使用線程安全的Queue做全局變量)

這種場(chǎng)景下,只部署了一個(gè)實(shí)例,對(duì)這個(gè)實(shí)例進(jìn)行限流。在生產(chǎn)環(huán)境中用的很少。

2)對(duì)于多進(jìn)程分布式場(chǎng)景(使用redis做全局變量)

多實(shí)例部署,一般來(lái)說(shuō)生產(chǎn)環(huán)境,都是這樣的使用場(chǎng)景。

在這樣的場(chǎng)景下,需要對(duì)流量進(jìn)行整體的把控。例如,user服務(wù)部署了三個(gè)實(shí)例,對(duì)外暴露query接口,要做的是對(duì)接口級(jí)的流量限制,也就是對(duì)query這個(gè)接口整體允許多大的峰值,而不去關(guān)心到底負(fù)載到哪個(gè)實(shí)例。

題外話,這個(gè)可以通過(guò)nginx做。 

下面說(shuō)一下限流器的實(shí)現(xiàn)吧。 

1、接口BaseRateLimiter

按照我的思路,先定義一個(gè)接口,也可以叫抽象類(lèi)。

初始化的時(shí)候,要配置rate,限流器的限速。

提供一個(gè)抽象方法,acquire(),調(diào)用這個(gè)方法,返回是否限制流量。

class BaseRateLimiter(object):  __metaclass__ = abc.ABCMeta  @abc.abstractmethod  def __init__(self, rate):    self.rate = rate  @abc.abstractmethod  def acquire(self, count):    return

2、單進(jìn)程多線程場(chǎng)景的限流ThreadingRateLimiter

繼承BaseRateLimiter抽象類(lèi),使用線程安全的Queue作為全局變量,來(lái)消除競(jìng)態(tài)影響。

后臺(tái)有個(gè)進(jìn)程每秒鐘清空一次queue;

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 铜山县| 赤壁市| 滨海县| 卢龙县| 厦门市| 册亨县| 郸城县| 八宿县| 利辛县| 鹤岗市| 丹寨县| 涿州市| 石嘴山市| 丽水市| 东阿县| 涡阳县| 都昌县| 太和县| 五常市| 封丘县| 云安县| 信阳市| 花莲市| 富顺县| 建宁县| 邢台县| 和平县| 科尔| 日喀则市| 溧水县| 田东县| 梅州市| 榆中县| 凤庆县| 宝鸡市| 突泉县| 沙坪坝区| 景泰县| 尉氏县| 贵州省| 敦化市|