群发红包系统
业务流程
发红包
- 输入金额以及人数
- 创建红包订单(订单ID,金额,份数)
- 调用支付系统
- 红包订单支付之后红包就发出去了
- 钱先拆好(行锁分散,加大并发)
抢红包
- 抢红包业务群,检测当前是否有剩余钱
- 没有剩余直接返回,有剩余就将请求转发到Redis里面的list(先来先服务),同时将请求发到mq启动一个延时任务(对账作用),之后有一个worker调度中心监听Redis,也就是消费队列里面的消息。
- 抢红包业务群会阻塞轮询worker调度中心是否抢到红包,之后返回给用户,这个过程用户看来是同步的,只是在后端用Redis的list实现了简单排下队异步。
拆红包
- 抢到红包之后,计算红包的金额,计算更新剩余的红包的余额。
- 分支1:返回给用户
- 分支2:将拆红包的流水写到数据库里面(MQ异步记账)
- 红包结算(异常结算池)
- 红包入账
业务特点
- 个数少,人数少:小系统
- 个数多,人数少:美团。饿了么红包
- 个数多,人数大:微信群红包
- 个数少,人数多:春晚红包
设计思路
- 数据量大:分库分表
- 避免所有请求都到达DB:Redis
- 并发请求量大:Redis高可用 + 分布式ID + 消息队列
- 抢红包的FIFO保证:mq还是Redis
- 使用mq就是过于重量级,这种消息小而且是比较多的请求,最好不使用,kafka在topic多的时候容易性能下降、
- 使用Redis的list就可以性能比较高。
- 响应快
- 转账和热点数据
- 金融系统的安全问题:账务对账
实体设计
红包表
- 红包ID
- 发的用户ID
- 红包的金额
- 红包的人头数
- 支付的状态
- 已抢人数
- 版本号
拆红包流水表
- 拆红包流水号
- 红包ID
- 拆红包的用户ID
- 得到的金额
- 时间
实现一:微型系统(100个红包,1000个人抢)
-
一个分布式锁:同时抢,使用分布式锁排队,要求抢红包3s内返回,1个DB操作20ms(MySQL的行级锁),所以100个红包就是2000ms也就是2s抢完,满足3s之内。
-
分表:数据量多的时候
-
控制重复抢红包
实现二:小型系统(1000个红包,10000个人抢)
- 预先拆分红包到数据库:钱先按照个数拆分好,就有多个行锁
- 多个分布式锁:钱先按照个数拆分好,就有多个行锁,这个时候就使用对应个数的分布式锁,之后使用hash将锁分散到不同的锁上面
- 注意获取到锁之后判断一下有没有抢完,抢完就直接返回了,不要继续往下执行了
- Redis队列:钱按照个数拆分的时候流水结果放到队列里面,分布式锁抢到之后就从队列里面取出来一个更新数据库。
- 分表
实现三:千万级(千万个红包)
- 异步化:增加任务调度中心,异步处理(Redis的list替换mq,更加高效,数据小且多)
- 请求到达红包服务,抢红包请求隔离阻塞在红包服务,任务异步推送到Redis的list里面,任务调度中心拿到任务之后,使用之前的分布式锁去处理
- 可以控制系统的吞吐量
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937165.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
【黑马python】基础 5.Python 函数:参数 返回值 嵌套
笔记汇总目录【黑马python】8天python从入门到精通 - 汇总Python 函数代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例代码示例参考链接黑马-4.Python 循环语句 0…
一试模拟试题(十七)problem 7 另(数竞相关)
一试模拟试题(十七)problem 7 另:
求式子 \(T = \sqrt{\cfrac{5-3 \sin \theta}{5+3 \cos \theta}}\) 的最大值
易知可以转化为点 \(P(5,5)\) 到以原点 \(O\) 为圆心,半径为 \(3\) 的圆的切线的斜率(较大的那一个…
PaddleOCR源码安装+centos7.6+python3.10
先自行安装python3,版本如下:[root@localhost IOPaint]# python3 --version Python 3.10.6安装gcc9# 安装 SCL 仓库
sudo yum install -y centos-release-scl# 安装 devtoolset-9(包含 GCC 9)
sudo yum install -y…
C#/.NET/.NET Core技术前沿周刊 | 第 57 期(2025年10.1-10.12)
前言
C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与…
Cheap Context and Expensive Context
Cheap Context and Expensive Context
Repo
Cheap Context
SubAgent的Context是廉价的而且是一次性的
或者可以称之为 intern context 像实习生一样非常的廉价, 执行一次性任务, 而且受限于传入上下文的限制, 显得有些…
[Mysql]快速执行sql文件
[Mysql]快速执行sql文件mysql版本:5.7.x打开cmd窗口,cd到mysql软件bin路径下,执行
mysql --user=修改数据库用户名 --password=修改数据库密码 --database=修改数据库名称 --batch --execute="source 修改文件名…
腾讯电脑管家C盘占用很大
腾讯电脑管家C盘占用很大第一个:
这个文件夹 C:\Windows\SysWOW64\config\systemprofile\AppData\Roaming\Tencent\beacon 里边有个 bc_0WIN0DJ6VL4UY2KW_09.db-wal ,5.8Gbc_0WIN0DJ6VL4UY2KW_09.db-wal 应该是随机生…
10.14日学习笔记
HBase 高级操作
预分区(Pre-splitting)
避免初始数据热点,用 HexStringSplit 或自定义算法:
bashhbase org.apache.hadoop.hbase.util.RegionSplitter test_table
HexStringSplit -c 10 -f cf1
生成 10 个 Region…
SpringDataElasticsearch聚合实现过滤搜索
SpringDataElasticsearch聚合实现过滤搜索过滤功能分析
整个过滤部分有3块:顶部的导航,已经选择的过滤条件展示:商品分类面包屑
其它已选择过滤参数过滤条件展示,又包含3部分商品分类展示
品牌展示
其它规格参数展…
全局解释器锁(GIL)
2025.10.14
1.全局解释器锁(GIL)在Python中主要影响多线程应用程序的性能,具体表现为限制CPU密集型任务的并行执行能力,因为GIL只允许一个线程同时执行Python字节码,导致无法充分利用多核CPU进行真正并行计算。
How to Speak English with Only 50 Sentences
How to Speak English with Only 50 SentencesWelcome to my channel, Bookish English 2. Today I will show you something real. Last week I met a student who spoke English with only 50 sentences. Sh…