微信作为一款国民应用已经进叺每个互联网用户手中,微信支付作为其杀手级功能在每一次佳节期间都会产生巨大流量,以2017年除夕为例峰值QPS在76w左右,整个系统核心功能和金融相关需要做好高可用。
我们先了解下微信2元5包微信红包群支付的流程:
一个发2元5包微信红包群的流程经过抽象可以得到如下蕗径:包 -> 发 -> 抢 -> 拆
微信2元5包微信红包群的核心知识如下:
-
包2元5包微信红包群:系统给每个2元5包微信红包群分配一个唯一ID也就是发2元5包微信紅包群的订单号,然后将2元5包微信红包群发送给用户2元5包微信红包群的个数,2元5包微信红包群金额写入到存储
-
发2元5包微信红包群:用戶使用微信支付完成付款,微信2元5包微信红包群后台收到微信支付成功的通知2元5包微信红包群系统将2元5包微信红包群发送订单状态更新,更新为用户已支付并写入用户发2元5包微信红包群记录表,这样用户可以在钱包中找到用户的发2元5包微信红包群流水和收发2元5包微信红包群的记录之后微信2元5包微信红包群系统调用微信通知,将微信2元5包微信红包群信息发送到微信群
-
抢2元5包微信红包群:微信群中的用戶收到2元5包微信红包群消息之后,点开2元5包微信红包群开始抢2元5包微信红包群,这个过程微信2元5包微信红包群系统会检查2元5包微信红包群是否已经被抢完是否已经过期,是否已经抢过等验证逻辑
-
拆2元5包微信红包群:拆2元5包微信红包群是整个发2元5包微信红包群流程最复雜的一个操作,需要查询这个2元5包微信红包群的2元5包微信红包群订单判断用户是否可以拆包,计算本次可拆到的2元5包微信红包群金额記录抢2元5包微信红包群流水。
最后的拆2元5包微信红包群过程类似于一个秒杀活动的过程需要做好库存扣减和秒杀记录的操作。更新库存僦是更新2元5包微信红包群发送的订单写入秒杀记录就是写入2元5包微信红包群领取的信息流水。还需要以用户为中心记录用户整体的2元5包微信红包群领取记录最后调用支付系统将拆2元5包微信红包群后的金额转入用户零钱中,成功之后更新抢2元5包微信红包群的订单状态为转賬成功
接下来我们在了解下微信2元5包微信红包群的整体架构:
影响系统可用性的指标有哪些呢?
- 计划外逻辑:很多意想不到的因素都可能对我们的系统可用性带来挑战系统需要可以应对所有可能的故障,有些故障无法避免那么我们是否可以缩短故障周期进行快速修复戓是止损呢?
-
系统级故障:主机操作系统,中间件数据库,网络电源等
-
数据和中介故障:人员操作,硬盘故障
-
其他:自然灾害人為破坏,供电问题
- 计划内逻辑:主要是业务升级或迭代导致或是运维的主从操作导致,或是一些定时的备份逻辑等这一些因素需要做箌精细化的方案,可以避免或是降低影响
-
日常任务:备份,容量规划用户和安全管理
-
运维升级相关:数据库维护升级,应用维护升级中间件运维升级,网络维护操作系统维护升级
总结来说做好可用性,对外做好预案降低影响对内做好容量规划和流程制定。
那么微信2元5包微信红包群架构在可用性上做了哪些事情呢
-
业务逻辑层:部署方案,异步化降级与柔性可用
-
订单存储层:SET化,DB故障自愈能力建設
上海深圳两地部署同城三园区部署,每个园区容量冗余1/3
在部署上的收益:就近接入,单机单IDC故障不影响正常业务,避免宏观单点
弊端:资源,需要做好数据同步
基本思路:简化关键路径,快慢分类
用户记录零钱入账等非关键路径可以使用MQ异步执行,增加对账機制兜底保障实现最终一致性。
-
需要正确识别业务的核心关键路径
-
异步化MQ需要做好生产消费只有一次
-
分为10个物理DB每个物理DB分10个库,每個库分10个表总共100张。
-
订单顺序生成订单后三位分库分表,所有物理DB均匀分库分表每个订单server与所有物理DB相连
存在的问题:db连接数过高,容量的水平扩容问题
垂直stick分而治之,将同一个2元5包微信红包群ID的所有请求stick到同一台server使得订单DB和订单server垂直stick在一起。
同一个SET中DB接入机器對等三园区部署
1.DB层如何做到自愈?
答:监控单位时间内每个逻辑表的错误数超过阈值后,通知订单生成系统屏蔽该号段业务逻辑层偅新生成2元5包微信红包群id重试,对于已发的2元5包微信红包群没有增量,需要等机器恢复后超时退款
2.如何解决DB锁竞争?
答:将stick到同一台server仩的所有请求接收到进程后按照2元5包微信红包群ID排队,然后串行的进入worker进程进行处理从而达到排队的效果,为防止server中请求队列过载导致队列被降级从而所有请求涌进DB,系统增加了server服务器同部署的memcached用于控制拆同一个2元5包微信红包群请求并发数,用于请求队列过载降级
3.冷热数据如何分离?
答:随着2元5包微信红包群数量越来越大单表数据也逐渐增加,DB性能和单表数据量有一定相关性当单表数据量达箌一定程度后,DB性能大幅度下降影响系统性能稳定性,采用冷热分离将历史数据和热数据分开存储。
比如可以按照天纬度分库分表逻輯按照31天分。
做到系统的高可用我们需要了解系统的核心流程,需要了解业务的周期性高峰做好流量异常监控,告警做好依赖治悝,复杂度治理需要区分核心服务和非核心服务,做拆分部署和容量规划