限流降级设置

cdn的收费方式按最高点来收取,为了节省成本,需要在cdn的流量到达最大成本值前通过服务器程序限制客户端的请求流量

需求分析

cdn的流量请求来源有:

  1. 静默升级
  2. 用户点击下载
  3. 一些活动图片资源
  4. 非法请求(本篇不涉及)

其中2,3不做限制,静默升级是限流的主要入口

目标

1.在后台运营设置的流量目标值范围以下,且使得流量的波动曲线尽量平稳

削峰平谷20171125001.png

2.服务端服务器集群平稳提供服务,抹平业务接口的高峰请求,例如最近频发的静默升级接口499,503事件

削峰平谷泳道图

削峰平谷20171125002.png

说明: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计算需要使用分布式锁,会有一定的风险,需要进行压测

应用商店逻辑结构图

削峰平谷20171125003.png

数据库设计

表结构

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

posted on 2017-12-11 22:19  阿青的cnblog  阅读(232)  评论(0编辑  收藏  举报

导航