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 |