zoukankan      html  css  js  c++  java
  • 限流降级设置

    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
  • 相关阅读:
    包装类型
    int 和 Integer 有什么区别
    final finally finalize区别
    java关键字final 有什么用?
    String和StringBuffer、StringBuilder的区别是什么?
    String 类的常用方法都有那些?
    Vue官网教程-计算属性和监听器
    Vue官网教程-模板语法
    Vue官网教程-实例
    Vue官网教程-介绍
  • 原文地址:https://www.cnblogs.com/white-snow/p/8025322.html
Copyright © 2011-2022 走看看