红包系统架构设计

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 红包系统架构设计

红包系统架构设计


软件系统设计,第一步,确定关键需求。

需求分析

比如红包这个系统,需要有如下:

  1. 包红包
  2. 发红包
  3. 抢红包
  4. 拆红包
  5. 不能抢超,也就是说红包个数,金额是有限的,不能超的。
  6. 支持高并发,例如1亿用户凌晨12点开始抢红包。

上面的 4 方面就是关键需求。

  • 包红包:系统为每个红包设置一个 id ,然后将红包发送个用户,这里需要设置 红包金额,红包个数,要发送的用户,存储这些信息。
  • 发红包,设置完红包参数后,微信支付,完成付款,然后收到付款成功通知,红包系统更新红包订单状态,更新为已支付,并写入红包发送记录表。这样用户可以将用户的红包信息和红包的收发记录发出,红包系统调用微信通知,将红包信息发送到微信群。
  • 抢红包,微信群用户收到红包后,点开,红包系统会校验红包是否被抢完,是否过期。
  • 拆红包,拆红包时,要先查询红包订单,判断是否可拆,计算本次拆的红包金额,记录抢红包流水。

流程如下:

image.png

几个问题


抢红包那一刻 时间短,瞬时用户量大

  1. 为啥有时候抢到了红包,点开后就是没有,说明抢和拆是分开的,抢只能说明交易被受理,扣减库存成功才能真的说被抢到了。
  2. 红包金额怎么算?
  3. 红包金额什么时候算?
  4. 如何计算红包被抢完了?
  5. 如何保证每秒8w的写入?
  6. 如何防止恶意请求?
  7. 领一个红包就更新数据么?
  8. 红包如何入账?


针对上面的问题,可以做出如下思考:


秒杀场景是读多写少的。

第一反应,会想到 Redis 计数,红包个数减到0 表示红包抢完。但是有个问题,Redis 有 decr 原子递减,redis 原子递减会变成负数,还是有超抢问题。

Redis  内嵌了lua 支持,解决了长久以来多个命令组合的问题。有点类似事务,有一定原子性,可以用完成一定事务性操作,可以将扣减操作写在lua脚本里,然后 Redis 去执行,扣减到0 返回 false。这样避免超抢超卖。

但是随之而来又有一个问题? Redis 并发很高么,上亿用户同时请求怎么办 ,QPS 怎么也要到10w。

那就得 对 Redis 做文章:

Redis 集群,主从同步,读写分离

假设这时候有黑客或黄牛怎么办,在不断的用脚本点击链接或者红包,怎么避免?

链接不能写死,用MD5 进行链接加密,后台验证之后才能通过。否则认为是攻击。

通过 Redis 或者链接加密的方式 已经把大部分交易拦住了,但是这短时间还是有大部分交易,比如凌晨12点10亿人抢5000w个红包,现在放了5000w个请求进来,并发还是很高, 怎么办?这5000w 个人说明抢到红包了,接下来就是拆红包了。

这个时候就需要流量消峰,会想到使用 MQ 队列来排队处理用户请求。阀值或者说库存以 Redis 为主,需要扣减库存。

流量削峰了,使得流量平缓,慢慢处理。

拆红包过程就是主要的业务逻辑,主要包含3步骤:

  1. 锁库存
  2. 插入秒杀记录
  3. 更新库存

拆红包过程:扣减库存和秒杀记录的操作,更新库存就是更新红包发送的订单,还有就是写入秒杀记录就是写入红包领取的信息流水。还需要以用户为中心记录用户整体领了多少红包。最后调用支付系统将拆红包后的金融转入用户余额,成功之后更新抢红包的订单状态为转账成功。

为提高性能,往往将库存信息放到内存 Cache 中, 内存Cache 操作成功后给Server 返回成功,然后异步落 DB 持久化。


基于上面的问题,考虑下微信红包怎么设计?


微信红包用户发一个红包时,有一个系统 ID ,作为这个红包的唯一标识,接着有 包,发 ,抢,拆 都与 ID 关联。红包系统根据 ID ,按照一定规则,垂直上下切分,切分后一个垂直链条上的逻辑 server 服务器,包含一个DB ,同一个红包 ID 的所有请求均路由到同一个 Set 内处理。这样系统之间相互独立,相互解耦。将海量事务操作化成小量。

image.png

同一个请求如何路由到同一个逻辑 Server ?

同个红包 ID 的所有请求,按照红包 ID  路由到同一个 Set ,一个逻辑 Server 会存在多个 Server ,但是 这些 Server 共享同一个 DB。

image.png

单点 Server 如何请求排队


当红包 ID 路由到同一台Server 上时,请求被受理,此时需要进入队列。串行的执行。

image.png

memcached 控制并发


memcached 是用来控制并发的,当队列过载的时候,拒绝服务。具体来说,利用memcached的CAS原子增操作,控制同时进入DB执行拆红包事务的请求数,超过预先设定数值则直接拒绝服务,用于DB负载升高时的降级体验。


双维度分库分表


根据红包ID 的hash 值的基础上做多库多表。在此基础之上,再根据,红包订单的时间进行分表,简单的来说,就是形成 db_xx.t_y_dd 的“库.表”的结构,其中xx|y是红包ID的hash值后三位,dd的取值范围在1~31,代表一个月天数最多31天。

server 还需要进行 包,发,抢,拆,几个操作。可以分别封装成单个微服务,进行分布式部署,提高处理能力。


总结


微信红包系统在解决高并发问题上的设计,主要采用了SET分治、请求排队、双维度分库表等方案,可以使得红包系统Server适应高并发,同时Server采用 Redis 库存扣减防止超卖,异步入 DB 等方式提高并发能力。


参考资料

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
新零售 供应链 小程序
拼团公排互助商城系统开发|模式方案|详情需求
新零售模式是一种融合线上、线下商业以及物流,打破传统零售业的边界
|
6月前
|
缓存 算法 NoSQL
红包场景的系统设计和实践
红包场景的系统设计和实践
101 0
红包场景的系统设计和实践
|
2月前
|
新零售 大数据
全民拼团商城新零售系统开发|模式分析|详情方案
新零售是线上线下的结合,组合的价值主要是线下线上引流
|
4月前
|
存储 监控 供应链
一文讲透阿里商旅账单系统架构设计实践
阿里商旅作为飞猪旅行旗下面向企业客户的数字化差旅解决方案产品,依托飞猪旅行机票、酒店供应链为企业客户提供一站式的机票、酒店、火车票、用车等预订管控及结算票据服务。阿里商旅不仅是集团欢行的供应商,而且近几年在商业化差旅市场上崭露头角,服务了2万+中大型客户,43万+小微企业。
551 0
|
12月前
|
缓存 NoSQL 安全
优惠券系统架构设计与实践
优惠券系统架构设计与实践
1574 0
|
12月前
|
缓存 供应链 监控
商品系统架构设计与实践
商品系统架构设计与实践
331 0
|
SQL NoSQL Java
把优惠券系统设计的炉火纯青!(2)
公司新来一个同事,把优惠券系统设计的炉火纯青!
120 0
把优惠券系统设计的炉火纯青!(2)
|
Java 测试技术 Spring
把优惠券系统设计的炉火纯青!(1)
把优惠券系统设计的炉火纯青!
107 0
把优惠券系统设计的炉火纯青!(1)
vivo公司项目总结:优惠券系统架构设计与实践
惠券是电商常见的营销手段,具有灵活的特点,既可以作为促销活动的载体,也是重要的引流入口。优惠券系统是vivo商城营销模块中一个重要组成部分,早在15年vivo商城还是单体应用时,优惠券就是其中核心模块之一。
|
新零售 人工智能 JSON
拼团众筹开发逻辑丨拼团众筹系统开发(详细及方案)丨拼团众筹源码版
 新零售定义:个人、企业以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。