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

一、业务要求及痛点分析
红包雨项目属于抽奖类系统的一种,它要求在某段时间内随机派发奖品,用户抢红包参与活动。这个业务由管理后台、用户前台和开发平台构成。其中管理后台需要实现用户管理、奖品管理、活动管理、中奖统计等功能;用户前台用于注册登录、参与抽奖、个人中心查看中奖信息等。开发平台包含微服务架构体系、注册与服务发现Nacos、部署平台、接口管理Swagger等。
由于抽奖系统常常涉及到大批用户的点击涌入,怎样设计系统以达到高并发情况下的及时响应是本项目的重中之重。同时抽奖的奖品数量需要精确控制,不允许出现设置了5个奖品,最终6人中奖这种类似的问题。同时,在活动时间段内,管理员设置好的奖品如何投放?
红包何时出现?奖品什么时候可以被抽中?这些都涉及到投放策略的优化。
二、库存控制及核心流程
令牌桶算法可以把请求平均分散在时间段内,是使用较为广泛的限流算法。我们可以把令牌桶算法应用到红包雨业务案例中。这时候,令牌相当于奖品票据;令牌桶相当于奖品库存;正常业务相当于中奖;限流相当于未中奖。同时要注意,有多少个奖品,就生成多少个令牌(时间戳),未中奖返还令牌。假设活动时间间隔太短,奖品太多,极有可能产生的时间戳发生重复。为了解决这个问题,我们需要额外附加一个随机因子,将( 时间戳*1000+3位随机数)作为令牌,抽奖时将抽中的令牌除以1000来还原真实的时间戳。
最后,将拿出令牌、判断时间、放回令牌的操作下沉到Redis服务器端,利用Lua脚本避免出现插队导致的令牌顺序被打乱。通过这些操作和解决方案,相信可以避免打乱奖品令牌造成扎堆出现的问题。
三、发散思维
使用Lua脚本,将抽奖的逻辑从Java端移入Redis服务器端,作为一个整体函数暴露给Java调用,一方面实现中奖逻辑的原子性,另一方面减少了Java服务器与Redis服务器之间的通信次数,性能会得到提升。要实现活动随时暂停,可以新增一个接口,该接口修改Redis缓存中的活动状态。抽奖接口逻辑中增加暂停状态判断。如果是暂停,返回给前台以提示。要实现多种投放策路,可以修改令牌生成部分代码。按递增、递减、正态分布等多种函数生成时间戳。
高并发下的架构解决方案就讲解到这里了,关于红包雨案列的详细情况,尽在博学谷IT在线培训平台,欢迎大家来试听体验更多项目案例的讲解!
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
Java工程师必须掌握的五个工具
Java编程语言具有极高的安全性,因此大部分企业都使用Java开发自己的核心产品。而对于Java工程师而言,想要提高自己的工作效率,要么就是掌握扎实的开发技能,面对功能需求可以快速完成,要么就是掌握更多的高效工具,提高自己编程的效率。这里和广大的java工程师分享五个必须掌握的工具。
8771
2019-07-01 19:02:59
Java运行机制是什么?
不管是学习Java还是其他什么变成语言,我们不仅要了解它的特性,充分的使用Java语言完成各种程序开发工作,还要了解Java的运行机制。只有了解其底层的运行机制,才能更好的利用Java完成各项工作。Java运行机制是什么?
8131
2019-11-05 18:28:09
SAAS开发技术教程学习哪些内容?
SAAS开发技术教程学习哪些内容?SAAS开发技术涉及的知识点有很多,比如SAAS-HRM系统概述与搭建环境,多租户数据库设计方案,组织机构管理的需求分析,部门微服务等内容。
10706
2019-11-08 12:06:37
Java核心技术汇总 Java开发必备技术
Java核心技术汇总 Java开发必备技术,Java工程师需要掌握JVM相关、Java的运行、数据类型、对象和实例、访问控制、流程控制、面向对象编程的概念、基础知识点、集合框架、异常框架等相关知识。
5446
2020-05-19 16:36:19
学Java编程开发难吗?
学Java编程开发难吗?刚刚接触Java编程的人,都会被告知Java相对于其他编程语言来说更加难学,对于没有基础的同学入行学习压力非常大。那Java编程开发真的难学吗?想要学习Java的小伙伴们看过来,只要掌握科学的学习方法,Java学习其实并没有想象中可怕。
6356
2020-07-17 17:28:07
