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

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

一、红包系统的业务场景

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

  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. 提升高可用的方案:利用异步机制将拆红包和转账操作异步化;利用流控和降级措施避免服务不可用的场景出现;人工干预有问题的记录;对计划内风险因素做好规划和定时处理,计划外风险因素做好演练和预案;
目录
相关文章
|
存储 NoSQL 安全
红包系统架构设计
红包系统架构设计
2102 0
红包系统架构设计
|
11月前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
设计模式 安全 Go
|
存储 数据库 索引
B树与B+树区别
B树与B+树区别
3142 1
|
关系型数据库 MySQL Shell
Mac安装Mysql(图文解说详细版)
Mac安装Mysql(图文解说详细版)
Mac安装Mysql(图文解说详细版)
|
存储 缓存 负载均衡
图解一致性哈希算法,看这一篇就够了!
近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。
24510 64
图解一致性哈希算法,看这一篇就够了!
|
存储 人工智能 缓存
如何设计一个速率限制器(令牌桶/漏桶/固定窗口/滑动窗口)
如何设计一个速率限制器(令牌桶/漏桶/固定窗口/滑动窗口)
如何设计一个速率限制器(令牌桶/漏桶/固定窗口/滑动窗口)
|
存储 关系型数据库 MySQL
MySQL中的字符集与排序规则详解
在 MySQL 中,字符集(Character Set)用于确定可以在数据库中存储的字符集合,而排序规则(Collation)用于指定比较和排序字符串的规则。下面是关于 MySQL 中字符集和排序规则的一些详细信息: 1. 字符集(Character Set): - 字符集定义了可用于存储数据的字符集合。 - MySQL 支持多种字符集,包括常见的 UTF-8、GBK、Latin1 等。 - 你可以在创建数据库、表或列时指定所需的字符集。 2. 排序规则(Collation): - 排序规则定义了比较字符串时使用的规则。 - 比较和排序规则根据不同的语言和地区
801 0
|
Java 测试技术 Maven
maven打包全流程原理
maven打包全流程原理
827 0
优惠券系统设计
确认优惠券的类型,首先我们要区分优惠券和代金券
1010 0
优惠券系统设计