微信红包架构分析

个人红包生成:

1、发红包时,按照设计的快速随机算法,将红包分好若干份。

2、有用户抢红包,直接队列化请求,再从红包序列中取出对应红包

 

春节红包:

1、红包拆分模块

对红包池(广告商+红包总金额)进行拆分为具体的红包(比如, 苏宁易购:10块, 京东商城:11块)

为了提高性能, 做了如下优化工作:

   1.全内存存储和计算, 借鉴redis的实现方式,事件驱动+单线程工作模型(减少因线程切换、加锁导致的CPU消耗).

 2.每个节点数据彼此隔离, 同时预先分配加载红包池(广告商+红包总金额).
  按照redis的性能数据: 读请求10万QPS级别 (具体取决于请求响应包大小 和 机器网卡带宽限制). 
  单个节点的服务能力为10万QPS级别, 若拆分32个独立节点 则集群的服务能力为320万QPS.

2、红包分配模块
    该模块的作用, 获取红包并赋予玩家, 并提交微信钱包服务(间接通过消息队列服务, 服务解耦的思想).
  除了完成主逻辑功能,该模块需具备流量控制和反作弊功能.
  流量控制策略:
  *) 按分钟配额来发放红包
  *) 按配额/峰值的概率来划定, 小于则处理请求, 其余按空响应返回.
  这种流量控制, 大大提高了服务的高可用性. 该模块为无状态节点, 很方便扩机器进行水平扩展.

3、调度/计数模块
    
该模块的作用, 用于调度和简单计数(粗粒度统计).
  用于水平扩展红包拆分节点, 同时计算分钟配额给红包分配模块.
  该模块可以为单点模块, 请求压力小. 集群中,每个节点每秒汇报自己的状态给它, 由它来汇总计数器和分配配额.

  削平峰值流量, 采用按概率拒绝服务, 从接入层做起(实际上客户端也做了限流控制). 流量逐层递减, 保证服务的压力在可控范围内. 
  服务降级, 能容忍部分服务节点的宕机, 具备服务的切换和功能开关能力.
  时间换体验, 有平滑后端服务压力的考量, 但更多的是, 让更多的用户能参与和延长体验时间这个本质的需求.

posted @ 2015-07-24 11:42  huzj  阅读(1206)  评论(0编辑  收藏  举报