1. 程式人生 > >限流降級設置

限流降級設置

task lin 緩存設計 image 活動 關閉 拒絕 生效 varchar

cdn的收費方式按最高點來收取,為了節省成本,需要在cdn的流量到達最大成本值前通過服務器程序限制客戶端的請求流量

需求分析

cdn的流量請求來源有:

  1. 靜默升級
  2. 用戶點擊下載
  3. 一些活動圖片資源
  4. 非法請求(本篇不涉及)

其中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-安裝記錄接口
字段 數據類型 含義 描述
tablename String 表名
json串 String 保存到db的對象的json化字符串
operateType int 0-新增,1-修改,2-刪除

緩存設計

降級限流數

名稱 數據結構 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

限流降級設置