微信百亿级红包技术架构
《微信百亿级红包技术架构》共 0.4 万字,通篇围绕 并发、落地、架构、缓存 展开,归在「后端与系统架构」这一层。
适合给 AI 系统搭底座、要管得住的人
目录骨架(6 节)
- 52.微信百亿级红包技术架构
- 1. 微信红包概述
- 2. 微信红包架构(南北分布、拆包入账异步化、发拆落地)
- 3. 微信红包高并发处理(红包算法、柔性降级方案)
- 南北分布
- 1、订单层南北独立体系,数据不同步
分享内容
- 微信红包概述
- 微信红包架构(南北分布、拆包入账异步化、发拆落地)
- 微信红包高并发处理(红包算法、柔性降级方案)
概述
话说每逢双十一节或春节等节假日,对大家来讲是最欢乐的日子,可以在微信群中收发红包,此外今年微信还推出了面对面红包,让大家拜年时可直接收发,对于用户来讲很爽也很方便。但对于技术架构侧的考量,这使得微信红包的收发数据成几何倍数上升,处理的复杂度也增加了很多。
2017 年微信红包发送量最大的时间段是除夕夜,达到了 142 亿个。
当达百亿级别的资金交易规模时,我们该怎样来保证系统的并发性能和交易安全?
与传统意义上的红包相比,近些年火起来的 “红包”,似乎才是如今春节的一大重头戏。历经上千年时代传承与变迁,春节发红包早已成为历史沉淀的文化习俗,融入了民族的血脉。按照各家公布的数据,除夕全天微信用户红包总发送量达到 80.8 亿个,红包峰值收发量为 40.9 万个 / 秒。春晚直播期间讨论春晚的微博达到 5191 万条,网友互动量达到 1.15 亿,网友抢微博红包的总次数超过 8 亿次。
微信红包在经过 15 年春晚摇一摇之后,2015 年上半年业务量一度呈指数级增长。尤其是微信红包活跃用户数的大量增长,使得 2016 除夕跨年红包成为极大挑战。为了应对 16 年春节可预知的红包海量业务,红包系统在架构上进行了一系列调整和优化。主要包括异地架构、cache 系统优化、拆红包并发策略优化、存储优化一系列措施,为迎接 2016 春节红包挑战做好准备。下面介绍最主要的一些思路。
架构
微信用户在国内有深圳、上海两个接入点,习惯性称之为南、北(即深圳为南,上海为北)。用户请求接入后,不同业务根据业务特性选择部署方式。微信红包在信息流上可以分为订单纬度与用户纬度。

其中订单是贯穿红包发、抢、拆、详情列表等业务的关键信息,属于交易类信息;而用户纬度指的是红包用户的收红包列表、发红包列表,属于展示类信息。红包系统在架构上,有以下几个方面:

南北分布
1、订单层南北独立体系,数据不同步
用户就近接入,请求发红包时分配订单南北,并在单号打上南北标识。抢红包、拆红包、查红包详情列表时,接入层根据红包单号上的南北标识将流量分别引到南北系统闭环。根据发红包用户和抢红包用户的所属地不同,有以下四种情况:
1)深圳用户发红包,深圳用户抢
订单落在深圳,深圳用户抢红包时不需要跨城,在深圳完成闭环。
2)深圳用户发红包,上海用户抢
订单落在深圳,上海用户抢红包,在上海接入后通过专线跨城到深圳,最后在深圳闭环完成抢红包。
3)上海用户发红包,上海用户抢
订单落在上海,上海用户抢红包时不需要跨城,在上海完成闭环。
4)上海用户发红包,深圳用户抢
订单落在上海,深圳用户抢红包,从深圳接入后通过专线跨城到上海,最后在上海闭环完成抢红包。
系统这样设计,好处是南北系统分摊流量,降低系统风险。
2、用户数据写多读少,全量存深圳,异步队列写入,查时一边跨城
用户数据的查询入口,在微信钱包中,隐藏的很深。这决定了用户数据的访问量不会太大,而且也被视为可旁路的非关键信息,实时性要求不高。因此,只需要在发红包、拆红包时,从订单纬度拆分出用户数据写入请求,由 MQ 异步写入深圳。后台将订单与用户进行定时对账保证数据完整性即可。
3、支持南北流量灵活调控
红包系统南北分布后,订单落地到深圳还是上海,是可以灵活分配的,只需要在接入层上做逻辑。例如,可以在接入层中,实现让所有红包请求,都落地到深圳(无论用户从上海接入,还是深圳接入),这样上海的红包业务系统将不会有请求量。提升了红包系统的容灾能力。同时,实现了接入层上的后台管理系统,实现了秒级容量调控能力。可根据南北请求量的实时监控,做出对应的调配。
4、DB 故障时流量转移能力 基于南北流量的调控能力,当发现 DB 故障时,可将红包业务流量调到另外一边,实现 DB 故障的容灾。
预订单
支付前订单落 cache,同时利用 cache 的原子 incr 操作顺序生成红包订单号。优点是 cache 的轻量操作,以及减少 DB 废单。在用户请求发红包与真正支付之间,存在一定的转化率,部分用户请求发红包后,并不会真正去付款。
拆红包入账异步化
信息流与资金流分离。
拆红包时,DB 中记下拆红包凭证,然后异步队列请求入账。
入账失败通过补偿队列补偿,最终通过红包凭证与用户账户入账流水对账,保证最终一致性。如下图所示:

这个架构设计,理论基础是快慢分离。
红包的入账是一个分布事务,属于慢接口。
而拆红包凭证落地则速度快。
实际应用场景中,用户抢完红包,只关心详情列表中谁是 “最佳手气”,很少关心抢到的零是否已经到账。
