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