限流降級設置
阿新 • • 發佈:2017-12-12
task lin 緩存設計 image 活動 關閉 拒絕 生效 varchar 需求分析
目標
削峰平谷泳道圖
應用商店邏輯結構圖
數據庫設計
表結構
mq設計
緩存設計
降級限流數
cdn的收費方式按最高點來收取,為了節省成本,需要在cdn的流量到達最大成本值前通過服務器程序限制客戶端的請求流量
需求分析
cdn的流量請求來源有:
- 靜默升級
- 用戶點擊下載
- 一些活動圖片資源
- 非法請求(本篇不涉及)
其中2,3不做限制,靜默升級是限流的主要入口
目標
1.在後臺運營設置的流量目標值範圍以下,且使得流量的波動曲線盡量平穩
2.服務端服務器集群平穩提供服務,抹平業務接口的高峰請求,例如最近頻發的靜默升級接口499,503事件
削峰平谷泳道圖
說明:1.降級方案由運維同學後臺人為控制,可在活動與非活動期間動態調整;包括不同區域範圍的閾值允許的請求寬帶值以及放行量
例如:第一步:配置靜默升級接口為降級接口,降級類型為隨機拒絕服務/延時請求第二步:配置隨機拒絕策略--比如限流類型為寬帶值限流,則閾值範圍9.8G-10G放行50%請求;閾值9.7G-9.8範圍放行40%...;5G以下放行100%。 --限流類型為時間段,則閾值範圍18:00-21:00放行40%,21:00-00:20放行20%...,其他時間放行100% --所有時間均為北京時間 --限流類型為QPS,則閾值範圍100W-200W放行40%,200W-500W放行20%...,小於100w放行100% 具體可由運維人員根據以往的cdn流量圖的推導或根據實際需求配置 第三步:配置非放行請求的延長時限
2.通過task任務將獲取的帶寬/qps/時間段閾值轉化為可放行請求量存儲在redis緩存中,提高靜默升級接口響應速度,減少請求占用時長和使用內存,提升服務器性能
3.客戶端請求根據靜默升級接口返回的數據延時則延時,有下載鏈接則下載
同理,在客戶端對靜默升級接口可做熔斷:例如每當累計20個請求有50%失敗則打開熔斷器,不再請求遠程服務器。直到重新檢測該觸發條件,判斷是否把熔斷器關閉
4.關於QPS的計算的問題,最保險的做法是按照單機的量來計算, 如果通過redis計算需要使用分布式鎖,會有一定的風險,需要進行壓測
應用商店邏輯結構圖
數據庫設計
表結構
CREATE TABLE T_SERVER_DEMOTION (
FID int(10) unsigned NOT NULL AUTO_INCREMENT,
FAPI varchar(100) DEFAULT ‘‘ COMMENT ‘降級api‘,
FDEMOTION_TYPE tinyint(4) DEFAULT ‘0‘ COMMENT ‘降級方式:0-服務端api拒絕服務,1-異步db持久化,2-隨機拒絕服務/延時請求(例如靜默升級接口可以接受隨機拒絕)‘,
PRIMARY KEY (FID)
) COMMENT‘接口降級配置表‘;
CREATE TABLE T_SERVER_DEMOTION_THROTTLING (
FID int(10) unsigned NOT NULL AUTO_INCREMENT,
FDEMOTIONID int(10) unsigned NOT NULL DEFAULT 0 COMMENT ‘T_SERVER_DEMOTION.FID‘,
FCOUNTRY varchar(10) COLLATE NOT NULL DEFAULT ‘‘ COMMENT ‘限流國家,空串表示不限‘,
FTHREADHOLD_TYPE tinyint(4) NOT NULL DEFAULT 0 COMMENT ‘限流單位:0-流量MBPS,1-QPS,2-時間段‘,
FMANUFACTURER tinyint(4) NOT NULL DEFAULT 0 COMMENT ‘限流機器:0-我方服務器集群,1-阿裏雲,2-騰訊雲‘,
FMAUNUFACTURER_PRIORITY tinyint(4) NOT NULL DEFAULT 0 COMMENT ‘廠商優先級‘,
FTHREDHOLD_MIN float unsigned NOT NULL DEFAULT 0 COMMENT ‘流量/QPS/時間段最小臨界值‘,
FTHREDHOLD_MAX float unsigned NOT NULL DEFAULT 0 COMMENT ‘流量/QPS/時間段最大臨界值‘,
FRELEASE_RATE int(11) unsigned NOT NULL DEFAULT 100 COMMENT ‘放行比例‘,
FUMRELEASE_DELAY float unsigned NOT NULL DEFAULT 0 COMMENT ‘非放行比例的延長時限‘,
FVALID tinyint(4) NOT NULL COMMENT ‘0-不生效,1-生效‘,
PRIMARY KEY (FID)
) COMMENT‘接口限流配置表‘;
mq設計
用於接口降級配置中降級類型為延遲db操作的類型,由task去讀取對應的消息延緩入庫時間;緩解db高峰壓力和提升接口響應速度
topic:APPSTORE_INTL_STORE_TOPIC
group:APPSTORE-INTL-STORE-GROUP
zk:根據不同環境配置
傳輸的數據
head.type | head.subtype | body | ||||||||||||||||
4-通知task處理降級延緩的入庫操作 | 0-安裝記錄接口 |
|
緩存設計
降級限流數
名稱 | 數據結構 | key | value | 過期時間 |
靜默升級接口QPS | string | API:SILENT_UPDATE_API_QPS | 整型數字 | 實時 |
限流接口列表數據 | string | TASK:DEMOTIOM_{api}_THROTLLING | List.toJson()) | 4h |
當前帶寬數據 | string | CDN_CURRENT_{cdn_name}_BRAND_WIDTH | List.toJson()) | 5min |
CDN不同國家放行流量和不放行的延長時限 | hash | CDN_THROTLLING_{country}_CURRENT_INFO | subkey_allow放行量和subkey_delaytime非放行延長時限 | 30s |
限流降級設置