后端与系统架构4333 字

微信百亿级红包技术架构

·全库 352 / 611

《微信百亿级红包技术架构》共 0.4 万字,通篇围绕 并发、落地、架构、缓存 展开,归在「后端与系统架构」这一层。

覆盖并发落地架构缓存数据库Redis

适合给 AI 系统搭底座、要管得住的人

目录骨架(6 节)
  1. 52.微信百亿级红包技术架构
  2. 1. 微信红包概述
  3. 2. 微信红包架构(南北分布、拆包入账异步化、发拆落地)
  4. 3. 微信红包高并发处理(红包算法、柔性降级方案)
  5. 南北分布
  6. 1、订单层南北独立体系,数据不同步

分享内容

  1. 微信红包概述
  2. 微信红包架构(南北分布、拆包入账异步化、发拆落地)
  3. 微信红包高并发处理(红包算法、柔性降级方案)

概述

话说每逢双十一节或春节等节假日,对大家来讲是最欢乐的日子,可以在微信群中收发红包,此外今年微信还推出了面对面红包,让大家拜年时可直接收发,对于用户来讲很爽也很方便。但对于技术架构侧的考量,这使得微信红包的收发数据成几何倍数上升,处理的复杂度也增加了很多。

2017 年微信红包发送量最大的时间段是除夕夜,达到了 142 亿个。

当达百亿级别的资金交易规模时,我们该怎样来保证系统的并发性能和交易安全?

与传统意义上的红包相比,近些年火起来的 “红包”,似乎才是如今春节的一大重头戏。历经上千年时代传承与变迁,春节发红包早已成为历史沉淀的文化习俗,融入了民族的血脉。按照各家公布的数据,除夕全天微信用户红包总发送量达到 80.8 亿个,红包峰值收发量为 40.9 万个 / 秒。春晚直播期间讨论春晚的微博达到 5191 万条,网友互动量达到 1.15 亿,网友抢微博红包的总次数超过 8 亿次。

微信红包在经过 15 年春晚摇一摇之后,2015 年上半年业务量一度呈指数级增长。尤其是微信红包活跃用户数的大量增长,使得 2016 除夕跨年红包成为极大挑战。为了应对 16 年春节可预知的红包海量业务,红包系统在架构上进行了一系列调整和优化。主要包括异地架构、cache 系统优化、拆红包并发策略优化、存储优化一系列措施,为迎接 2016 春节红包挑战做好准备。下面介绍最主要的一些思路。

架构

微信用户在国内有深圳、上海两个接入点,习惯性称之为南、北(即深圳为南,上海为北)。用户请求接入后,不同业务根据业务特性选择部署方式。微信红包在信息流上可以分为订单纬度与用户纬度。

image.png

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

image.png

南北分布

1、订单层南北独立体系,数据不同步

用户就近接入,请求发红包时分配订单南北,并在单号打上南北标识。抢红包、拆红包、查红包详情列表时,接入层根据红包单号上的南北标识将流量分别引到南北系统闭环。根据发红包用户和抢红包用户的所属地不同,有以下四种情况:

1)深圳用户发红包,深圳用户抢

订单落在深圳,深圳用户抢红包时不需要跨城,在深圳完成闭环。

2)深圳用户发红包,上海用户抢

订单落在深圳,上海用户抢红包,在上海接入后通过专线跨城到深圳,最后在深圳闭环完成抢红包。

3)上海用户发红包,上海用户抢

订单落在上海,上海用户抢红包时不需要跨城,在上海完成闭环。

4)上海用户发红包,深圳用户抢

订单落在上海,深圳用户抢红包,从深圳接入后通过专线跨城到上海,最后在上海闭环完成抢红包。

系统这样设计,好处是南北系统分摊流量,降低系统风险。

2、用户数据写多读少,全量存深圳,异步队列写入,查时一边跨城

用户数据的查询入口,在微信钱包中,隐藏的很深。这决定了用户数据的访问量不会太大,而且也被视为可旁路的非关键信息,实时性要求不高。因此,只需要在发红包、拆红包时,从订单纬度拆分出用户数据写入请求,由 MQ 异步写入深圳。后台将订单与用户进行定时对账保证数据完整性即可。

3、支持南北流量灵活调控

红包系统南北分布后,订单落地到深圳还是上海,是可以灵活分配的,只需要在接入层上做逻辑。例如,可以在接入层中,实现让所有红包请求,都落地到深圳(无论用户从上海接入,还是深圳接入),这样上海的红包业务系统将不会有请求量。提升了红包系统的容灾能力。同时,实现了接入层上的后台管理系统,实现了秒级容量调控能力。可根据南北请求量的实时监控,做出对应的调配。

4、DB 故障时流量转移能力 基于南北流量的调控能力,当发现 DB 故障时,可将红包业务流量调到另外一边,实现 DB 故障的容灾。

预订单

支付前订单落 cache,同时利用 cache 的原子 incr 操作顺序生成红包订单号。优点是 cache 的轻量操作,以及减少 DB 废单。在用户请求发红包与真正支付之间,存在一定的转化率,部分用户请求发红包后,并不会真正去付款。

拆红包入账异步化

信息流与资金流分离。

拆红包时,DB 中记下拆红包凭证,然后异步队列请求入账。

入账失败通过补偿队列补偿,最终通过红包凭证与用户账户入账流水对账,保证最终一致性。如下图所示:

这个架构设计,理论基础是快慢分离。

红包的入账是一个分布事务,属于慢接口。

而拆红包凭证落地则速度快。

实际应用场景中,用户抢完红包,只关心详情列表中谁是 “最佳手气”,很少关心抢到的零是否已经到账。

资料里没有你的场景?

把你手上的数据和想解决的那个环节发上来,我们按具体情况回,不复述方法论。

发布需求