抽奖系统的流量削峰方案

如果观看抽奖或秒杀系统的请求监控曲线,你就会发现这类系统在活动开放的时间段内会出现一个波峰,而在活动未开放时,系统的请求量、机器负载一般都是比较平稳的。为了节省机器资源,我们不可能时时都提供最大化的资源能力来支持短时间的高峰请求。所以需要使用一些技术手段,来削弱瞬时的请求高峰,让系统吞吐量在高峰请求下保持可控。

​​610439-20181111201018989-1502792636.png

最近在做一个小型的抽奖系统,用户中奖之后需要调用转账接口进行虚拟金的转账。转账接口有频控的逻辑,因此不能把抽奖瞬间的大量请求都发往转账系统,必须对请求进行削峰。削峰的方式有很多种,下面就来简单地聊一下。

请求排队

削峰最常用的一种方式是请求排队。瞬时的请求量太大,那么就把这些请求先排队存起来,再依据系统所能提供的消费能力按需消费。在量小的时候,抽奖与发货这两个动作可以是同步的(如下左图),这是一种紧耦合系统,SVR B的处理能力必须跟得上SVR A的处理能力。当SVR A 与SVR B 存在处理能力差异时,可以引入消息队列,把对服务的同步调用转化成对队列的异步消费。

​​610439-20181111201032138-1923361536.png

可以用来作为队列的工具有很多,典型的如Message Queue消息队列,也可以利用数据库Mysql或是Redis来实现分布式队列,跟进业务场景来自行进行选择。例如,我在实现抽奖系统的时候,使用的是Mysql,原因是SVR A已经把用户的抽奖信息落地到的数据库,那么SVR B就可以利用Mysql作为一个队列,来达到按能力消费的需求。

Mysql

用户中奖的时候,SVR A 会将用户中奖信息写到数据库中。SVR B按照自己的消费能力,从数据库中把数据select出来执行转账的逻辑。数据库表中的每一行记录,都可以看作是一个等待被消费的消息。如何保证消息按序(正序或倒序)消费?可以利用update_time 来标记消息入队时间,设定update_time字段:

update_time timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP  DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间'

必须使用一个字段来标记某行记录的消费状态。消费过的消息不必再select出来处理。另外,在有多个消息消费者的时候(比如有多个线程来消费数据库中的这些中奖信息时),需要保证消息不会重复被消费。可以使用二段式提交的方式来保证。以字段present_flag来表示消费状态,present_flag有三个取值:
0:中奖,未转账
1:一阶段提交(即准备转账)
2:二阶段提交(转账完成)

对于SVR B ,需要进行如下的操作:
步骤一:将数据库中present_flag 为0 的记录按序捞取出来,这里可以批量拉取,比如一次拉取100条记录
步骤二:按序处理每笔中奖记录的转账逻辑,调用转账接口之前,将present_flag设置为1,sql中的条件是present_flag为0;
步骤三:执行转账逻辑
步骤四:转账成功,将present_flag设置为2,sql中条件是present_flag为1。

这样即使同一行记录被多个消费者拉取出来,也能保证只有一个能够成功执行步骤三。转账失败(消费失败)
的记录如何处理?可以使用一个定时脚本将present_flag为1的update成present_flag为0,再次进行消费。

通过这种异步消费的方式,来保证中奖记录慢慢被消费完。这种方式在极端的情况下,比如刚刚执行完步骤三
机器就挂掉了,那么可能会出现重复消费的情况。根据业务对重复消费的容忍度来进行选择。

Redis

Redis的list数据结构提供了BLPOP和BRPOP,表示列表的阻塞式弹出。BLPOP的BRPOP的区别仅仅在取元素的位置不同。使用方式为:

BRPOP key timeout

当给定的列表内没有任何元素可供弹出的时候,连接将被阻塞,直到等待超时或发现可弹出的元素为止,超时参数 timeout 接受一个以秒为单位的数字作为值。超时参数设为 0 表示阻塞时间可以无限期延长。相同的key可以被多个客户端同时阻塞,不同的客户端会被放进一个队列中,按照【先阻塞先服务】的顺序为key执行BRPOP 命令。利用这个特点,可以来实现一个轻量级的消息队列服务。

消息队列组件

例如kafka、ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等消息队列,本就是为异步化消息消费、应用解耦、流量消费而设计。业务根据需求加以选型即可。

转载于:https://www.cnblogs.com/QG-whz/p/9943282.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SVM支持向量机-手写笔记(超详细:拉格朗日乘数法、KKT条件、对偶性质、最优化、合页损失、核函数...)

SVM支持向量机-手写笔记 作者:某丁 日期:2021.05.21 写完了,发现想要真正理解SVM还需要继续深入学习,以上所写只不过是冰山一角,我的管中窥豹而已。 参考 [1] 一文搞懂支持向量机(SVM)算法 https://zhuanlan.zhihu.co…

扛鼎之作!Twitter 图机器学习大牛发表160页论文:以几何学视角统一深度学习

来源:AI科技评论作者:Michael Bronstein编译:Mr Bear、青暮导语:近日,帝国理工学院教授、Twitter 首席科学家 Michael Bronstein 发表了一篇长达160页的论文(或者说书籍),试图从对称…

情感数据对LSTM股票预测模型的影响研究

情感数据对LSTM股票预测模型的影响研究 作者:丁纪翔 发布时间:06/28/2021 摘要:探究了情感结构化特征数据在LSTM股票预测模型中的影响。利用Pandas对所给数据进行预处理(数据载入、清洗与准备、规整、时间序列处理、数据聚合等&am…

AI芯片发展现状及前景分析

来源:专知1. AI芯片定义及技术架构1.1 AI芯片定义广义上所有面向AI应用的芯片都可以称为AI芯片。目前一般认为是针对AI算法做了特殊加速设计的芯片。现阶段,这些人工智能算法一般以深度学习算法为主,也可以包括其他浅层机器学习算法[7-8]。1.…

Tableau数据分析:NC Retail Order Data(英)Data Science Program Lab#1(GTI)

Tableau数据分析:NC Retail Order Data(英) NCSU 2021 Summer Online Data Science Author:©Sylvan Ding

解读:欧盟委员会2021年《人工智能法》提案

来源:图灵人工智能文:吴沈括(北京师范大学网络法治国际中心执行主任、博导中国互联网协会研究中心副主任)文:胡然(北京师范大学网络法治国际中心研究助理)2021年4月21日,为了将欧洲变…

《2021人脸识别行业白皮书》发布 拥挤安防还有多少空间?

来源:帮尼资讯图片来源:网络人脸识别在内的人工智能技术需求较大,这对传统安防产业带来了巨大的冲击和变革。近日,智慧芽联合罗思咨询,共同发布《2021人脸识别行业白皮书》。白皮书从人脸识别行业现状、企业聚焦和技术…

第一章 计算机系统概述 1.1 计算机发展史 [计算机组成原理笔记]

第一章 计算机系统概述 1.1 计算机发展史 本笔记参考书目: 计算机组成原理(第六版.立体化教材)白中英、戴志涛2021王道计算机组成原理视频公开课 本节重点: 计算机硬件的发展史 转载请注明文章来源! 什么是计算机系…

我国工业互联网 技术路线与发展趋势研究

来源:中国工业和信息化本文发表于《中国工业和信息化》杂志2021年4月刊总第33期作者:许雪荷 中国工业互联网研究院自2017年《国务院关于深化“互联网先进制造业”发展工业互联网的指导意见》发布以来,国家高度重视工业互联网创新发展&#…

【创新应用】小图像,大图景:AI彻底改变了显微镜技术

来源:智能研究院20 年前,计算机生物学家 Anne Carpenter 在读博士时第一次意识到她需要学习计算机编程。Carpenter 说:「在麻省理工学院和哈佛大学的博德研究所 (Broad Institute of MIT and Harvard in Cambridge) 管理实验室的时候。她记得…

历史上12篇最著名的博士论文欣赏

来源 : 学位与写作Ali Gajani在mrgreek网站分享了12篇著名学者的博士论文,分别是居里夫人的博士论文、香浓的博士论文、纳什的博士论文、德布罗意的博士论文、费曼的博士论文、爱因斯坦的博士论文、马克思的博士论文、韦伯的博士论文、萨特兰的博士论文、…

Exalogic硬件架构

1、硬件配置见如下图表。 组件名称满配半配1/4配1/8配Sun Rack II 12421111计算节点 X2-2、X3-2、X4-2、X5-2、X6-2301684存储设备 X2-2和X3-2: Dual controller Sun ZFS Storage 7320 appliance (60 TB) X4-2和X5-2: Oracle ZS3-ES storage appliance X6-2: Oracle ZS5–ES st…

AI领域五年引用量最高的10大论文:Adam登顶,AlphaGo、Transfromer上榜

来源:图灵人工智能编译:琰琰近五年来,AI学术论文的投稿量和接收量都在不断攀升,包括NeurIPS、AAAI、ACL,ICML、EMNLP等国际顶会。根据权威数据统计,NeurIPS论文收录量在2019年呈指数级增长,领先…

64 求1+2+3+...+n(发散思维能力 )

题目描述: 求123...n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 解题思路: 1)利用&&的短路特性 2) 利用sizeof特性,使用公式n(n1)/2 …

Cell Reports:黄梓芮等揭示大脑皮层中通往意识的“大门”

来源:小柯生命北京时间2021年5月4日晚23时,Cell Reports在线发表美国密歇根大学一项关于前脑岛在大脑网络切换和意识通达中关键门控作用的研究——“Anterior insula regulates brain network transitions that gate conscious access”。此研究由密歇根…

DeepMind强化学习新研究:更快的知识学习,更强的环境适应

来源:AI科技评论编译:Mr Bear校对:维克多DeepMind官方博客在一篇文章“Fast reinforcement learning through the composition of behaviours”中,针对强化学习中的“从头学习”问题给予了解决方案。文章中表示,人类处…

为什么AI无法解决一般智能问题?

来源:学术头条我们什么时候才能拥有在各方面能够模仿人脑的人工智能?专家们对这个问题意见不一。但大家都同意的是,目前的人工智能系统与人类的智力相去甚远。直接表现是:AI只在特定任务中表现优异,无法将其能力扩展到…

ADT操作实例

ps.1.put(rank,value) 把当前rank的元素的数值修改 2.get(rank)获取rank的元素 3.remove(value)把向量中value剔除掉 4.size()返回元素个数 5.disordered()检测向量的有序性,是否存在紧邻的逆序对,只要返回的数值不是0,说明它尚未构成有序的序…

群雄逐鹿,谁会赢得自动驾驶之战?

来源:AI前线作者 | Timothy B.Lee译者 | 王强策划 | 刘燕自动驾驶技术行业今天正处于一种奇怪的状态。过去多年来,整个行业已经在自动驾驶技术上投入了庞大的资金,其中许多公司都拥有了看起来跑得不错的自动驾驶汽车原型。但据我所知&#xf…