流量监控概要方案

背景

 

电商平台时做部分秒杀场景的动来对商品进行促销,来带动浑企业之影响力;而秒杀活动一般是于一定的工夫、特定的货品进行界定的行销抢购,这样见面吸引大量之用户展开抢购,并当活动约定的年月接触同时的拓展秒杀抢购;这样为就算形成如下特点:

1)大量用户同一时间同时拓展抢购,网站弹指之间访问流量剧增。

2)访问请求数量远远好让库存数量,只有少部分用户会秒杀成功。

3)购物车直生单独减库存。

4)秒杀商品下只有减库存。

 

以自我之混合式开发框架之中,集成了WebAPI的访,这种访问方式不但可以实现方便的数据交换,而且可以多种阳台上拓展接,如Winform程序、Web网站、移动端APP等又对接方式,Web
API的处理方式和微信提供的接口处理规则类似,也是通过奔服务器获得访问令牌(AccessToken),然后传递让每个Web
API接口,实现多少的置换处理。本篇随笔主要介绍混合框架中Winform对Web
API访问的拍卖。

概念

自打上面的背景被我们要给的题材虽,针对为电商平台如何吃它们可在这种高并发、大流量之求下给那会平静、满负荷的周转。所以马上就得引入流量监控平台,它能实时了解各个服务器的周转参数、各个业务单元的伸手数量;随时为主任提供明晰的多寡参考,以备调度。

 

1、Web API接入方式介绍

《混合式开发框架》混合了Web
API接口访问、WCF接口访问,以及一直看数据库三种方法的连接,以适应强情景的利用,是依据门面层的同一栽接口实现拍卖及包。是一样种植弹性化非常好之框架下,既而用以单机版软件要根据局域网内的用软件,也可用来分布式技术的互联网环境下,是千篇一律种成熟稳定、安全高速的技巧框架。

图片 1

有关这框架的事无巨细介绍,可以翻自己的随笔《Winform混合式开发框架的风味总结》进行详尽询问。

这边要关注Web
API的连结方式,我们知晓,如果是相似的接口,如果公布于互联网上面,就见面发多交接的高风险,因此要对接口的调用进行自我批评校验,确保走访令牌有效,而且对准数码发生修改的,还需针对数码的加密签名进行自我批评,才会保证我们的接口运行于比较安全之环境面临。

图片 2

夹框架调用Web API接口的详细过程,可以通过《Web
API应用架构在Winform混合框架中的利用(3)–Winfrom界面调用WebAPI的长河分解》、《Web
API应用架构在Winform混合框架中的行使(1)》、《Web
API接口设计经验总结》进行问询。

好家伙是流量监控

流量监控,又得知晓也平种植流量整形,是一个电脑网络的网络交通管理技术,从而延缓部分还是富有数据包,使之符人们所欲的网络交通规则,速率限制的中同样种重要形式。

网络流量控制是为此来优化还是包性能,改善延迟,和/或追加某些类型的多寡包延迟满足某些原则下之可用带富。如果有一个环趋于饱和点,网络延迟或大幅上升。因此,网络流量控制好采取为防止这种情景发生,并维持延迟性检查。

网络流量控制提供了平等种手段来控制在指定时间外(带富限制),被发送到网络中之数据量,或者是最为老速率的数流量发送。这种控制好实现之路线有成千上万,但是普通情况下,网络流量控制总是用拖延发包来落实的,一般采取在网络边缘,以决定上网络的流量,但也不过径直行使叫数据源(例如,计算机要网卡),或是网络被的一个要素。

2、Web API的接口访问令牌的处理

是因为我们要对接口访问的身价展开把关,因此一般要求我们的接口都蕴含一个token参数,用来针对用户位置展开辨认,如下所示是Web
API层的MVC控制器的接口定义。

        [HttpGet]
        public UserInfo GetUserByName(string userName, string token)
        {
            //令牌检查,不通过则抛出异常
            CheckResult checkResult = CheckToken(token);

            return BLLFactory<User>.Instance.GetUserByName(userName);
        }

倘我们以客户端需要调用这个接口,那么就需传入这个token参数,也就是说这个token令牌需要以调用任何接口前获得,这样才能够啊咱后面的接口调用做好准备。

倘若这token的起是老大重大的,需要从严颁发,因此待针对得这token的法的参数进行签约校验,如下面代码是WebAPI接口对生token的拍卖。

        /// <summary>
        /// 注册用户获取访问令牌接口
        /// </summary>
        /// <param name="username">用户登录名称</param>
        /// <param name="password">用户密码</param>
        /// <param name="signature">加密签名字符串</param>
        /// <param name="timestamp">时间戳</param>
        /// <param name="nonce">随机数</param>
        /// <param name="appid">应用接入ID</param>
        [HttpGet]
        public TokenResult GetAccessToken(string username, string password, string signature, string timestamp, string nonce, string appid)

也尽管是索要传入用户称、密码、加密签名、时间穿、随机数、应用接入ID等信息,从而构建出一个做客令牌,通过用户称、密码、加密签名校验等办法,可以实现对访令牌(token)的严格颁发处理。

于客户端调用所有Web API接口前,我们要事先经过地方的Web
API接口,获取到拖欠用户之顾令牌,为了方便,我们得以于客户端封装一个函数,通过这个函数获取到对应之走访令牌,然后拿她存储于缓存中,方便各个模块的接口访问处理。

    /// <summary>
    /// 用户获取令牌的辅助类
    /// </summary>
    public class AccessTokenHelper
    {
        private const string APPID = "APPID";//应用ID,由系统管理员分配
        private const string APPSECRET = "APPSECRET";//应用秘钥,,由系统管理员分配
        private const string DEFAULT_API_URL = "http://localhost:9001/api/Auth/GetAccessToken";//默认调试的Web API获取授权地址

        /// <summary>
        /// 设置签名参数。
        /// 由于Web API大多数的接口,都需要验证用户身份的访问令牌(accesstoken),因此用户在登陆的时候,需要使用这个步骤去获取令牌信息,然后在继续后续的接口操作。
        /// 该接口用到的应用ID、应用秘钥等参数,由系统管理员统一分配。
        /// </summary>
        public static bool GetAccessToken(string username, string password)
        {
            bool result = false;

            //配置使用Web API模式,需要构建登陆token才能访问
            AppConfig config = new AppConfig();
            string callerType = config.AppConfigGet("CallerType");
            string apiUrl = config.AppConfigGet("AuthApiUrl");
            apiUrl = string.IsNullOrEmpty(apiUrl) ? DEFAULT_API_URL : apiUrl;

            if (callerType.Equals("api", StringComparison.OrdinalIgnoreCase))
            {
                //使用API方式,需要在缓存里面设置特殊的信息
                var url = apiUrl + SignatureHelper.GetSignatureUrl(APPID, APPSECRET);
                url += string.Format("&username={0}&password={1}", username, password);

                TokenResult tokenResult = JsonHelper<TokenResult>.ConvertJson(url);
                result = !string.IsNullOrEmpty(tokenResult.access_token);

                if (tokenResult == null)
                {
                    var message = "获取授权信息出错,请检查地址是否正确!";
                    MessageDxUtil.ShowError(message);
                }

                var SignatureInfo = new SignatureInfo()
                {
                    appid = APPID,
                    appsecret = APPSECRET,
                    token = (tokenResult != null) ? tokenResult.access_token : null
                };
                Cache.Instance.Add("SignatureInfo", SignatureInfo);
            }

            return result;
        }

起矣这个帮忙方法,我们得以当程序启动后,用户进行身份登录的时段,先调用这个方法来取得令牌。

                string ip = NetworkUtil.GetLocalIP();
                string macAddr = HardwareInfoHelper.GetMacAddress();
                string loginName = this.txtLoginName.Text.Trim();
                string password = this.txtPassword.Text;

                //如果无法获取访问令牌,则返回
                bool hasGotToken = AccessTokenHelper.GetAccessToken(loginName, password);
                if (!hasGotToken)
                {
                    return;
                }

 

刚才自己提到了Web
API层的MVC控制器的接口定义,默认后面一般都有一个token参数,如下代码所示

        [HttpGet]
        public UserInfo GetUserByName(string userName, string token)
        {
            //令牌检查,不通过则抛出异常
            CheckResult checkResult = CheckToken(token);

            return BLLFactory<User>.Instance.GetUserByName(userName);
        }

假若我们为有利于客户端调用,一般以客户端调用Web
API的时节进行简化了瞬间,把token参数将掉,它的价由缓存中提取。如客户端调用的包裹代码如下所示。

        public UserInfo GetUserByName(string userName)
        {
            var action = "GetUserByName";
            string url = GetTokenUrl(action) + string.Format("&userName={0}", userName);

            UserInfo result = JsonHelper<UserInfo>.ConvertJson(url);
            return result;
        }

内GetTokenUrl就是我们根据token和办法名称,构建一个接连字符串,函数实现如下所示。

        /// <summary>
        /// 获取单纯包含token参数的连接
        /// </summary>
        /// <param name="action">控制器方法名称</param>
        /// <returns></returns>
        protected string GetTokenUrl(string action)
        {
            string url = "";
            if (this.SignatureInfo != null)
            {
                var append = string.Format("?token={0}", SignatureInfo.token);

                string baseUrl = GetBaseUrl();
                url = CombindUrl(baseUrl, action + append);//组合为完整的访问地址
            }
            else
            {
                throw new ArgumentNullException("没有在缓存里面设置SignatureInfo签名信息");
            }
            return url;
        }

诸如此类结尾我们得收获接近下面的连日地址:

http://localhost:27206/api/Account/GetAccountTypeList?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIxIiwiaWF0IjoxNDYzNTU3OTAzLCJqdGkiOiI3OGMyOGRhNC01ZjRjLTQxYzItOThkNC1lYmFkZTM3YjA4NjUiLCJuYW1lIjoiYWRtaW4iLCJjaGFubmVsIjoiMCIsInNoYXJlZGtleSI6IjEyMzRhYmNkIn0.DysdbGx70xuIxXBz3G3x3MkGh9ZxL2zF9Fzu8FGVS0w

出矣这个令牌组装好的URL,我们得针对访结果的JSON字符串进行解析,把它们解析为相应的数额就足以了。

当,在实质上的Web API接口开发过程中,我们尚可以行使Web
API工具进行接口调试,如下所示。

下的1-5的标识就是取得token所急需之签约数据,当然连接还蕴含几只账号认证所要的消息了,如账号密码、所在店铺等信息。

图片 3

自我们啊可动用浏览器进行测试获取Token的音讯,只是没有那么方便而已。

图片 4

 

流量监控限流算法

限流算法主要也:漏桶、令牌桶、计数器

漏桶

一个稳定容量的漏桶,按照常量固定速率流出水滴。

图片 5 

 

令牌桶

俾牌桶算法是一个存放固定容量令牌的桶,按照固定速率往桶里补充加令牌。

图片 6 

计数器

有时候我们还动用计数器来进行限流,主要为此来限制总并发数,比如数据库连接池、线程池、秒杀的并发数;只要全局总请求数或者自然时间段的总请求数设定的阀值则开展限流,是简简单单粗暴的终究数量限流,而未是平均速率限流。

限流措施

  • 限总并发数(比如数据库连接池、线程池)
  • 克瞬时并发数(如nginx的limit_conn模块,用来界定瞬时并发连接数)
  • 限时间窗口外之平分速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率)
  • 限定远程接口调用速率
  • 限MQ的花速率。
  • 可因网络连接数、网络流量、CPU或内存负载等来限流

 

 

行业

以下针对为国内比较大型的互联网公司对被流量监控架构方面的音收集

阿里

从未找到相关的艺资料,只是找到2016年享受的
“阿里管控系统靠什么扛住世界最可怜局面之流量洪峰?”的篇章,文章被涉及了那个殊状况下的算法和限流框架。

用户洪峰

设想的素是:

a) 允许看的速率

b) 系统接受的最为深洪峰

c) 洪峰爆发的间隔时间

处理方式: 令牌桶限流

扭曲调洪峰

除此之外0点0瓜分的这种流量洪峰,还有网里面的回调引起的洪流。想象一下如此的面貌,物流体系以处理发货信息,会隔一段时间调用交易系统来博取交易信息。为了提高效率,它每次批量询问交易系统的多少。这样,对交易系统也带来了流量之碰撞。如果对这种回调不加以限定,那么可能交易系统忙于处理这种回调洪峰,对用户洪峰会见疏于处理。

对这种洪峰,有三种特性:

a) 有距离频率

b) 每次调用计量十分

c) 允许有延期

处理方式:漏桶算法

限流框架分为:监控模块、决策模块、规则改变模块、限流模块。

图片 7 

 

腾讯

腾讯采用同样栽轻量级流控方案,方案如下:

1、计数器的key能“计时“

首先选择用ckv作为计数器存储,相比redis开发会重熟悉,同时保障也又易于,当然该方案吧可挑选redis作为计数器存储。

优势:方案用简易的道以全局流控服务做成原子化(计数和计时原子化),开发门槛低。

2、请求统计用拉取的方式替换上报

对要的统计方法,一般全量上报不可行,所有工作的请求量至少1:1汇报到ckv,ckv的容量和凡独问题,单key也便于成为热门。定时要定量批量反映,都心有余而力不足担保实时流控,特别是请求量大之下,流控延迟的题目会叫放。

优势:方案减ckv的访问量,同时保证流控的准头。

3、部署不欲agent

为举行更轻量的方案,我们考虑agent的必要性,分析发现,agent要形成的效用比较简略,主要功效托管到事情流控api。

优势:方案免采用agent的方式,部署维护还简便。

4、全局和单机流控同时启用

方案对容灾做了充分的设想,主要解决办法是大局与单机流控同时启用,即因ckv的大局流控和冲单机共享内存的单机流控都又工作。

优势:方案来甚好之容灾能力,容灾方式简单可行。

5、解决ckv性能瓶颈,流控性能上百万/s

出于用ckv的incr以及配额拉取的实现方式,全局流控接入服务要的能力得到基金增高。

时方案单独申请了一如既往片ckv,容量为6G,使用incr的措施,压测性能达到9w+/s。

对业务空接口(Appplatform框架)做流控压测,使用30宝v6虚拟机,单机50过程,压测性能及50w+/s。

单接口50w/s的呼吁的服务接通,同样为能够满足多接口总体服务请求量50w+/s的全局流控需求。

上述的压测瓶颈主要是Appplatform框架的特性原因,由于拉取配额值是因流控阈值设定(一般>10),50w+的请求量只有不至5w的ckv访问量,ckv没到瓶颈。

优势:方案以同样的资源(单独一块6G的ckv),能满足工作的请求量更胜,性能及百万/s。

6、支持扩容和动态流控升级

支持平行扩展流控能力,一仿照全局流控部署会满足流控的劳务请求量是齐百万/s,更甚的服务请求量需要配备多套全局流控。

支持提升到动态流控能力,ckv写入的流控阈值是经定时管理器完成,目前政工已开了健康度上报,定时管理器只待对接健康度数据,分析接口时呼吁情况,动态调整流控阈值即可达成动态流控能力。

优势:方案总体简单轻量,扩容和提升还异常易。

最主要流程图

图片 8 

 

京东

京东10亿调用量的高可用网关系统所提到的技术栈:

接入层 Nginx+lua 技术。

NIO+Serviet3 异步技术。

分别技术。

降限流。

熔断技术。

缓存,哪些地方该加缓存,哪些地方可以直接读库。

异构数据。

快捷砸。

督察统计,这是一切大可用网关系统里分外关键之一样局部。

小米

小米抢购限流峰值系统针对为小米商城秒杀抢购的实现与技术架构

大秒系统的架构设计

图片 9 

 

大秒系统重点是因为如下几个模块组合

限流集群 HTTP 服务放号策略集群
Middle 服务监控数据主导 Dcacenter监控管理体系 Master准实时防刷模块
antiblack基础存储和日志队列服务: Redis 集群、Kafka 集群等

全方位大秒体系受到大秒前端模块
(HTTP/middle/antiblack) 和监督数据核心以 golang
开发,大秒监控管理体系使用 Python + golang 开发。

大秒的前端架构设计

大秒前端的架构设计从三独网进行

限流集群 HTTP 服务

政策集群 Middle 服务

准实时反作弊 antiblack 服务

图片 10 

 

当当

依据SOA架构理念,降低系统耦合性,接口定义清晰明确,保证独立子系统的健壮性高,降低故障过系统扩散风险,从而以伸缩性的困难逐步分解至各个系统。

针对系进行独家,集中力量,突出重点系统。当当网从卖场及交易流程都属一级系统,这有些系统直接涉及用户体验与订单量。在系稳定与可靠性等指标达标,设计标准高于后台系统。

先考虑用异步处理代替同步处理,做好系统很的降方案,保证一定量的通关服务。

图片 11 

 

 

 

 

方案

经资料的采集,参考各大互联网公司的流量监控平台的架构搭建方案,大概了解涉及的系模块组成、限流算法、限流措施与公理。

归结各方资料整理得出简要的流量监控方案,流量监控可以分成多单网结合来成功该任务,这个平台要的片是:流量上报、限流、策略、调度。

流量上报

首要用于收集系统的伸手数据、状态与系运行状况。有矣这些运行数据,才能够对外要对内进行决策处理;

1、监控内容

1)对外和对外

对外用户要

对内各个系统之间的回调请求

2)上报数据格式标准化

上报数制定正规的

3)数据质量

4)实时和延时汇报

5)硬件监控,如服务器的CPU、内存、网卡

6)心跳监控,时刻了解各个一个机的运作状态

7)业务层监控,涉及JVM,Nginx的连接数

2、监控措施

1)、采用开源与shell脚本搭建监控平台

2)、自行研发监控平台

 

限流 

重中之重是依据流量上报的数量整合政策、调度来
进行对超预想请求的处理方式,比如限流、排队等方法;

依据不同场景下不同之限流算法,可以借鉴阿里针对于用户访问、物流、交易的处理方式。

1)用户访问:采用让牌桶方式;

2)物流、交易:采用漏桶方式,平滑削峰处理;

3)购物车:采用分块网格化,单元处理

策略

第一是通过提前设置的系、业务场景参数,来用于决定什么状况用啊限流措施;相对的风险的答复,也是策略的显要的处在;在倒展开时,根据监察上报的流量数据,动态灵活的调整政策也是怪关键之;通过整理的材料提成一下方针方案:

1)水平扩展

本着不同服务器的压力进行增减服务器个数以落实服务之压力负载均衡,这样的话对于系刚刚开始的紧缩性设计要求比较高,能够非常灵活的长机器,来应本着流量的别。

2)系统分组

系服务之事情不同,有先级赛之,有先级低的,那就算于不同之作业调用提前分组好的机,这样的话在关键时刻,可以保证中心工作。

3)业务降级

以一个用户请求,涉及到几近个逻辑处理,其中多可以无底,可以于高并发的状下,可以透过开关设置,来针对不重要逻辑下进行关闭其要,以提升了网的主业务能力。

4)开关设置

于各一个网业务要,都增减相应的开关设置,可以实时应本着高并作情况下,根据气象实现动态调度的打算。

 

调度

提供给管理者相应的调度数据,实时呈现系统运作状态,并于首长下达仲裁指令后高速实施策略;如何来实现大概的方案如下:

1、建立基本数量可视化平台

2、策略规则可动态配置

3、各个业务线开关集中管理

4、自动化的脚本执行

5、运维服务的动态化管理

6、命令执行之散发协议和齐管理

总结

流量监控也电商平台供快速稳定的运转环境之基本,它是无时不刻的监察所有阳台的周转状态、并也官员提供实时数据以供参考;流量监控平台被的限流只是同种保护体制,如何承接高并发、大流量之用户请求,还是要同另平台合作,以达到让用户最之用户体验。

 

 

 

 

参照自文章

腾讯轻量级全局流控方案详解

http://wetest.qq.com/lab/view/320.html?from=content\_toutiao&hmsr=toutiao.io&utm\_medium=toutiao.io&utm\_source=toutiao.io

当当网系统分级与海量信息动态发布执行

http://www.csdn.net/article/2014-11-07/2822541

小米抢购限流峰值系统「大秒」架构解密

https://mp.weixin.qq.com/s?\_\_biz=MzAwMDU1MTE1OQ==&mid=402182304&idx=1&sn=1bd68d72e6676ff782e92b0df8b07d35&scene=1&srcid=12045k1zDgO7DLlMLwimBKjC&from=groupmessage&isappinstalled=0\#wechat\_redirect

阿里管控系统靠什么扛住世界最要命范围之流量洪峰?

http://jm.taobao.org/2016/05/19/how-to-withstand-the-world-s-largest-traffic/?hmsr=toutiao.io&utm\_medium=toutiao.io&utm\_source=toutiao.io

发表评论

电子邮件地址不会被公开。 必填项已用*标注