1. 程式人生 > >網際網路閘道器設計之限流演算法

網際網路閘道器設計之限流演算法

騰訊王卡業務第一代閘道器設計架構如上圖所示,也許有許多人會問,nginx本身就能做網關了,為什麼還需要另外開發閘道器呢?

答案是nginx開發閘道器,線上現有成員技術背景下,條件不成熟,為了快速構建我們的微服務架構,所以我們選擇了基於spring cloud zuul做閘道器開發,這樣技術棧單一,小團隊比較合適,運維維護成本較低。

閘道器能給我們帶來的好處如下:

  • 客戶端認證
    無論是對內網還是外網的介面都是需要做使用者身份認證的,而使用者認證在一些規模大點的公司都會有統一的單點登入系統,如果每個微服務系統都是做對接單點登入系統的工作,那麼顯然比較浪費資源,開發效率低。可以將認證的部分抽取到閘道器層,然後微服務系統無需關注認證的邏輯只關注自身業務即可。

  • 訪問控制
    對一些特定的介面設定白名單,訪問次數,訪問頻率等各類設定。而這些非業務功能的配置以及變更不會影響微服務的實現可以在閘道器層單獨做操作。

  • 負載均衡
    可以靈活的在閘道器層制定負載均衡策略。

  • 安全
    可以統一在閘道器層增加一個額外的保護層來防止惡意攻擊,如果客戶端直連微服務的話,每個暴露的微服務都需要面臨安全問題。

       下面我們回到本文的主題“訪問控制”

       訪問控制中,必談的就是限流演算法了,目前比較流行的演算法有“漏桶限流演算法”、“令牌桶限流演算法”,另外大家很少回去談及“滑動視窗演算法”

       漏桶(Leaky Bucket)演算法思路很簡單,水(請求)先進入到漏桶裡,漏桶以一定的速度出水(介面有響應速率),當水流入速度過大會直接溢位(訪問頻率超過介面響應速率),然後就拒絕請求,可以看出漏桶演算法能強行限制資料的傳輸速率.示意圖如下:

         可見這裡有兩個變數,一個是桶的大小,支援流量突發增多時可以存多少的水(burst),另一個是水桶漏洞的大小(rate)。

         漏桶本身具有一定容量,生產方的生產速率不受限制,當達到漏桶容量時將拒絕生產,消費方以固定速率消費。例如5r/s

         優點:消費方可以以固定速率消費,因為漏桶消費方限制了速率。
         缺點:缺點也很明顯,不能抵抗難於突發流量。

         舉例:漏桶允許以200r/s速率消費,如果突發流量為500r/s來襲,導致大量請求堆積或者拒絕。

        令牌桶演算法(Token Bucket)和 Leaky Bucket 效果一樣但方向相反的演算法,更加容易理解.隨著時間流逝,系統會按恆定1/QPS時間間隔(如果QPS=100,則間隔是10ms)往桶裡加入Token(想象和漏洞漏水相反,有個水龍頭在不斷的加水),如果桶已經滿了就不再加了.新請求來臨時,會各自拿走一個Token,如果沒有Token可拿了就阻塞或者拒絕服務.

        令牌桶的另外一個好處是可以方便的改變速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率. 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種演算法則實時的計算應該增加的令牌的數量.

      優點:可以抵抗突發流量。令牌桶中積累一定數量的令牌,消費速率不固定,在一個極小的時間視窗內,可以消費所有的令牌。
      缺點;事物具有兩面性,優點極可能就會導致缺點。難於平滑的、以固定的速率消費(比如5r/s),因為消費令牌並沒有限速
 
      舉例:假如我們的令牌桶容量是500,現有令牌數也是500,我們系統總併發也是500,生產令牌速率是5r/s,假如一次突發的500個請求,他會瞬間消費完所有令牌,後續請求可能是300r/s,200r/s....那麼所有請求將被快取或者拒絕(自己時間策略決定),難於平滑消費。

       通過以上分析,感覺令牌桶演算法更合適大家,他可以抵抗突發流量,同時又可以平滑消費(突發流量耗盡後,後面的令牌生產方生產速率是恆定的,這樣限制了消費速率也是恆定的)。可是大家有沒有發現一個問題,不論是 令牌桶限流 和 漏桶限流都存在一個問題,相連兩個時間單位內,流量可能會超過系統承受能力。為什麼呢?前一個時間單位的N請求沒有完全返回,
後一個時間單位的m個請求又來襲,導致n+m>系統總容量。

       滑動視窗限流

image

在傳送方一側會將要傳送的資料組成一個佇列,依次傳送佇列裡的資料。佇列裡面的資料包含幾個部分,有已經發送且已經確認的資料、已經發送但未確認的資料、即將傳送的資料、現在還不能傳送的資料這四個部分,其中的數字標號是資料序列號。上圖中提供的視窗即對方通告的視窗大小,可以看出為6個視窗,同時視窗的左邊界為3,表明在序列號3及之前的資料已經發送並完成確認,則可以算出視窗的右邊界為9。同時我們可以知道有多少已經發送但未收到確認的資料,總共有3個視窗,則傳送邊界為6,所以最後我們可知可用視窗,即馬上能傳送的資料序列號範圍為7-9。

      隨著時間的推移,當我們收到已經發送的資料的ACK時,滑動視窗的左邊界就能右移,如果視窗大小未發生改變,那麼視窗的右邊界也會右移,相當於整個視窗右移。其中在視窗的變化過程中有三個運動狀態:

  • 關閉: 視窗左邊界右移。發生在收到已傳送資料的ACK時。
  • 開啟: 視窗右邊界右移。發生在接收方已處理接收到的資料,使得接收方快取變大,會給傳送方通告新的變大的視窗值。
  • 收縮: 視窗有邊界左移。發生再糊塗視窗中。

      滑動視窗優點:

1:他能抵抗突發流量,

2:他能解決兩個相鄰時刻瞬時流量超過系統總承載量

 作者也玩公眾號,歡迎關注《JAVA之庖丁解牛》

相關推薦

網際網路設計演算法

騰訊王卡業務第一代閘道器設計架構如上圖所示,也許有許多人會問,nginx本身就能做網關了,為什麼還需要另外開發閘道器呢? 答案是nginx開發閘道器,線上現有成員技術背景下,條件不成熟,為了快速構建我們的微服務架構,所以我們選擇了基於spring cloud zuul做

.Net Core使用Ocelot(一) -負載,,熔斷,Header轉換

1.什麼是API閘道器 API閘道器是微服務架構中的唯一入口,它提供一個單獨且統一的API入口用於訪問內部一個或多個API。它可以具有身份驗證,監控,負載均衡,快取,請求分片與管理,靜態響應處理等。API閘道器方式的核心要點是,所有的客戶端和消費端都通過統一的閘道器接入微服務,在閘道器層處理所有的非業務功能。

.Net微服務實踐(四)[]:Ocelot熔斷、快取以及負載均衡

目錄限流熔斷快取Header轉化HTTP方法轉換負載均衡注入/重寫中介軟體後臺管理最後 在上篇.Net微服務實踐(三)[閘道器]:Ocelot配置路由和請求聚合中我們介紹了Ocelot的配置,主要特性路由以及服務聚合。接下來,我們會介紹Ocelot的限流、熔斷、快取以及負載均衡。 限流 我們先來看限流的配置

億級流量架構設計思路、常見對比

本文準備圍繞七個點來講閘道器,分別是閘道器的基本概念、閘道器設計思路、閘道器設計重點、流量閘道器、業務閘道器、常見閘道器對比,對基礎概念熟悉的朋友可以根據目錄檢視自己感興趣的部分。 ## 什麼是閘道器 閘道器,很多地方將閘道器比如成門, 沒什麼問題, 但是需要區分閘道器與網橋的區別, **網橋**

Open Shortest Path First; 內部協議OSPF協議

知識點概述: OSPF最主要的特徵是使用分散式的鏈路狀態協議,而不是像RIP那樣的距離向量協議。 與RIP協議相比較: (1)並非像RIP協議只與相鄰路由進行資訊交換,OSPF向本自治系統中所有路由傳送資訊。【洪泛法】 (2)傳送的資訊就是本路由器相鄰的所有路由器的鏈路狀態。鏈

基於STM32F107+DP83848嵌入式zigbee設計

1. 引言 Wireless Sensor Network,WSN(無線感測器網路)是指由大量成本相對低廉的,具有感知能力、計算能力、實時通訊能力的感測器節點組成的嵌入式無線網路,是當前眾多領域的研究和應用熱點。建立在IEEE 802.15.4(LR_WPAN,低速率無線個

API 設計 (Rest 風格)

個人學習 加備忘 。 什麼樣的介面,是讓人頭痛? 1. 沒有介面文件 。 2. 出入引數風格不統一 。 3. 異常提示不友好。 4. 模型結構混亂,介面粗暴升級 。 5. 穩定性差,還找不到人。 如果你是一名架構師,在帶領團隊開發大量的API介

服務zuul三:zuul統一異常處理

過濾器中丟擲異常的問題 首先,我們可以來看看預設情況下,過濾器中丟擲異常Spring Cloud Zuul會發生什麼現象。我們建立一個pre型別的過濾器,並在該過濾器的run方法實現中丟擲一個異常。比如下面的實現,在run方法中呼叫的doSomething方法將丟擲Runt

遊戲伺服器設計

閘道器,通俗的講,是訊息達到伺服器的第一關,它負責與客戶端建立連線,接收客戶端傳送過來的訊息,並對訊息進行驗證,分發等。不同的服務系統閘道器負責的功能多少可能不太一樣。但是本質是不變的。 1,閘道器的功能 1.1 與客戶端建立連線 這個應該是閘道器最基本的網功了,

物聯網設計及實現

摘要 物聯網,簡而言之就是連線物品的網路,它是網際網路的應用擴充套件和延伸。主要是利用各種感測裝置和通訊手段,將M2M(即人與人、人與物、物與物)與網際網路相連線,實現智慧化的識別、定位、跟蹤、遠端監控和管理的一種網路。它是整合資訊管理技術變革和促進資訊產業的開端和基石,

【奇思妙想】,如何給設計一款專屬的許可權控制【責任鏈設計模式】

什麼是責任鏈模式 客戶端發出一個請求,鏈上的物件都有機會來處理這一請求,而客戶端不需要知道誰是具體的處理物件。這樣就實現了請求者

鬥魚 API 演進

2019 年 5 月 11 日,OpenResty 社群聯合又拍雲,舉辦 OpenResty × Open Talk 全國巡迴沙龍武漢站,鬥魚資深工程師張壯壯在活動上做了《 鬥魚 API 閘道器演進之路 》的分享。 OpenResty x Open Talk 全國巡迴沙龍是由 OpenResty

一文搞懂高頻面試題演算法,從演算法原理到實現,再到對比分析

限流是指在系統面臨高併發、大流量請求的情況下,限制新的流量對系統的訪問,從而保證系統服務的安全性。常用的限流演算法有計數器固定視窗演算法、滑動視窗演算法、漏斗演算法和令牌桶演算法,下面將對這幾種演算法進行分別介紹,並給出具體的實現。本文目錄如下,略長,讀者可以全文閱讀,同樣也可以只看感興趣的部分。 [TOC

BeetleX服務和快取

限流和快取是閘道器中兩個非常重要的功能,前者是保障服務更可靠地執行,後者則可以大大提高應用的吞吐能力。Beetlex.Bumblebee微服務閘道器提供了兩個擴充套件外掛來實現這兩個功能,分別是BeetleX.Bumblebee.ConcurrentLimits和BeetleX.Bumblebee.Cachi

【.NET Core專案實戰-統一認證平臺】第七章 篇-自定義客戶端

原文: 【.NET Core專案實戰-統一認證平臺】第七章 閘道器篇-自定義客戶端限流 【.NET Core專案實戰-統一認證平臺】開篇及目錄索引 上篇文章我介紹瞭如何在閘道器上增加自定義客戶端授權功能,從設計到編碼實現,一步一步詳細講解,相信大家也掌握了自定義中介軟體的開發技巧了,本篇我們將介紹如

zuul

最近專案需要實現限流的功能,專案使用的是spring cloud框架,用zuul做網管模組。準備在網管層加上限流功能。   1、使用RateLimiter+filter做統一入口限流。適用單機   Guava中開源出來一個令牌桶演算法的工具類RateLimiter

springcloud2+gateway配置中心2(包含熔斷,jwt認證,

下面介紹1未講完的閘道器功能    1重試功能,配置如下         這裡可以不寫實現類,採用預設的方式配置,然後傳送一個http的GET請求,試著斷開服務端檢視後臺:  證明配置正確,起作用了!

springcloud2+gateway配置中心1(包含熔斷,jwt認證,

第一次我也問我老大為啥不用zuul,官網有現成的指導,老大一句話:gateway效能比zuul優化效率提升20%,zuul版本落後(2x版本的code還是用的1x的原始碼),支援webflux,整合stream流;淚奔的我忙了半天zuul,哎,換! 1,引入maven,2.0以上版本注意

Activiti工作--並行--

流程的業務描述 會議記錄會籤 並行閘道器是不需要設定流程變數的,並行閘道器不在流程變數的範圍內 比如: 在開完某個產品設計會以後,需要對會議約定一些事項進行簽字畫押涉及到兩個部門(產品部/研發部)的主管和經理 確認的順序: a:產品部的主管確認然後產品部的經

使用springcloud gateway搭建(分流,,熔斷)

Spring Cloud Gateway Spring Cloud Gateway 是 Spring Cloud 的一個全新專案,該專案是基於 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術開發的閘道器,它旨在為微服務架構提供一種簡單有效的統一的 API 路