在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
众所周知,互联网分布式系统架构设计必须考虑高并发,高并发也是开发者常常会面临的一个技术难题。如何控制库存避免超卖?怎么实现线程间数据处理的同步?本文将以红包雨系统业务为例,为大家详细阐述业务痛点和系统设计的方法,帮助大家梳理解决问题的思路,构建系统思维的能力。
一、业务要求及痛点分析
红包雨项目属于抽奖类系统的一种,它要求在某段时间内随机派发奖品,用户抢红包参与活动。这个业务由管理后台、用户前台和开发平台构成。其中管理后台需要实现用户管理、奖品管理、活动管理、中奖统计等功能;用户前台用于注册登录、参与抽奖、个人中心查看中奖信息等。开发平台包含微服务架构体系、注册与服务发现Nacos、部署平台、接口管理Swagger等。
由于抽奖系统常常涉及到大批用户的点击涌入,怎样设计系统以达到高并发情况下的及时响应是本项目的重中之重。同时抽奖的奖品数量需要精确控制,不允许出现设置了5个奖品,最终6人中奖这种类似的问题。同时,在活动时间段内,管理员设置好的奖品如何投放?
红包何时出现?奖品什么时候可以被抽中?这些都涉及到投放策略的优化。
二、库存控制及核心流程
令牌桶算法可以把请求平均分散在时间段内,是使用较为广泛的限流算法。我们可以把令牌桶算法应用到红包雨业务案例中。这时候,令牌相当于奖品票据;令牌桶相当于奖品库存;正常业务相当于中奖;限流相当于未中奖。同时要注意,有多少个奖品,就生成多少个令牌(时间戳),未中奖返还令牌。假设活动时间间隔太短,奖品太多,极有可能产生的时间戳发生重复。为了解决这个问题,我们需要额外附加一个随机因子,将( 时间戳*1000+3位随机数)作为令牌,抽奖时将抽中的令牌除以1000来还原真实的时间戳。
最后,将拿出令牌、判断时间、放回令牌的操作下沉到Redis服务器端,利用Lua脚本避免出现插队导致的令牌顺序被打乱。通过这些操作和解决方案,相信可以避免打乱奖品令牌造成扎堆出现的问题。
三、发散思维
使用Lua脚本,将抽奖的逻辑从Java端移入Redis服务器端,作为一个整体函数暴露给Java调用,一方面实现中奖逻辑的原子性,另一方面减少了Java服务器与Redis服务器之间的通信次数,性能会得到提升。要实现活动随时暂停,可以新增一个接口,该接口修改Redis缓存中的活动状态。抽奖接口逻辑中增加暂停状态判断。如果是暂停,返回给前台以提示。要实现多种投放策路,可以修改令牌生成部分代码。按递增、递减、正态分布等多种函数生成时间戳。
高并发下的架构解决方案就讲解到这里了,关于红包雨案列的详细情况,尽在博学谷IT在线培训平台,欢迎大家来试听体验更多项目案例的讲解!
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java开发仓库管理系统设计应用有哪些意义?
Java开发仓库管理系统设计应用有哪些意义?仓库管理系统设计合理应用可以使仓库管理更加标准化、提高效率,节约成本、员工登录模块的实现;仓库管理系统实现、原材料管理模块、产品入库管理模块、产品出库管理模块的只能管理。
8442
2019-08-02 17:42:22
Java技术未来发展前景如何?
Java编程语言一直以来都是使用率最高的编程语言之一,由于Java具有安全性能高、可移植性、可拓展等特点,目前Java被国内外大型企业所推崇。对于Java技术未来发展前景,主要从从业者职业发展和发展领域、语言本身等几个方面来看。
5298
2019-11-19 18:25:05
如何学Java语言从入门到精通
如何学Java语言从入门到精通?学编程一定要动手,遇到bug自己去查找解决方法,在学习过程中遇到麻烦,除了学会查找资料以外还要大胆提问,在解决问题的过程中才能更快的提升编程能力。
5303
2019-11-22 11:33:44
Activity生命周期四种状态学习总结
随着Activiti的迅猛发展,很多人都开始学习Activiti的相关开发知识。相信了解过Activity生命周期的朋友都知道,其生命周期大致会有四种状态,即运行、暂停、停止和销毁。本文接下来将为大家归纳总结一下Activity生命周期的四种状态,并且为大家介绍一下Activie开发的相关学习课程,感兴趣的小伙伴赶紧看下去吧!
10507
2020-02-24 17:03:55
JDBC新手快速入门教程
在我们的日常生活中所使用的各种程序、网页都会把数据进行整理,然后按照一定的规则合理的展示给我们。那么,程序和数据库是通过什么进行数据交互的呢?答案是通过JDBC。JDBC是所有Java程序员必备的技能,对于初学Java的新手而言也是必须掌握的内容。下面我们一起进入JDBC小白快速入门教程吧!
5094
2020-08-13 12:14:13