设计原则
1、极简设计
设计越简单越容易实现越好,不要过度设计
2、大系统小做
一个复杂的系统可以拆分成一个个小系统来实现,不要陷入复杂漩涡
3、业务监控
要进行业务数据的监控,确保业务数据是正确的
微信红包相关设计
微信红包其实是一个比秒杀还复杂的系统,并且不能出错,所以采用了如下相关技术
1、SET化架构(分单元部署)
作用:
将系统划分为相互隔离的独立单元(SET),每个单元具备完整业务能力,实现故障隔离和水平扩展
例如将用户按地域或ID哈希划分到不同SET单元,单点故障仅影响局部用户
实现方案:
业务单元拆分:用户请求根据路由规则(如用户ID取模)定向到指定SET
数据隔离:每个SET包含独立数据库和缓存,避免跨单元访问
流量调度:智能DNS将用户请求路由至最近SET单元,降低延迟
优势:故障影响范围缩小至单个SET,容灾能力提升10倍以上
2、串行化技术(请求有序处理)
作用:
解决红包操作(拆红包/扣减库存)的并发冲突,避免超发/少发等资金风险
实现方案:
逻辑层排队
同一红包ID的请求进入内存队列,单线程顺序处理
例如使用Redis的List结构存储待处理红包请求
分布式锁控制
对红包ID加锁,确保同一时刻仅一个线程操作库存
异步削峰
抢红包请求快速响应”处理中”,结果通过MQ异步通知
效果:红包库存扣减原子性保障,资金误差率为0
3、多维度分库分表
作用:
突破单库性能瓶颈,支持百亿级红包订单存储
实现方案:
分库分表策略:
- 冷热分离
- 热数据(7天内红包记录):SSD高性能存储
- 冷数据(历史记录):HDD归档存储
- 双维度分片
- 维度一:按红包ID哈希分库(例如256库)
- 维度二:按创建时间范围分表(例如按月分表)
优化点
用户查询时,优先通过用户ID反向查询红包ID,再定位分片
采用基因法分片,避免跨库查询(如用户ID包含红包ID哈希值)
4、三者的协同关系
技术 | 解决核心问题 | 典型场景示例 |
---|---|---|
SET化架构 | 系统级容灾 | 某机房故障时仅影响5%用户 |
串行化技术 | 数据强一致性 | 10万并发抢同一红包不超发 |
多维度分表 | 海量数据存储 | 单表控制在千万级数据量 |
技术联动案:用户抢红包时,请求先路由到所属SET单元 → 在SET内进入红包ID对应的队列串行处理 → 操作分片后的红包订单表。