實現千萬級流量架構設計實現原則
1 實現高並發
- 服務拆分:將整個項目拆分成多個子項目或者模塊,分而治之,將項目進行水平擴展
- 服務化:解決服務調用復雜之后的服務注冊和發現問題
- 消息隊列: 解耦,異步處理
- 緩存:各種緩存帶來的高並發
2 實現高可用
- 集群
- 限流
- 降級
3 業務設計
- 冪等:用戶對於同一個操作發起的一次請求或者多次請求的最終請求結果是一致的,不會因為點擊了多次而產生不一致的結果
- 防重:防止同樣的數據同時提交,服務端防重實現思路:在服務器端生成一個惟一的隨機標識(Token),同時在當前用戶的Session中保存這個標識,然后將這個標識發送到客戶端的form表單中,在表單中用隱藏域存儲這個標識,當表單提交的時候,這個標識和表單一起提交到服務端,然后在服務端判斷用戶提交上來的標識和服務器生成的標識是否一樣,如果不一樣就代表是重復提交,此時服務器就可以不用處理重復提交上來的請求,如果一樣,則證明不是重復提交,服務器可以對提交的請求做相關的處理,請求處理完成后清除當前用戶session中存儲的標識
在下列情況下,服務器將拒絕用戶提交的請求:
- 存儲session中的token域表單提交的token不一致
- 存儲用戶的session中不存在token
- 用戶提交的表單數據中不存在token
- 狀態機:軟件設計中的狀態機,一般指有限狀態機,是表示有限個狀態以及這些狀態之間的轉移和動作等
4 限流
限流的目的是通過對並發訪問/請求進行限速或者一個時間窗口內的請求進行限速來保護系統的可用性,一旦達到限制速率就可以拒絕服務。就像手機預售一樣,假如要賣出3萬台,只需要接收3萬用戶的請求就可以,其他的用戶請求可以選擇過濾,可以提示"當前服務器過忙,請稍后再試"的提示。
限流的方式
- 限制瞬時並發數: 在入口層限制同一個IP 來源的連接請求,防止惡意攻擊
- 限制並發總數:通過配置數據庫連接池,線程池的大小來約束總的並發數
- 限制時間窗口內的平均速度:在接口層面,通過限制訪問速率來控制接口的並發請求
- 其他方式:限制遠程接口的調用速率,限制MQ的消費速率
常用的限流算法
- 滑動窗戶協議:一種常見的流量控制技術,用來改善吞吐量
滑動窗口是一種流量控制技術,在早期的網絡通信中,通信雙方不會考慮網絡擁擠情況直接發送數據,由於大家不知道網絡的擁擠情況,同時發送數據導致中間節點阻塞丟包,誰也發送不了數據,所以就有了滑動窗口機制來解決這類問題,發送方和接收方都維護一個數據幀的序列,這個序列就成為窗口
滑動窗口協議,是基於TCP協議的一種應用,用於網絡數據傳輸時的流量控制,避免阻塞發生。該協議允許發送方在停止並等待確認前發送多個數據分組,由於發送方不必每發一個分組就停下來等待確認,因此該協議可以加速數據的傳輸,提高網絡吞吐量
發送窗口:發送端允許連續發送的幀的序號表,發送端可以不等待應答而連續發送數據(可以通過設置窗口的尺寸來控制)
接收窗口:接收方允許接收的幀的序列表,凡是落在接收窗口內的幀,接收方都必須處理,落在窗口之外的幀將被丟棄,接收方每次允許接收的幀數稱為接收窗口的尺寸
2 漏桶:漏桶算法能強行限制數據的傳輸速率
漏桶算法的原理很簡單,請求先進入到漏桶中,漏桶以一定的速度出水,當水請求過大會直接溢出,可以看出漏桶算法能強行限制數據的傳輸速率,進入端無須考慮出水端的速率,就像mq消息隊列那樣,provider只需要將消息傳入隊列中,而不需要關系consumer是否接收到了消息。對於溢出的水就是被過濾的數據,可以直接丟棄,也可以通過某種方式暫時保存,例如加入隊列,像線程池里面對溢出數據的4種處理機制一樣
3 令牌桶:屬於控制速率類型的限流算法
對於很多應用場景來說,除了能夠要求限制數據的平均傳輸速率外,還要求允許某種程度的突發傳輸,這個時候漏桶算法就不合適了,令牌桶算法更為合適,令牌桶的算法原理是系統會以一個恆定的速度往桶里面放入令牌,如果請求需要被處理,則需要從桶里面獲取一個令牌,當桶里面沒有令牌可獲取的時候,則拒絕服務
4 計數器:最簡單的一種,通過控制時間段內的請求次數
