偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

搞懂限流算法這一篇就夠了

開(kāi)發(fā) 開(kāi)發(fā)工具 算法
大家都知道,對(duì)于高并發(fā)的業(yè)務(wù)場(chǎng)景,我們?yōu)榱吮U戏?wù)的穩(wěn)定,經(jīng)常會(huì)祭出三大利器:緩存、熔斷降級(jí)和服務(wù)限流。

 TL;DR(too long don't read)

限流算法:計(jì)數(shù)器、滑動(dòng)窗口、漏桶、令牌桶。

限流方案:Guava的RateLimiter、Alibaba Sentinel

[[273634]]

大家都知道,對(duì)于高并發(fā)的業(yè)務(wù)場(chǎng)景,我們?yōu)榱吮U戏?wù)的穩(wěn)定,經(jīng)常會(huì)祭出三大利器:緩存、熔斷降級(jí)和服務(wù)限流。

服務(wù)限流作為一個(gè)核心的自保護(hù)機(jī)制,能夠在非常高并發(fā)的情況下,其他機(jī)制都無(wú)法保障降級(jí)的情況下,保護(hù)系統(tǒng)不崩潰,以免產(chǎn)生雪崩效應(yīng)。

我們?cè)O(shè)想這么一個(gè)場(chǎng)景。

名詞解析,QPS(query per second 每秒查詢數(shù))

單臺(tái)機(jī)器可以承受的最高QPS為 100,我們有5臺(tái)機(jī)器,日常服務(wù) QPS 為 300。

那么其實(shí)我們是毫無(wú)壓力,根據(jù)前置的負(fù)載均衡服務(wù)器,每臺(tái) 300/5 = 60 ??梢酝昝捞峁┓?wù)。

今天,老板突然搞了一波促銷,QPS 達(dá)到了 800。

好了,機(jī)器 A 的 QPS 達(dá)到了 160,已經(jīng)完全扛不住了,直接宕機(jī)了。這時(shí)候集群只剩下4臺(tái)機(jī)器,QPS依然是 800。平均分配到剩下的 4 臺(tái)機(jī)器上,每臺(tái)機(jī)器 200。就這樣,機(jī)器一臺(tái)一臺(tái)倒下,雪崩了。

那如果我們的系統(tǒng)有限流,會(huì)是什么樣的場(chǎng)景呢?

QPS 達(dá)到了800。好了,機(jī)器 A 的 QPS 達(dá)到了 160,但因?yàn)橄蘖髁?00,所以機(jī)器依然正常運(yùn)行,只是損失了 60 QPS 的客戶,整個(gè)集群整體還是正常運(yùn)行的。這時(shí)候就給開(kāi)發(fā)和運(yùn)營(yíng)們留下時(shí)間開(kāi)始降級(jí)擴(kuò)容 bala bala....

可見(jiàn),限流對(duì)于系統(tǒng)的自保護(hù)是非常重要的存在,然而很多工程師并沒(méi)有正視它,或者說(shuō)只是會(huì)用,并不清楚背后的原理。先說(shuō)下結(jié)論。

常見(jiàn)的限流算法有:計(jì)數(shù)器、滑動(dòng)窗口、漏桶、令牌桶。

常見(jiàn)的限流方案有:Guava的RateLimiter、基于分布式鎖的令牌桶、Alibaba Sentinel

<計(jì)數(shù)器>

一般來(lái)說(shuō),計(jì)數(shù)器比較粗暴,就是看單位時(shí)間內(nèi),所接受的 QPS 的請(qǐng)求有多少,如果超過(guò)閾值,則直接拒絕服務(wù)。大概場(chǎng)景是這樣的。

有這么一個(gè)煎餅果子攤,攤主叫老王,上面的老板說(shuō)你一分鐘只許賣 6 個(gè)餅(計(jì)數(shù)限流1分鐘6個(gè))。如果在前 0.1 秒已經(jīng)有人預(yù)定了6個(gè)餅而且老王剛好神來(lái)之筆也已經(jīng)做完了,那么老王在接下來(lái)的 59.59 秒只能坐在凳子上,等待下一分鐘的到來(lái)。

看,簡(jiǎn)單粗暴的計(jì)數(shù)器,在系統(tǒng)性能允許的情況下,可能會(huì)浪費(fèi)非常多的資源

<滑動(dòng)窗口>

滑動(dòng)窗口可以看做計(jì)數(shù)器的精細(xì)化實(shí)現(xiàn),之前只能一分鐘一分鐘往前趕,現(xiàn)在可以根據(jù)實(shí)現(xiàn)的精細(xì)化 一秒一秒往前趕,雖然整體原理還是靠計(jì)數(shù)器。既往不咎,是一個(gè)適當(dāng)時(shí)間里懂得忘記的計(jì)數(shù)器。

<漏桶>

看這張圖可以看到漏桶的基礎(chǔ)原理,我們會(huì)用一個(gè)桶作為緩沖區(qū),所有的請(qǐng)求都先丟到桶里。系統(tǒng)以恒定速率慢慢消化這些請(qǐng)求。比較常見(jiàn)的實(shí)現(xiàn)就是隊(duì)列,用一個(gè)緩沖區(qū)來(lái)保存沒(méi)處理的請(qǐng)求,然后消費(fèi)者恒定速度抓取一些請(qǐng)求進(jìn)行處理。

 

有這么一個(gè)煎餅果子攤,攤主叫老王,老王一秒鐘只能做一個(gè)餅?,F(xiàn)在來(lái)了 100個(gè)顧客,那怎么辦呢?就排隊(duì)啊。老王的老婆啊潘,把這批顧客引導(dǎo)到了旁邊的空地上站著,并給他們一個(gè)一個(gè)標(biāo)記了號(hào)碼。老王做完一個(gè),就大喊一聲號(hào)碼,對(duì)應(yīng)的的顧客就過(guò)來(lái)把餅?zāi)米摺?/p>

你看看這里的要求,要求有空地(桶),而且顧客等得起(等待時(shí)間)。

<令牌桶>

我們會(huì)有一個(gè)令牌管理員,按照一定的策略往令牌桶里放令牌。系統(tǒng)每接受到一個(gè)請(qǐng)求的時(shí)候,都會(huì)請(qǐng)求要一個(gè)令牌。如果拿到令牌,那么就處理這個(gè)請(qǐng)求,拿不到就直接拒絕這個(gè)請(qǐng)求。那么只要令牌發(fā)放的策略正確,這個(gè)系統(tǒng)就不會(huì)被拖垮,也能對(duì)機(jī)器的利用率更高。

 

有這么一個(gè)煎餅果子攤,攤主叫老王,老王也不知道自己能做幾個(gè)餅。老王的老婆阿潘在老王旁邊放了一個(gè)桶,里邊放了一些牌子,并告訴老王,"我?guī)湍憧粗?,你看?jiàn)有令牌你就做就是了"。 現(xiàn)在來(lái)了 100個(gè)顧客,老王挖糞涂墻,原來(lái)一秒鐘只能做一個(gè),現(xiàn)在一秒鐘可以做好多個(gè),老王不看顧客了,每次能拿到令牌就直接做。老王的老婆啊潘,眼睛一直看著老王,看看他手抖沒(méi)是不是要上廁所了。如果手抖了或者可能扛不住了,那就少放一點(diǎn)令牌歇一歇。但如果一次性來(lái)了五個(gè) vip 客戶,那阿潘就不管那么多了,就直接丟多幾個(gè)令牌讓老王忙一點(diǎn)。

我們看到,令牌桶的方法可以根據(jù)系統(tǒng)負(fù)載,實(shí)時(shí)調(diào)節(jié)系統(tǒng)的處理能力,能夠允許一定量級(jí)的瞬時(shí)高峰流量的快速消化。

好嘞。方案和算法基本上就說(shuō)完了,現(xiàn)在聊聊限流關(guān)于現(xiàn)有的實(shí)現(xiàn),我們當(dāng)然是非常希望可以不做過(guò)多的開(kāi)發(fā),開(kāi)箱即用完事,幸運(yùn)的是,我們已經(jīng)有不少的開(kāi)源實(shí)現(xiàn),就算自己實(shí)現(xiàn)也不會(huì)特別難。

<RateLimiter>

  1. <dependency>  
  2.      <groupId>com.google.guava</groupId>  
  3.      <artifactId>guava</artifactId>  
  4.      <version>25.1-jre</version>  
  5.  </dependency>  

使用Guava的RateLimiter進(jìn)行限流控制,主要有兩種核心模式,SmoothBursty 和 SmoothWarmingUp。SmoothBursty 每秒鐘發(fā)放N個(gè)令牌,也允許預(yù)先借用一定數(shù)量的令牌。SmoothWarmingUp,在系統(tǒng)剛剛啟動(dòng)的時(shí)候,只會(huì)按最低閾值發(fā)放令牌,然后逐漸增加到設(shè)定的最高閾值。

  1. RateLimiter smoothBuisty = RateLimiter.create(1); 
  2. RateLimiter smoothWarmingUp = RateLimiter.create(1 , 1 , TimeUnit.SECONDS); 
  3. smoothBuisty.acquire(); 
  4. smoothWarmingUp.acquire(5); 

acquire() 方法會(huì)阻塞,直到令牌桶返回,還可以一次性拿到N個(gè)令牌。但是 RateLimiter 是單機(jī)版的,如果我們想要實(shí)現(xiàn)分布式,那可以基于 RateLimiter 的原理,實(shí)現(xiàn)以下分布式的,可以使用 Redis 等分布式鎖來(lái)進(jìn)行實(shí)現(xiàn)。

<Alibaba  Sentinel>

https://github.com/alibaba/Sentinel.git

Sentinel 是一個(gè)帶配置中心的分布式緩存,以 "資源名稱" 為統(tǒng)計(jì)點(diǎn),提供了多種方式的限流方案,可以基于 QPS、線程數(shù),甚至系統(tǒng) load 進(jìn)行集群規(guī)模的限流。Sentinel 在整個(gè)生態(tài)的位置是這樣的。

 

使用限流的代碼非常簡(jiǎn)單,只需要定義一個(gè) String 類型的資源,作為唯一標(biāo)識(shí),Sentinel 會(huì)根據(jù)規(guī)則進(jìn)行限流。

  1. try (Entry entry = SphU.entry("HelloWorld")) { 
  2.     // Your business logic here. 
  3.     System.out.println("hello world"); 
  4. } catch (BlockException e) { 
  5.     // Handle rejected request. 
  6.     e.printStackTrace(); 

定義限流規(guī)則的也代碼非常簡(jiǎn)單,只需要定義一個(gè) String 類型的資源,作為唯一標(biāo)識(shí),Sentinel 會(huì)根據(jù)規(guī)則進(jìn)行限流。

  1. private static void initFlowRules(){ 
  2.     List<FlowRule> rules = new ArrayList<>(); 
  3.     FlowRule rule = new FlowRule(); 
  4.     rule.setResource("HelloWorld"); 
  5.     rule.setGrade(RuleConstant.FLOW_GRADE_QPS); 
  6.     // Set limit QPS to 20. 
  7.     rule.setCount(20); 
  8.     rules.add(rule); 
  9.     FlowRuleManager.loadRules(rules); 

也提供了 DashBoard 進(jìn)行實(shí)時(shí)規(guī)則調(diào)整。

 

最后總結(jié)一下今天的結(jié)論

限流算法:計(jì)數(shù)器、滑動(dòng)窗口、漏桶、令牌桶。

限流方案:Guava的RateLimiter、基于分布式鎖的令牌桶、Alibaba Sentinel

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2020-11-06 10:01:06

Nginx

2020-08-03 10:00:11

前端登錄服務(wù)器

2023-04-24 08:00:00

ES集群容器

2023-02-10 09:04:27

2020-02-18 16:20:03

Redis ANSI C語(yǔ)言日志型

2022-06-20 09:01:23

Git插件項(xiàng)目

2020-05-14 16:35:21

Kubernetes網(wǎng)絡(luò)策略DNS

2022-08-01 11:33:09

用戶分析標(biāo)簽策略

2021-04-08 07:37:39

隊(duì)列數(shù)據(jù)結(jié)構(gòu)算法

2023-09-11 08:13:03

分布式跟蹤工具

2021-05-14 23:31:50

大數(shù)據(jù)計(jì)算機(jī)開(kāi)發(fā)

2020-07-03 08:21:57

Java集合框架

2023-10-17 08:15:28

API前后端分離

2024-09-23 08:00:00

消息隊(duì)列MQ分布式系統(tǒng)

2019-05-14 09:31:16

架構(gòu)整潔軟件編程范式

2018-05-22 08:24:50

PythonPyMongoMongoDB

2025-08-07 04:10:00

光模塊AI網(wǎng)絡(luò)

2024-04-08 10:01:33

2022-04-07 10:39:21

反射Java安全

2021-03-03 14:55:10

開(kāi)發(fā)MySQL代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)