当前位置:首页 > 科技  > 软件

听说你会架构设计?来,弄一个红包系统

来源: 责编: 时间:2023-12-15 09:50:47 383观看
导读大家好,我是小❤,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。1. 引言当我那天拿着手机,正在和朋友们的微信群里畅聊着八卦新闻和即将到来的周末计划时,忽然一条带着喜意的

大家好,我是小❤,一个漂泊江湖多年的 985 非科班程序员,曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。QgL28资讯网——每日最新资讯28at.com

1. 引言

当我那天拿着手机,正在和朋友们的微信群里畅聊着八卦新闻和即将到来的周末计划时,忽然一条带着喜意的消息扑面而来,消息正中间赫然写着八个大字:恭喜发财,大吉大利。QgL28资讯网——每日最新资讯28at.com

图片图片QgL28资讯网——每日最新资讯28at.com

抢红包!!相信大部分人对此都不陌生,自 2015 年春节以来,微信就新增了各类型抢红包功能,吸引了数以亿万级的用户参与体验,今天,我们就来聊一聊这个奇妙有趣的红包系统。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

2. 概要设计

2.1 系统特点

图片图片QgL28资讯网——每日最新资讯28at.com

抢红包系统从功能拆分,可以分为包红包、发红包、抢红包和拆红包 4 个功能。QgL28资讯网——每日最新资讯28at.com

对于系统特性来说,抢红包系统和秒杀系统类似。QgL28资讯网——每日最新资讯28at.com

图片图片QgL28资讯网——每日最新资讯28at.com

每次发红包都是一次商品秒杀流程,包括商品准备,商品上架,查库存、减库存,以及秒杀开始,最终的用户转账就是红包到账的过程。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

2.2 难点

相比秒杀活动,微信发红包系统的用户量更大,设计更加复杂,需要重视的点更多,主要包括以下几点。QgL28资讯网——每日最新资讯28at.com

1、高并发

海量并发请求,秒杀只有一次活动,但红包可能同一时刻有几十万个秒杀活动。QgL28资讯网——每日最新资讯28at.com

比如 2017 鸡年除夕,微信红包抢红包用户数高达 3.42 亿,收发峰值 76 万/秒,发红包 37.77 亿 个。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

2、安全性要求

红包业务涉及资金交易,所以一定不能出现超卖、少卖的情况。QgL28资讯网——每日最新资讯28at.com

  • 超卖:发了 10 块钱,结果抢到了 11 块钱,多的钱只能系统补上,如此为爱发电应用估计早就下架了;
  • 少卖:发了 10 块钱,只抢了 9 块,多的钱得原封不动地退还用户,否则第二天就接到法院传单了。

QgL28资讯网——每日最新资讯28at.com

3、严格事务

参与用户越多,并发 DB 请求越大,数据越容易出现事务问题,所以系统得做好事务一致性。QgL28资讯网——每日最新资讯28at.com

这也是一般秒杀活动的难点所在,而且抢红包系统涉及金钱交易,所以事务级别要求更高,不能出现脏数据。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

3. 概要设计

3.1 功能说明

抢红包功能允许用户在群聊中发送任意个数和金额的红包,群成员可以抢到随机金额的红包,但要保证每个用户的红包金额不小于 0.01 元。QgL28资讯网——每日最新资讯28at.com

图片图片QgL28资讯网——每日最新资讯28at.com

抢红包的详细交互流程如下:QgL28资讯网——每日最新资讯28at.com

  1. 用户接收到抢红包通知,点击通知打开群聊页面;
  2. 用户点击抢红包,后台服务验证用户资格,确保用户尚未领取过此红包;
  3. 若用户资格验证通过,后台服务分配红包金额并存储领取记录;
  4. 用户在微信群中看到领取金额,红包状态更新为“已领取”;
  5. 异步调用支付接口,将红包金额更新到钱包里。

QgL28资讯网——每日最新资讯28at.com

3.2 数据库设计

红包表 redpack 的字段如下:QgL28资讯网——每日最新资讯28at.com

  • id: 主键,红包ID
  • userId: 发红包的用户ID
  • totalAmount: 总金额
  • surplusAmount: 剩余金额
  • total: 红包总数
  • surplusTotal: 剩余红包总数

该表用来记录用户发了多少红包,以及需要维护的剩余金额。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

红包记录表 redpack_record 如下:QgL28资讯网——每日最新资讯28at.com

  • id: 主键,记录ID
  • redpackId: 红包ID,外键
  • userId: 用户ID
  • amount: 抢到的金额

记录表用来存放用户具体抢到的红包信息,也是红包表的副表。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

3.3 发红包

  1. 用户设置红包的总金额和个数后,在红包表中增加一条数据,开始发红包;
  2. 为了保证实时性和抢红包的效率,在 Redis 中增加一条记录,存储红包 ID 和总人数 n;
  3. 抢红包消息推送给所有群成员。

QgL28资讯网——每日最新资讯28at.com

3.4 抢红包

从 2015 年起,微信红包的抢红包和拆红包就分离了,用户点击抢红包后需要进行两次操作。QgL28资讯网——每日最新资讯28at.com

这也是为什么明明有时候抢到了红包,点开后却发现该红包已经被领取完了。QgL28资讯网——每日最新资讯28at.com

图片图片QgL28资讯网——每日最新资讯28at.com

抢红包的交互步骤如下:QgL28资讯网——每日最新资讯28at.com

  1. 抢红包:抢操作在 Redis 缓存层完成,通过原子递减的操作来更新红包个数,个数递减为 0 后就说明抢光了。
  2. 拆红包:拆红包时,首先会实时计算金额,一般是通过二倍均值法实现(即 0.01 到剩余平均值的 2 倍之间)。
  3. 红包记录:用户获取红包金额后,通过数据库的事务操作累加已经领取的个数和金额,并更新红包表和记录表。
  4. 转账:为了提升效率,最终的转账为异步操作,这也是为什么在春节期间,红包领取后不能立即在余额中看到的原因。

上述流程,在一般的秒杀活动中随处可见,但是,红包系统真的有这么简单吗?QgL28资讯网——每日最新资讯28at.com

当用户量过大时,高并发下的事务一致性怎么保证,数据分流如何处理,红包的数额分配又是怎么做的,接下来我们一一探讨。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

4. 详细设计

由于是秒杀类设计,以及 money 分发,所以我们重点关注抢红包时的高并发解决方案和红包分配算法。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

4.1 高并发解决方案

首先,抢红包系统的用户量很大,如果几千万甚至亿万用户同时在线发抢红包,请求直接打到数据库,必然会导致后端服务过载甚至崩溃。QgL28资讯网——每日最新资讯28at.com

而在这种业务量下,简单地对数据库进行扩容不仅会让成本消耗剧增,另一方面由于存在磁盘的性能瓶颈,所以大概率解决不了问题。QgL28资讯网——每日最新资讯28at.com

所以,我们将解决方案集中在 减轻系统压力、提升响应速度 上,接下来会从缓存、加锁、异步分治等方案来探讨可行性。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

1、缓存

和大多数秒杀系统设计相似,由于抢红包时并发很高,如果直接操作 DB 里的数据表,可能触发 DB 锁的逻辑,导致响应不及时。QgL28资讯网——每日最新资讯28at.com

图片图片QgL28资讯网——每日最新资讯28at.com

所以,我们可以在 DB 落盘之前加一层缓存,先限制住流量,再处理红包订单的数据更新。QgL28资讯网——每日最新资讯28at.com

这样做的优点是用缓存操作替代了磁盘操作,提升了并发性能,这在一般的小型秒杀活动中非常有效!QgL28资讯网——每日最新资讯28at.com

但是,随着微信使用发&抢红包的用户量增多,系统压力增大,各种连锁反应产生后,数据一致性的问题逐渐暴露出来:QgL28资讯网——每日最新资讯28at.com

  • 假设库存减少的内存操作成功,但是 DB 持久化失败了,会出现红包少发的问题;
  • 如果库存操作失败,DB 持久化成功,又可能会出现红包超发的问题。

而且在几十万的并发下,直接对业务加锁也是不现实的,即便是乐观锁。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

2、加锁

在关系型 DB 里,有两种并发控制方法:分为乐观锁(又叫乐观并发控制,Optimistic Concurrency Control,缩写 “OCC”)和悲观锁(又叫悲观并发,Pessimistic Concurrency Control,缩写“PCC”)。QgL28资讯网——每日最新资讯28at.com

图片图片QgL28资讯网——每日最新资讯28at.com

悲观锁在操作数据时比较悲观,认为别的事务可能会同时修改数据,所以每次操作数据时会先把数据锁住,直到操作完成。QgL28资讯网——每日最新资讯28at.com

乐观锁正好相反,这种策略主打一个“信任”的思想,认为事务之间的数据竞争很小,所以在操作数据时不会加锁,直到所有操作都完成到提交时才去检查是否有事务更新(通常是通过版本号来判断),如果没有则提交,否则进行回滚。QgL28资讯网——每日最新资讯28at.com

在高并发场景下,由于数据操作的请求很多,所以乐观锁的吞吐量更大一些。但是从业务来看,可能会带来一些额外的问题:QgL28资讯网——每日最新资讯28at.com

  1. 抢红包时大量用户涌入,但只有一个可以成功,其它的都会失败并给用户报错,导致用户体验极差;
  2. 抢红包时,如果第一时间有很多用户涌入,都失败回滚了。过一段时间并发减小后,反而让手慢的用户抢到了红包;
  3. 大量无效的更新请求和事务回滚,可能给 DB 造成额外的压力,拖慢处理性能。

总的来说,乐观锁适用于数据竞争小,冲突较少的业务场景,而悲观锁也不适用于高并发场景的数据更新。QgL28资讯网——每日最新资讯28at.com

因此对于抢红包系统来说,加锁是非常不适合的。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

3、异步分治

综上所述,抢红包时不仅要解决高并发问题、还得保障并发的顺序性,所以我们考虑从队列的角度来设计。QgL28资讯网——每日最新资讯28at.com

我们知道,每次包红包、发红包、抢红包时,也有先后依赖关系,因此我们可以将红包 ID 作为一个唯一 Key,将发一次红包看作一个单独的 set,各个 set 相互独立处理。QgL28资讯网——每日最新资讯28at.com

图片图片QgL28资讯网——每日最新资讯28at.com

这样,我们就把海量的抢红包系统分成一个个的小型秒杀系统,在调度处理中,通过对红包 ID 哈希取模,将一个个请求打到多台服务器上解耦处理。QgL28资讯网——每日最新资讯28at.com

然后,为了保证每个用户抢红包的先后顺序,我们把一个红包相关的操作串行起来,放到一个队列里面,依次消费。QgL28资讯网——每日最新资讯28at.com

从上述 set 分流我们可以看出,一台服务器可能会同时处理多个红包的操作,所以,为了保证消费者处理 DB 不被高并发打崩,我们还需要在消费队列时用缓存来限制并发消费数量。QgL28资讯网——每日最新资讯28at.com

抢红包业务消费时由于不存储数据,只是用缓存来控制并发。所以我们可以选用大数据量下性能更好的 Memcached。QgL28资讯网——每日最新资讯28at.com

除此之外,在数据存储上,我们可以用红包 ID 进行哈希分表,用时间维度对 DB 进行冷热分离,以此来提升单 set 的处理性能。QgL28资讯网——每日最新资讯28at.com

综上所述,抢红包系统在解决高并发问题上采用了 set 分治、串行化队列、双维度分库分表 等方案,使得单组 DB 的并发性能得到了有效提升,在应对数亿级用户请求时取得了良好的效果。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

4.2 红包分配算法

抢红包后,我们需要进行拆红包,接下来我们讨论一下红包系统的红包分配算法。QgL28资讯网——每日最新资讯28at.com

红包金额分配时,由于是随机分配,所以有两种实现方案:实时拆分和预先生成。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

1、实时拆分

实时拆分,指的是在抢红包时实时计算每个红包的金额,以实现红包的拆分过程。QgL28资讯网——每日最新资讯28at.com

这个对系统性能和拆分算法要求较高,例如拆分过程要一直保证后续待拆分红包的金额不能为空,不容易做到拆分的红包金额服从正态分布规律。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

2、预先生成

预先生成,指的是在红包开抢之前已经完成了红包的金额拆分,抢红包时只是依次取出拆分好的红包金额。QgL28资讯网——每日最新资讯28at.com

这种方式对拆分算法要求较低,可以拆分出随机性很好的红包金额,但通常需要结合队列使用。QgL28资讯网——每日最新资讯28at.com

QgL28资讯网——每日最新资讯28at.com

3、二倍均值法

综合上述优缺点考虑,以及微信群聊中的人数不多(目前最高 500 人),所以我们采用实时拆分的方式,用二倍均值法来生成随机红包,只满足随机即可,不需要正态分布。QgL28资讯网——每日最新资讯28at.com

故可能出现很大的红包差额,但这更刺激不是吗

本文链接:http://www.28at.com/showinfo-26-46358-0.html听说你会架构设计?来,弄一个红包系统

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 关于响应式布局,你需要了解的知识点

下一篇: 详解Linux开源项目中常用的tput命令

标签:
  • 热门焦点
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大“烤”之下的除了众生,还有各大企业发布的ESG报告。ESG是“环境保
  • 小米MIX Fold 3下月亮相:今年唯一无短板的全能折叠屏

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都有新的进展,其中荣耀、三星都已陆续发布了最新的折叠屏旗舰,尤其号荣耀Magi
  • iQOO Neo8 Pro即将开售:到手价3099元起 安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top