在线客服
扫描二维码
下载博学谷APP
扫描二维码
关注博学谷微信公众号
众所周知,互联网分布式系统架构设计必须考虑高并发,高并发也是开发者常常会面临的一个技术难题。如何控制库存避免超卖?怎么实现线程间数据处理的同步?本文将以红包雨系统业务为例,为大家详细阐述业务痛点和系统设计的方法,帮助大家梳理解决问题的思路,构建系统思维的能力。

一、业务要求及痛点分析
红包雨项目属于抽奖类系统的一种,它要求在某段时间内随机派发奖品,用户抢红包参与活动。这个业务由管理后台、用户前台和开发平台构成。其中管理后台需要实现用户管理、奖品管理、活动管理、中奖统计等功能;用户前台用于注册登录、参与抽奖、个人中心查看中奖信息等。开发平台包含微服务架构体系、注册与服务发现Nacos、部署平台、接口管理Swagger等。
由于抽奖系统常常涉及到大批用户的点击涌入,怎样设计系统以达到高并发情况下的及时响应是本项目的重中之重。同时抽奖的奖品数量需要精确控制,不允许出现设置了5个奖品,最终6人中奖这种类似的问题。同时,在活动时间段内,管理员设置好的奖品如何投放?
红包何时出现?奖品什么时候可以被抽中?这些都涉及到投放策略的优化。
二、库存控制及核心流程
令牌桶算法可以把请求平均分散在时间段内,是使用较为广泛的限流算法。我们可以把令牌桶算法应用到红包雨业务案例中。这时候,令牌相当于奖品票据;令牌桶相当于奖品库存;正常业务相当于中奖;限流相当于未中奖。同时要注意,有多少个奖品,就生成多少个令牌(时间戳),未中奖返还令牌。假设活动时间间隔太短,奖品太多,极有可能产生的时间戳发生重复。为了解决这个问题,我们需要额外附加一个随机因子,将( 时间戳*1000+3位随机数)作为令牌,抽奖时将抽中的令牌除以1000来还原真实的时间戳。
最后,将拿出令牌、判断时间、放回令牌的操作下沉到Redis服务器端,利用Lua脚本避免出现插队导致的令牌顺序被打乱。通过这些操作和解决方案,相信可以避免打乱奖品令牌造成扎堆出现的问题。
三、发散思维
使用Lua脚本,将抽奖的逻辑从Java端移入Redis服务器端,作为一个整体函数暴露给Java调用,一方面实现中奖逻辑的原子性,另一方面减少了Java服务器与Redis服务器之间的通信次数,性能会得到提升。要实现活动随时暂停,可以新增一个接口,该接口修改Redis缓存中的活动状态。抽奖接口逻辑中增加暂停状态判断。如果是暂停,返回给前台以提示。要实现多种投放策路,可以修改令牌生成部分代码。按递增、递减、正态分布等多种函数生成时间戳。
高并发下的架构解决方案就讲解到这里了,关于红包雨案列的详细情况,尽在博学谷IT在线培训平台,欢迎大家来试听体验更多项目案例的讲解!
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java认证考试是什么?Java考试内容有什么?
Java认证考试是什么?Java考试内容有什么?Java认证考试是由Sun公司组织,设置Java 相关的Java程序员和Java开发员认证,考试合格后颁发的国际通用的Java程序员证书。
11710
2019-08-06 17:19:04
Git常用命令速查手册
众所周知,Git是一个能够有效高速地处理项目版本管理的分布式版本控制系统。如果你是一个开发者,Git无疑是你必须要学习的分布式版本控制系统。Git作为一个便捷的工具,它有许多命令,但是一般来讲你不用全部掌握,只需要记住一些常用命令就行了。因此本文为大家准备了Git常用命令速查手册,现在就来看看吧!
5113
2019-11-20 11:12:09
Java编程是什么?怎么学?
Java是一门面向对象编程语言,吸收C++语言优点的同时,摒弃了C++里难以理解的多继承、指针等概念,具有功能强大和简单易用两个特征。Java的其他特点还包括简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等。应用方面Java也是十分厉害,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
5147
2020-06-16 15:35:23
什么是Docker?Docker是如何工作的?
Docker作为一个开放源代码软件项目,其优势是体积小,运行速度快,因此掌握Docker技术是十分有必要的。想要搞清楚Docker的概念和工作原理,其实并不难,下面我们一起来简单聊聊Docker吧!
5594
2020-06-30 17:27:26
Java语言发展史及发展前景分析
Java语言发展史及发展前景分析,Java面向对象编程语言出生于1995年5月,Java功能强大和简单易用,应用领域非常广泛。Java语言具有安全、可靠等优势,且属于分布式、多线程和面向对象语言,对于这方面的人才需求量很大。
7236
2020-08-03 15:31:48
