微信红包架构分析
个人红包生成:
1、发红包时,按照设计的快速随机算法,将红包分好若干份。
2、有用户抢红包,直接队列化请求,再从红包序列中取出对应红包
春节红包:
1、红包拆分模块
对红包池(广告商+红包总金额)进行拆分为具体的红包(比如, 苏宁易购:10块, 京东商城:11块)
为了提高性能, 做了如下优化工作:
1.全内存存储和计算, 借鉴redis的实现方式,事件驱动+单线程工作模型(减少因线程切换、加锁导致的CPU消耗).
2.每个节点数据彼此隔离, 同时预先分配加载红包池(广告商+红包总金额).
按照redis的性能数据: 读请求10万QPS级别 (具体取决于请求响应包大小 和 机器网卡带宽限制).
单个节点的服务能力为10万QPS级别, 若拆分32个独立节点 则集群的服务能力为320万QPS.
2、红包分配模块
该模块的作用, 获取红包并赋予玩家, 并提交微信钱包服务(间接通过消息队列服务, 服务解耦的思想).
除了完成主逻辑功能,该模块需具备流量控制和反作弊功能.
流量控制策略:
*) 按分钟配额来发放红包
*) 按配额/峰值的概率来划定, 小于则处理请求, 其余按空响应返回.
这种流量控制, 大大提高了服务的高可用性. 该模块为无状态节点, 很方便扩机器进行水平扩展.
3、调度/计数模块
该模块的作用, 用于调度和简单计数(粗粒度统计).
用于水平扩展红包拆分节点, 同时计算分钟配额给红包分配模块.
该模块可以为单点模块, 请求压力小. 集群中,每个节点每秒汇报自己的状态给它, 由它来汇总计数器和分配配额.
削平峰值流量, 采用按概率拒绝服务, 从接入层做起(实际上客户端也做了限流控制). 流量逐层递减, 保证服务的压力在可控范围内.
服务降级, 能容忍部分服务节点的宕机, 具备服务的切换和功能开关能力.
时间换体验, 有平滑后端服务压力的考量, 但更多的是, 让更多的用户能参与和延长体验时间这个本质的需求.