實現千萬級流量架構設計實現原則

1 實現高併發

  • 服務拆分:將整個專案拆分成多個子專案或者模組,分而治之,將專案進行水平擴充套件
  • 服務化:解決服務呼叫複雜之後的服務註冊和發現問題
  • 訊息佇列: 解耦,非同步處理
  • 快取:各種快取帶來的高併發

2 實現高可用

  • 叢集
  • 限流
  • 降級

3 業務設計

  • 冪等:使用者對於同一個操作發起的一次請求或者多次請求的最終請求結果是一致的,不會因為點選了多次而產生不一致的結果
  • 防重:防止同樣的資料同時提交,服務端防重實現思路:在伺服器端生成一個惟一的隨機標識(Token),同時在當前使用者的Session中儲存這個標識,然後將這個標識傳送到客戶端的form表單中,在表單中用隱藏域儲存這個標識,當表單提交的時候,這個標識和表單一起提交到服務端,然後在服務端判斷使用者提交上來的標識和伺服器生成的標識是否一樣,如果不一樣就代表是重複提交,此時伺服器就可以不用處理重複提交上來的請求,如果一樣,則證明不是重複提交,伺服器可以對提交的請求做相關的處理,請求處理完成後清除當前使用者session中儲存的標識

在下列情況下,伺服器將拒絕使用者提交的請求:

  1. 儲存session中的token域表單提交的token不一致
  2. 儲存使用者的session中不存在token
  3. 使用者提交的表單資料中不存在token
  •  狀態機:軟體設計中的狀態機,一般指有限狀態機,是表示有限個狀態以及這些狀態之間的轉移和動作等

4  限流

 限流的目的是通過對併發訪問/請求進行限速或者一個時間視窗內的請求進行限速來保護系統的可用性,一旦達到限制速率就可以拒絕服務。就像手機預售一樣,假如要賣出3萬臺,只需要接收3萬用戶的請求就可以,其他的使用者請求可以選擇過濾,可以提示"當前伺服器過忙,請稍後再試"的提示。

限流的方式

  1. 限制瞬時併發數: 在入口層限制同一個IP 來源的連線請求,防止惡意攻擊
  2. 限制併發總數:通過配置資料庫連線池,執行緒池的大小來約束總的併發數
  3. 限制時間視窗內的平均速度:在介面層面,通過限制訪問速率來控制介面的併發請求
  4. 其他方式:限制遠端介面的呼叫速率,限制MQ的消費速率

常用的限流演算法

  1. 滑動窗戶協議:一種常見的流量控制技術,用來改善吞吐量

滑動視窗是一種流量控制技術,在早期的網路通訊中,通訊雙方不會考慮網路擁擠情況直接傳送資料,由於大家不知道網路的擁擠情況,同時傳送資料導致中間節點阻塞丟包,誰也傳送不了資料,所以就有了滑動視窗機制來解決這類問題,傳送方和接收方都維護一個數據幀的序列,這個序列就成為視窗

滑動視窗協議,是基於TCP協議的一種應用,用於網路資料傳輸時的流量控制,避免阻塞發生。該協議允許傳送方在停止並等待確認前傳送多個數據分組,由於傳送方不必每發一個分組就停下來等待確認,因此該協議可以加速資料的傳輸,提高網路吞吐量

傳送視窗:傳送端允許連續傳送的幀的序號表,傳送端可以不等待應答而連續傳送資料(可以通過設定視窗的尺寸來控制)

接收視窗:接收方允許接收的幀的序列表,凡是落在接收視窗內的幀,接收方都必須處理,落在視窗之外的幀將被丟棄,接收方每次允許接收的幀數稱為接收視窗的尺寸

      2 漏桶:漏桶演算法能強行限制資料的傳輸速率

漏桶演算法的原理很簡單,請求先進入到漏桶中,漏桶以一定的速度出水,當水請求過大會直接溢位,可以看出漏桶演算法能強行限制資料的傳輸速率,進入端無須考慮出水端的速率,就像mq訊息佇列那樣,provider只需要將訊息傳入佇列中,而不需要關係consumer是否接收到了訊息。對於溢位的水就是被過濾的資料,可以直接丟棄,也可以通過某種方式暫時儲存,例如加入佇列,像執行緒池裡面對溢位資料的4種處理機制一樣

     3 令牌桶:屬於控制速率型別的限流演算法

對於很多應用場景來說,除了能夠要求限制資料的平均傳輸速率外,還要求允許某種程度的突發傳輸,這個時候漏桶演算法就不合適了,令牌桶演算法更為合適,令牌桶的演算法原理是系統會以一個恆定的速度往桶裡面放入令牌,如果請求需要被處理,則需要從桶裡面獲取一個令牌,當桶裡面沒有令牌可獲取的時候,則拒絕服務

    4 計數器:最簡單的一種,通過控制時間段內的請求次數