听说你会架构设计?

一个漂泊江湖多年的 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 元 。
听说你会架构设计?

文章插图
图片
抢红包的详细交互流程如下:
  1. 用户接收到抢红包通知,点击通知打开群聊页面;
  2. 用户点击抢红包,后台服务验证用户资格,确保用户尚未领取过此红包;
  3. 若用户资格验证通过 , 后台服务分配红包金额并存储领取记录;
  4. 用户在微信群中看到领取金额,红包状态更新为“已领取”;
  5. 异步调用支付接口,将红包金额更新到钱包里 。
 
3.2 数据库设计红包表 redpack 的字段如下:
  • id: 主键,红包ID
  • userId: 发红包的用户ID
  • totalAmount: 总金额
  • surplusAmount: 剩余金额
  • total: 红包总数
  • surplusTotal: 剩余红包总数
该表用来记录用户发了多少红包,以及需要维护的剩余金额 。
 
红包记录表 redpack_record 如下:
  • id: 主键 , 记录ID
  • redpackId: 红包ID , 外键
  • userId: 用户ID
  • amount: 抢到的金额
记录表用来存放用户具体抢到的红包信息,也是红包表的副表 。
 
3.3 发红包
  1. 用户设置红包的总金额和个数后,在红包表中增加一条数据,开始发红包;
  2. 为了保证实时性和抢红包的效率,在 redis 中增加一条记录,存储红包 ID 和总人数 n;


    推荐阅读