排队系统设计思考

常用限流处理的几种方式:

1.通过限制单位时间段内调用量来限流

2.通过限制系统的并发调用程度来限流

3.使用漏桶(Leaky Bucket)算法来进行限流

4.使用令牌桶(Token Bucket)算法来进行限流

 

1通过限制单位时间段内调用量来限流:

通过限制某个服务的单位时间内的调用量来进行限流。从字面上,确实很容易理解,我们需要做的就是通过一个计数器统计单位时间段某个服务的访问量,如果超过了我们设定的阈值,则该单位时间段内则不允许继续访问、或者把接下来的请求放入队列中等待到下一个单位时间段继续访问。这里,计数器在需要在进入下一个单位时间段时先清零

对于限制单位时间段内调用量的这种限流方式,实现简单,适用于大多数场景,如果阈值可以通过服务端来动态配置,甚至可以当做业务开关来使用,但也有一定的局限性,因为我们的阈值是通过分析单位时间段内调用量来设置的,如果它在单位时间段的前几秒就被流量突刺消耗完了,将导致该时间段内剩余的时间内该服务“拒绝服务”,可以将这种现象称为“突刺消耗”

2通过限制系统的并发调用程度来限流:

通过严格限制某服务的并发访问程度,其实也就限制了该服务单位时间段内的访问量

并发的阈值设置成多少比较合适?比如限制服务的并发访问数是100,而服务处理的平均耗时是10毫秒,那么1分钟内,该服务平均能提供( 100 / 10 ) * 60 * 100 = 6,000 次

通过线上业务的监控数据来逐步对并发阈值进行调优,只要肯花时间,我们总能找到一个即能保证一定服务质量又能保证一定服务吞吐量的合理并发阈值

3通过漏桶算法来进行限流:

漏桶算法是网络中流量整形的常用算法之一,它有点像我们生活中用到的漏斗,液体倒进去以后,总是从下端的小口中以固定速率流出,漏桶算法也类似,不管突然流量有多大,漏桶都保证了流量的常速率输出

漏桶算法其实是悲观的,因为它严格限制了系统的吞吐量

4.令牌桶算法限流

令牌桶算法从某种程度上来说是漏桶算法的一种改进,漏桶算法能够强行限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许某种程度的突发调用

在令牌桶算法中,桶中会有一定数量的令牌,每次请求调用需要去桶中拿取一个令牌,拿到令牌后才有资格执行请求调用,否则只能等待能拿到足够的令牌数

令牌桶算法的精髓就在于“拿令牌”和“放令牌”的方式

我们的做法

技术实现目的 :  单位时间内控制一定数量的用户进入活动页面

实现原理 :    使用漏桶算法,每次用户进去活动页面时,检查限流缓存计数值是否存在,如果存在,允许进入,并且计数递减一位;

当计数器归零后,表示该单位时间内可参与人数已满,后续用户进入排队系统。

排队静态页面按照固定秒数时间后,自动会跳到限流控制页面,重新查询缓存计数值

注意:

1、排队页面纯HTML处理,可以容纳更多的请求数

2、容错页面做成和排队页面差不多的纯静态脚本,让用户无感知

3、后台需要设置合理的单位时间并发数限制

硬货来啦:

$redis = getRedis(); // 获取自己的redis资源

//整理正确的缓存键名,带有时间(测试时,定位到分钟,实际使用时,可以限制到秒)

$cacheKey = $config[‘自己的cacheKey‘].‘_‘. date(‘Y-m-d-H:i:s‘, time());

//如果不存在缓存,计数器初始化

if(!$redis->exists($cacheKey)){

  $redis->set($cacheKey, 预置限流阈值);

  $redis->expire($cacheKey, 100);//100秒后销毁缓存

}

$counts = (int)$redis->get($cacheKey);

if($counts <= 0){

  //当计数器统计数小于等于0时,用户进入排队系统

  header(‘HTTP/1.1 404 Not Found‘);

  $redirect_url = 自己的静态页;

}else{

  //可以进入活动

  $redirect_url = 自己的活动页;

  //计数递减

  if($counts > 0){

    $redis->decr($cacheKey);

  }

}

header("location:$redirect_url");

时间: 2024-08-10 23:30:34

排队系统设计思考的相关文章

应用系统设计思考

基于及时反应的应用系统是软件系统近些年来的一个发展趋势(信息的价值随时间变久而价值减少),从设计上需符合Reactive宣言四大部分 1. 对事件反应 2. 对资源载入反应 3. 对失败反应 4. 对用户訪问反应 通过宣言能够总结反思过去软件设计的一些教训,比方: 1. 在分布式系统中把状态做集中式地存储.(可用性.分区性受到挑战) 2. 把分布式系统中的一致性问题只交给存储部分处理,如数据库.(应用的一致性对可用性.可扩展性能影响非常大) 3. 应用模块之间信息传递强耦合 .(函数同步调用)

系统设计思考

IT系统设计从早期的Jsp/Servlet类应用为主,到今天的微服务.ServerLess.Docker.Paas.CI&CD.Devops.目标:高效研发.弹性扩展.高效运维.手段:Divide&Conquer (分层,解耦合). 协议层从早期的HTTp+XML&SOAP 到今天的Restful (Spring)& 轻量级RPC (Dubbo, gRpc),协议的效率和内容自描述性方面得到了很大提高: 功能分离:缓存和消息队列得到了广泛的应用. 数据存储:各类Nosql(

NVMe闪存存储系统设计挑战

随着闪存容量的不断提升,价格不断下降,应用的不断增多,推动闪存存储系统替代传统磁盘系统.和传统磁盘系统相比,由于存储介质发生了变化,存储系统设计思考的问题会发生重大变化.这种变化直接体现在存储系统软件架构的改变,即所谓的存储软件栈重构.对于SATA/SAS SSD而言,盘本身的性能受限于接口技术.和磁盘相比,性能有了巨大的提升,但是这种量变还不至于对传统软件栈带来致命打击.对于NVMe SSD而言,闪存性能不再局限于软硬件接口,性能可以充分得以释放,和SATA/SAS SSD相比,具有10倍以上

PHP并发、超卖处理

做电商网站,经常会有各种秒杀和热门商品,所以高并发的处理一直是电商最重要的事情.这里记录下当初自己是如何处理的 写在前面: 1.本文设计到的并发处理均是针对纵向,不针对横向扩展,即只设计从PHP层面到数据库层面的处理,不涉及多台服务器,集群.大带宽等的横向设计. 2.本文中涉及到的高并发并不是淘宝京东等几百万几千万等的高并发,仅仅只是普通最多上万的并发处理 3.本文不对悲观锁乐观锁做设计 问题: 普通电商中的秒杀中的并发问题,超卖问题 实例:商品数量为100,秒杀人数为10000,整点开始秒杀

由 12306.cn 谈谈高并发+高负载网站性能技术

12306.cn 网站挂了,被全国人民骂了.我这两天也在思考这个事,我想以这个事来粗略地和大家讨论一下网站性能的问题.因为仓促,而且完全基于本人有限的经验和了解, 所以,如果有什么问题还请大家一起讨论和指正.(这又是一篇长文,只讨论性能问题,不讨论那些用户界面.用户体验.或是是否把支付和购票下单环节分开的功 能性的东西) 甲.认识业务的特殊性 任何技术都离不开业务需求,所以,要说明性能问题,首先还是想先说说业务问题. 其一,有人可能把这个东西和扣扣或是网游相比.但我觉得这两者是不一样的,网游和扣

关于大型系统设计原则的思考

以下以公共信息平台作为大型系统的典型代表.   在进行设计原则的讨论之前,首先要明确一个事实: 在一个软件项目团队中,在讨论项目设计的时候,每个人都会有自己的设计理念.这些设计理念一般都跟每个人的成长经历有关系.跟用户密切接触的人员,比如:产品经理,售前经理等,在设计一个系统的时候更考虑整个系统如何设计才能更加方便用户,更加贴合用户的业务流程,才能解决用户面临的问题.而研发体系的人员,比如:系统架构师,开发经理,一般更加侧重于系统架构如何高效运行,如何减少代码工作量,如何减少系统的复杂度. 因此

交易中台系统设计与思考

前言 将近两年的时间,我一直在某企业做中台系统的研发,最近可能这段工作经历可能要结束.本文也算是这段经历的回顾与反思. 系统架构 在这里主要想说的是服务接入层,在我们目前的系统架构中并没有服务接入层.但是在我日后的反思中,觉得服务接入层的存在还是很有必要的. 服务接入层的作用 防腐层作用.因为业务中台要服务于企业内多条业务线,日常开发中应对不同的业务需求,我们常常在底层服务中的添加许多转换.判读逻辑,而引入了服务接入层我们可以把这些代码放到服务接入层. 业务隔离.企业内每条业务线都有其业务的独特

铁道部新客票系统设计

如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 几天正好看到一条新闻 铁道部:新客票系统2015年建成 ,正好最近想整理和总结一下这几年的工作中的收获,正好可以借这个机会,尝试设计一下铁路客票系统,把自己所学全部用到这个系统中去,顺便也希望各位猿们拍砖,一起探讨一下设计,技术吗,讨论讨论总是有点收获的,总比一个人在那里看书好. 非功能性要求 废话不说,这里先脱离系统的整体架构,后续在不断完善整体架构,这里首先讨论的是数据库层面的设计,因为

关于大型网站技术演进的思考--存储的瓶颈(转)

(一)第一部分 前不久公司请来了位互联网界的技术大牛跟我们做了一次大型网站架构的培训,两天12个小时信息量非常大,知识的广度和难度也非常大,培训完后我很难完整理出全部听到的知识,今天我换了个思路是回味这次培训,这个思路就是通过本人目前的经验和技术水平来思考下大型网站技术演进的过程. 首先我们要思考一个问题,什么样的网站才是大型网站,从网站的技术指标角度考虑这个问题人们很容易犯一个毛病就是认为网站的访问量是衡量的指标,懂点行的人也许会认为是网站在单位时间里的并发量的大小来作为指标,如果按这些标准那