一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮 。
1. 引言当我那天拿着手机,正在和朋友们的微信群里畅聊着八卦新闻和即将到来的周末计划时 , 忽然一条带着喜意的消息扑面而来,消息正中间赫然写着八个大字:恭喜发财,大吉大利 。
文章插图
图片
抢红包?。∠嘈糯蟛糠秩硕源硕疾荒吧?,自 2015 年春节以来,微信就新增了各类型抢红包功能,吸引了数以亿万级的用户参与体验,今天 , 我们就来聊一聊这个奇妙有趣的红包系统 。
2. 概要设计2.1 系统特点
文章插图
图片
抢红包系统从功能拆分,可以分为包红包、发红包、抢红包和拆红包 4 个功能 。
对于系统特性来说,抢红包系统和秒杀系统类似 。
文章插图
图片
每次发红包都是一次商品秒杀流程,包括商品准备 , 商品上架,查库存、减库存,以及秒杀开始,最终的用户转账就是红包到账的过程 。
2.2 难点相比秒杀活动 , 微信发红包系统的用户量更大,设计更加复杂,需要重视的点更多,主要包括以下几点 。
1、高并发海量并发请求 , 秒杀只有一次活动,但红包可能同一时刻有几十万个秒杀活动 。
比如 2017 鸡年除夕,微信红包抢红包用户数高达 3.42 亿,收发峰值 76 万/秒 , 发红包 37.77 亿 个 。
2、安全性要求红包业务涉及资金交易,所以一定不能出现超卖、少卖的情况 。
- 超卖:发了 10 块钱,结果抢到了 11 块钱,多的钱只能系统补上,如此为爱发电应用估计早就下架了;
- 少卖:发了 10 块钱,只抢了 9 块 , 多的钱得原封不动地退还用户,否则第二天就接到法院传单了 。
3、严格事务参与用户越多,并发 DB 请求越大,数据越容易出现事务问题,所以系统得做好事务一致性 。
这也是一般秒杀活动的难点所在,而且抢红包系统涉及金钱交易,所以事务级别要求更高,不能出现脏数据 。
3. 概要设计3.1 功能说明抢红包功能允许用户在群聊中发送任意个数和金额的红包,群成员可以抢到随机金额的红包,但要保证每个用户的红包金额不小于 0.01 元 。
文章插图
图片
抢红包的详细交互流程如下:
- 用户接收到抢红包通知,点击通知打开群聊页面;
- 用户点击抢红包,后台服务验证用户资格,确保用户尚未领取过此红包;
- 若用户资格验证通过 , 后台服务分配红包金额并存储领取记录;
- 用户在微信群中看到领取金额,红包状态更新为“已领取”;
- 异步调用支付接口,将红包金额更新到钱包里 。
3.2 数据库设计红包表 redpack 的字段如下:
- id: 主键,红包ID
- userId: 发红包的用户ID
- totalAmount: 总金额
- surplusAmount: 剩余金额
- total: 红包总数
- surplusTotal: 剩余红包总数
红包记录表 redpack_record 如下:
- id: 主键 , 记录ID
- redpackId: 红包ID , 外键
- userId: 用户ID
- amount: 抢到的金额
3.3 发红包
- 用户设置红包的总金额和个数后,在红包表中增加一条数据,开始发红包;
- 为了保证实时性和抢红包的效率,在 redis 中增加一条记录,存储红包 ID 和总人数 n;
推荐阅读
- 聊聊微服务链路服务
- Eureka: 微服务架构中不可或缺的服务治理工具
- 云原生数据库 GaiaDB 架构设计解析:高性能、多级高可用
- 现代软件架构:事件驱动设计遇上事件溯源
- 假如给你一个亿,以下5个“胖妞”必须娶一个,你会选谁呢?
- 从MySQL看主从架构高可用性实现
- 聊聊分布式数据库TDSQL的技术架构
- 利用Apache Kafka、Flink和Druid构建实时数据架构
- 华为Mate 40 Pro现货来了!6099元你会入手吗?
- 深入了解手机芯片:架构与性能的权衡