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

一、业务要求及痛点分析
红包雨项目属于抽奖类系统的一种,它要求在某段时间内随机派发奖品,用户抢红包参与活动。这个业务由管理后台、用户前台和开发平台构成。其中管理后台需要实现用户管理、奖品管理、活动管理、中奖统计等功能;用户前台用于注册登录、参与抽奖、个人中心查看中奖信息等。开发平台包含微服务架构体系、注册与服务发现Nacos、部署平台、接口管理Swagger等。
由于抽奖系统常常涉及到大批用户的点击涌入,怎样设计系统以达到高并发情况下的及时响应是本项目的重中之重。同时抽奖的奖品数量需要精确控制,不允许出现设置了5个奖品,最终6人中奖这种类似的问题。同时,在活动时间段内,管理员设置好的奖品如何投放?
红包何时出现?奖品什么时候可以被抽中?这些都涉及到投放策略的优化。
二、库存控制及核心流程
令牌桶算法可以把请求平均分散在时间段内,是使用较为广泛的限流算法。我们可以把令牌桶算法应用到红包雨业务案例中。这时候,令牌相当于奖品票据;令牌桶相当于奖品库存;正常业务相当于中奖;限流相当于未中奖。同时要注意,有多少个奖品,就生成多少个令牌(时间戳),未中奖返还令牌。假设活动时间间隔太短,奖品太多,极有可能产生的时间戳发生重复。为了解决这个问题,我们需要额外附加一个随机因子,将( 时间戳*1000+3位随机数)作为令牌,抽奖时将抽中的令牌除以1000来还原真实的时间戳。
最后,将拿出令牌、判断时间、放回令牌的操作下沉到Redis服务器端,利用Lua脚本避免出现插队导致的令牌顺序被打乱。通过这些操作和解决方案,相信可以避免打乱奖品令牌造成扎堆出现的问题。
三、发散思维
使用Lua脚本,将抽奖的逻辑从Java端移入Redis服务器端,作为一个整体函数暴露给Java调用,一方面实现中奖逻辑的原子性,另一方面减少了Java服务器与Redis服务器之间的通信次数,性能会得到提升。要实现活动随时暂停,可以新增一个接口,该接口修改Redis缓存中的活动状态。抽奖接口逻辑中增加暂停状态判断。如果是暂停,返回给前台以提示。要实现多种投放策路,可以修改令牌生成部分代码。按递增、递减、正态分布等多种函数生成时间戳。
高并发下的架构解决方案就讲解到这里了,关于红包雨案列的详细情况,尽在博学谷IT在线培训平台,欢迎大家来试听体验更多项目案例的讲解!
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java程序员必须知道的JVM命令行标志
本文主要和大家分享Java程序员必须知道的JVM命令行标志。帮助大家理解JVM的工作原理:任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或JIT编译Java字节码等等。希望大家通过这些命令行标志,更好的诊断和调优自己的Java虚拟机性能。
9953
2019-08-09 18:03:43
如何用Redis轻松实现秒杀系统?
如何用Redis轻松实现秒杀系统?一般来说有三个办法,即写入内存而不是写入硬盘;异步处理而不是同步处理;分布式处理。相信只要大家做好以上这三点,就能轻松用Redis轻松实现秒杀系统。下面本文将从秒杀的定义,秒杀系统场景特点,秒杀架构设计理念,架构方案和实际案例讲解等方面,为大家介绍如何实现秒杀系统。
8341
2019-11-04 15:00:18
Java核心技术汇总 Java开发必备技术
Java核心技术汇总 Java开发必备技术,Java工程师需要掌握JVM相关、Java的运行、数据类型、对象和实例、访问控制、流程控制、面向对象编程的概念、基础知识点、集合框架、异常框架等相关知识。
6417
2020-05-19 16:36:19
线程池经典面试题整理附答案
线程池是一种多线程处理形式,它是Java开发面试中的必考知识点,尤其是在一些大厂的求职面试中,线程池是对求职者考核的重点。为了帮助大家可以更好地通过面试,本文特地为大家整理了线程池经典面试题并附上了答案,下面一起来尝试着做一做吧!
11383
2020-06-17 14:44:17
Java语言适合零基础入门为什么?
很多人在选择入门IT行业,不知道自己适合学习哪一门编程语言,也不知道哪一门语言的发展前景好。编程语言有很多种,但选择一门编程语言非常值得认真考虑的,选太容易的担心后面学其他的语言会很难,选太难的话又担心自己不会,不少人选择性Java入门,Java语言好在哪儿呢?
6234
2020-07-29 11:11:29
