在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
众所周知,互联网分布式系统架构设计必须考虑高并发,高并发也是开发者常常会面临的一个技术难题。如何控制库存避免超卖?怎么实现线程间数据处理的同步?本文将以红包雨系统业务为例,为大家详细阐述业务痛点和系统设计的方法,帮助大家梳理解决问题的思路,构建系统思维的能力。
一、业务要求及痛点分析
红包雨项目属于抽奖类系统的一种,它要求在某段时间内随机派发奖品,用户抢红包参与活动。这个业务由管理后台、用户前台和开发平台构成。其中管理后台需要实现用户管理、奖品管理、活动管理、中奖统计等功能;用户前台用于注册登录、参与抽奖、个人中心查看中奖信息等。开发平台包含微服务架构体系、注册与服务发现Nacos、部署平台、接口管理Swagger等。
由于抽奖系统常常涉及到大批用户的点击涌入,怎样设计系统以达到高并发情况下的及时响应是本项目的重中之重。同时抽奖的奖品数量需要精确控制,不允许出现设置了5个奖品,最终6人中奖这种类似的问题。同时,在活动时间段内,管理员设置好的奖品如何投放?
红包何时出现?奖品什么时候可以被抽中?这些都涉及到投放策略的优化。
二、库存控制及核心流程
令牌桶算法可以把请求平均分散在时间段内,是使用较为广泛的限流算法。我们可以把令牌桶算法应用到红包雨业务案例中。这时候,令牌相当于奖品票据;令牌桶相当于奖品库存;正常业务相当于中奖;限流相当于未中奖。同时要注意,有多少个奖品,就生成多少个令牌(时间戳),未中奖返还令牌。假设活动时间间隔太短,奖品太多,极有可能产生的时间戳发生重复。为了解决这个问题,我们需要额外附加一个随机因子,将( 时间戳*1000+3位随机数)作为令牌,抽奖时将抽中的令牌除以1000来还原真实的时间戳。
最后,将拿出令牌、判断时间、放回令牌的操作下沉到Redis服务器端,利用Lua脚本避免出现插队导致的令牌顺序被打乱。通过这些操作和解决方案,相信可以避免打乱奖品令牌造成扎堆出现的问题。
三、发散思维
使用Lua脚本,将抽奖的逻辑从Java端移入Redis服务器端,作为一个整体函数暴露给Java调用,一方面实现中奖逻辑的原子性,另一方面减少了Java服务器与Redis服务器之间的通信次数,性能会得到提升。要实现活动随时暂停,可以新增一个接口,该接口修改Redis缓存中的活动状态。抽奖接口逻辑中增加暂停状态判断。如果是暂停,返回给前台以提示。要实现多种投放策路,可以修改令牌生成部分代码。按递增、递减、正态分布等多种函数生成时间戳。
高并发下的架构解决方案就讲解到这里了,关于红包雨案列的详细情况,尽在博学谷IT在线培训平台,欢迎大家来试听体验更多项目案例的讲解!
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java8有什么变化?九大新特性
Java8有什么变化?本文将讲解Java8的九大新特性,它们分别是Java8Lambda 表达式、Java8方法引用、Java8函数式接口、Java8Nashorn JavaScript Java 8 默认方法、Java8Stream、Java8Optional 类、Java8日期时间API、Java8 Base64。
8501
2019-08-12 10:06:17
Redis6.0引入多线程有哪些好处?
Redis6.0新版本在五月初重磅发布,我们可以清晰地发现Redis6.0新版本引入了多线程。相信大家一定都十分好奇,Redis6.0引入多线程究竟有哪些好处呢?下面我们就来逐一分析一下引入多线程的诸多好处~
4901
2020-05-29 18:52:04
Java学习如何提升学习效率?
Java学习如何提升学习效率?刚刚接触Java的同学估计有满脑子的困惑,Java的体系结构异常庞大,很多刚接触的朋友学着学着就不知道自己的路线是什么,不知道如何进行学习路线规划,也不知道学习什么内容可以找到相关的工作等。
4526
2020-06-17 14:58:23
学Java编程开发难吗?
学Java编程开发难吗?刚刚接触Java编程的人,都会被告知Java相对于其他编程语言来说更加难学,对于没有基础的同学入行学习压力非常大。那Java编程开发真的难学吗?想要学习Java的小伙伴们看过来,只要掌握科学的学习方法,Java学习其实并没有想象中可怕。
4680
2020-07-17 17:28:07
Java语言适合零基础入门为什么?
很多人在选择入门IT行业,不知道自己适合学习哪一门编程语言,也不知道哪一门语言的发展前景好。编程语言有很多种,但选择一门编程语言非常值得认真考虑的,选太容易的担心后面学其他的语言会很难,选太难的话又担心自己不会,不少人选择性Java入门,Java语言好在哪儿呢?
3969
2020-07-29 11:11:29