红包场景的系统设计和实践

一、红包系统的业务场景

红包场景的业务处理流程:

  1. 包红包:需要查询用户账户金额,需要调用账户查询服务
  2. 发红包:需要红包服务生成红包订单id
  3. 抢红包:通过红包订单id实时生成单笔金额凭证
  4. 拆红包:有两条处理主线,一个是实时计算抢购红包金额,一个是发送方和接收方的转账操作

image-20231018002114849

二、红包系统的技术和架构特点

  1. 红包系统的数据读写特点是:写多读少

  2. 瞬时对DB和cache的请求并发量非常大,需要解决的是高并发的问题

  3. 对于涉及资金的业务,需要考虑资损和异常处理的方案,即需要较高的可靠性保障

  4. 在拆红包时,红包金额显示和转账操作可以异步化,即信息流和资金流可以分离

三、整体方案设计

1.业务逻辑层

  • 多实例服务和负载均衡策略

部署多实例的红包服务,提升服务的处理能力,有状态的信息抽取到分布式缓存中,在进行服务路由的时候,可以选择红包订单号进行路由,便于后期红包算法的实现。

  • 双缓存策略

选择构建本地缓存和分布式缓存双缓存的方案,redis做分布式缓存,主要用来保存全局缓存数据,包括用户信息和群组信息等,本地缓存主要用来保存中间值或状态信息,在红包系统中保存发出的红信息、抢购的红包信息等;

抢红包环节是流量最大的环节,将红包信息预先加载到cache中来,这样就不用再请求DB,降低对DB的压力;

  • 异步处理

由于在拆红包的时候并发量肯定非常大,但其实用户首先关注的只是抢到红包的金额等信息,实际钱包中的到账金额不会实时关注,所以抢购的红包信息,比如抢购金额等呈现是同步计算的,但钱包金额转账操作可以异步操作;

2.数据存储层

  • 分布分表方案

红包服务需要重点解决的问题就是并发请求量过大,分库是常见的解决方案,可以按照订单号进行分库,将原集中在一个数据库的数据分散到多个数据库,势必会降低对单库的访问压力;

在设计分库的时候需要考虑分片键,在红包场景下可以使用红包订单号来做分片键。

3.异常处理方案

  • 流控和降级策略

在发红包的时候处理好流量控制,流量过大需要有流量降级的策略。

  • 异常记录入库,后续人工补偿

数据写入失败记录入库,后期人工核查和补账;

  • 风控措施

涉及到资金的业务,可能就存在黑产等风险,需要引入风控措施;

4.部署方案

  • 集群部署

按照上述的方案,业务服务需要做集群部署,同样数据库服务也需要做集群部署;一方面是提升并发处理的性能,另一份方面是避免单点故障,提高可靠性。

四、重点问题的解决方案

红包生成算法

本地缓存做拆红包的实时处理,红包订单做key,利用redis的原子性做红包分拆的实时处理;红包金额在0.01~剩余用户平局值*2之间

故障处理思路

缓存故障则降级到访问数据库;

实时处理出问题则异步补偿,异步补偿出问题则记录问题,后续凭记录手动补账

五、总结

  1. 红包的业务场景主要是:包红包-->发红包-->抢红包-->拆红包
  2. 技术和架构特点:多写少读的场景,瞬时并发量比较大,拆红包和转账可以异步执行,可以实现双缓存操作
  3. 解决高并发的方案:服务多实例,按照订单号进行动态路由;实现双缓存设计,热点数据可以提前预热;红包算法在内存中进行实时计算;
  4. 提升高可用的方案:利用异步机制将拆红包和转账操作异步化;利用流控和降级措施避免服务不可用的场景出现;人工干预有问题的记录;对计划内风险因素做好规划和定时处理,计划外风险因素做好演练和预案;

    本文由博客一文多发平台 OpenWrite 发布!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yangnk42

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值