限流系统如何发现系统的热点

限流系统是对资源调用的控制组件,主要涵盖授权、限流、降级、调用统计等功能模块。限流系统有两个基础概念:资源和策略,对特定的资源采取不同的控制策略,起到保障应用稳定性的作用。限流系统提供了多个默认切入点覆盖了大部分使用场景,保证对应用的低侵入性;同时也支持硬编码或者自定义aop的方式来支持特定的使用需求。限流系统提供了全面的运行状态监控,实时监控资源的调用情况(qps、rt、限流降级等信息)。

如何利用限流系统的特性,来统计热点呢?在这里,我们主要介绍一下,限流系统是如何来判断热点的,它的工作原理是什么,它的性能如何;它目前已经在哪些场景里面使用。

1. 热点的特性

a) 海量的统计基数

可能的热点分为两种,一种是事前已知的(例如营销人员的已经整理出秒杀商品的列表),另外一种是突发的,不可以预计的(例如被刷单的商品,或者是黑马产品)。对于前面一种,只需要计算这些已知的列表即可,但是对于后者,由于基数是海量的,举个例子,如果有一个方法,它传入的参数是商品id, 这个商品的id以淘宝的规模来说,是上亿的。如果把所有的商品id都记录统计起来,再进行排序,统计出热点,这对于实时的工具来说,是不可行的。所以为了解决热点统计,我们必须找到一个好的数据结构,这个结构能够仅保存最常常被访问的一定数量商品id,并且可以控制结构的大小,统计量。这是非常重要的一个步骤。

b) 统计热点的单位时间的维度

这里有一个必须强调的概念: 单位时间而不是总访问量。 打个比方,一个商品,在一小时以内被访问了3600次,但是它很均匀的每秒被访问一次,那么这个商品可能在系统的承受范围之内,并会对系统带来损伤;而另外一个商品,它一小时被访问了60次,但都落在同一秒,那么这个商品可能就是一个热点商品。对于”单位时间”的定义,是决策一个参数是否成为热点的一个重要的因素;如果太粗,必然会带来毛刺,导致系统性能不平滑;如果太细,会给性能带来挑战。

c) 在分布式系统给统计带来的挑战

热点的统计范围可能是单机,也可能是集群。如何能快速的在集群中统计,并且让限流规则在单机上生效,是非常重要的。

2. 如何解决上述问题

2.1 首先,找到一个可行的数据结构

这个结构必须满足访问修改快速,并发性好,占用内存空间少,存储的个数大小可控制,并且可以驱逐访问量少的entry,从而可以达到实时统计热点的查询数字。

其实,业界有一个现成的好结构。它就是google团队用于guava里的ConcurrentLinkedHashMap(http://code.google.com/p/concurrentlinkedhashmap)。

它有下面几个特点:

2.1.a 支持并发。它是实现了ConcurrentMap接口的。基本上它的实现是遵循concurrentMap的思想的。这里就不多赘述。

2.1.b 它把我们普通concurrenthashmap的segments用一个额外的双链表维护起来,通过操作这个链表,里面的entry可以在O(1)的时间之类删除或者重新排序。当一个entry被访问,则被移动到表头;当这个map的容量超过预设,则移除位于链表尾的entry。这样就可以保证表头是最新被使用的entry,表尾是最近最少被使用的entry

2.1.c 从另外一个角度来说,可以把ConcurrentLinkedHashMap 分成两个view. 一个是同步的,一个是异步的。Hashtable对于调用方来说是同步的,链表对于调用方式不透明的,异步的。

 

2.1.d 性能和concurrenthashmap的比较, 肯定比concurrenthashmap差,但是属于可以忍受的范围。下面是官方给出的数据

综上所述,我们可以利用这个LRU concurrent map link,保证我们在单位时间内,仅保存有限数量访问量较高的key, 最近比较少访问的key,我们则可以认为它不是热点,当map的Size达到上限之后,清除这个key

2.2 统计单位时间的维度

现在我们来看第二个问题,如何统计单位时间的key的qps. 其实这个正是限流系统的拿手好戏,用动态滑动窗口平滑的统计qps.

简单的说,限流系统为每个簇点(可以简单的理解为需要统计的方法),做了一个滑动窗口。更具体的说,即限流系统把采样窗口长度设为2秒,这个采样窗口又被分割为20个格子。通过用一定的算法来统计这20个格子的平均滑动窗口累积平均值来进行决策。
为什么采用平均滑动窗口累计平均值是为了削平毛刺qps(在某个点突发的qps)对整体的影响。该公式如下:

更具体的说明在: http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average 可以查到。

说到这里,聪明的读者应该早就猜到了,限流系统通过把两个利器结合起来,即滑动窗口和google concurrent link hashmap,可以统计在固定的时间,最常常使用的参数的值。
限流系统数据结构如下所示:

具体的代码在: http://gitlab.alibaba-inc.com/middleware-asp/限流系统 欢迎大家来指正

2.3 如何解决集群的挑战

2.3.1 幸运的是,限流系统天生自带获取簇点qps的功能

使用过限流系统的人都会发现,8719这个端口是被限流系统占用了的。通过这个端口,我们可以用获取到簇点的qps统计信息。有了这个“后门”,我们就可以轻松快速的获取到qps的信息了

2.3.2 如何在大集群里汇总这些qps的信息

接下来要解决的问题就是,如何在上千台机器里面快速汇总这些信息。还好之前我们在做2.0.7的集群统计的时候,有了一定的经验。 这个算法后来也用在了预案分配巨大的url task中。简单的说,就是用一个队列来放任务,多个线程来执行任务,一个线程来merge取回的结果。通过使用这个方法,一个比较大的集群,例如buy等,2秒可以返回统计结果。

有了集群的总体汇总信息之后,我们再将这个信息利用diamond来推广到具体的机器上去。这样的延迟大概是2-3s左右。

3 总结以及限流系统性能报告:

简单的说,存放一个这样的结构,大概大小是8k. 它的默认参数是每个簇点的存放2s的滑动窗口,20个格子,每个格子最多可以保存200个参数,那么在最坏的情况下,这个结构的大小将会是8k+4000个参数大小。

吞吐量在我的日常机器上是29W,在生产机上应该会更好。

时间: 2024-08-17 15:00:51

限流系统如何发现系统的热点的相关文章

聊聊高并发系统之限流特技-1

在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流. 缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹:而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开:而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀.抢购).写服务(如评论.下单).频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流. 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达

高并发系统之限流特技:有了它,京东6.18如虎添翼!

在开发高并发系统时有三把利器用来保护系统:缓存.降级和限流.缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹:而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开:而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀.抢购).写服务(如评论.下单).频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流. 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到

基于Redis的限流系统的设计

基于Redis的限流系统的设计,主要会谈及限流系统中限流策略这个功能的设计:在实现方面,算法使用的是令牌桶算法来,访问Redis使用lua脚本. 1.概念 限流是对系统的出入流量进行控制,防止大流量出入,导致资源不足,系统不稳定. 限流系统是对资源访问的控制组件,控制主要的两个功能:限流策略和熔断策略,对于熔断策略,不同的系统有不同的熔断策略诉求,有的系统希望直接拒绝.有的系统希望排队等待.有的系统希望服务降级.有的系统会定制自己的熔断策略,很难一一列举,所以本文只针对限流策略这个功能做详细的设

聊聊高并发系统之限流特技-2

接入层限流 接入层通常指请求流量的入口,该层的主要目的有:负载均衡.非法请求过滤.请求聚合.缓存.降级.限流.A/B测试.服务质量监控等等,可以参考笔者写的<使用Nginx+Lua(OpenResty)开发高性能Web应用>. 对于Nginx接入层限流可以使用Nginx自带了两个模块:连接数限流模块ngx_http_limit_conn_module和漏桶算法实现的请求限流模块ngx_http_limit_req_module.还可以使用OpenResty提供的Lua限流模块lua-resty

【系统架构】如何解决热点数据更新问题

一 背景     某个业务线 商品开放开用户申请免费试用,当某个商品特别吸引人时,比如iPhone6 .肯定有一大波人为了少卖一个肾 疯狂去抢申请资格.有甚者利用机器人申请注册,于是简单的申请操作变成了秒杀行为. 大量请求同时更新数据库中的同一个商品的申请次数,update 操作给表加上行锁,导致后面的请求全部排队等待前面一个update完成,释放行锁后才能处理下一个请求.大量后来请求等待,占用了数据库的连接.一旦数据库连接数被占满,就会导致后来的全部请求因拿不到连接而超时,业务请求出现无法及时

搭建系统框架发现的三个Web.Config问题

web|问题 --------------------------------<特别声明,此文档是转载,黄勇BLOG的文章>-----------------------------------搭建系统框架发现的三个Web.Config问题 按照微软的Duwamish7搭建一个Web系统框架,虽然说是一个现成的框架在旁边,却还是遇到一些烦人的小问题,其中有好几个就是这个Web.Config搞的鬼!1.搭建好的系统框架运行出错,报什么不能正确读取ApplicationConfiguration配

笔记本电脑安装win8系统后发现磁盘只有C盘怎么办?

  笔记本电脑安装win8系统后发现磁盘只有C盘怎么办? 1.打开我的电脑,然后右击C盘,选择"切割分区"; 2.这时候就可以看到一个滑竿,直接往左滑动,就会出现盘符的名称; 3.选好分区之后,就单击确定,这时候就可以看到软件里面分号的新盘符; 4.记着就点击"提交",这样就可以了,软件之后会提示重启电脑; 5.系统重启之后就会进入类似DOS模式的环境,这时候需要做的就是一直等.具体的速度长短其实与Windows自检的时候差不多.等到完毕之后就会重启,进入系统之后就

XP系统下160WiFi无法开启热点怎么办

XP系统下160WiFi无法开启热点          小编先带大家了解下XP环境下建立共享的方法: XP下默认建立共享方法的原理是在无线网卡的属性里面有"无线网络配置",然后选择添加,输入SSID(账号),再去掉"自动勾选密钥"的勾选,然后输入2次密码,点击确定.接着再右键属性当前上网网卡属性,然后"高级",接着将Internet共享下面的勾选都选上,然后在家庭网络连接处选择刚才的无线网卡,最后确定. 这样整个XP下建立的步骤就完成了.这种连接

Win8.1系统通过手机连接WiFi热点会发生蓝屏怎么办

Win8.1系统通过手机连接WiFi热点会发生蓝屏的解决方法. 解决方法如下: 1.在"设备管理器"中找到无线网卡"属性"中"高级"下"802.11n模式"的值改为"已禁用"; 2.保存后重启网卡即可解决.