过年了,抢红包这一全民运动再次兴起。
毕导在昨天发了《如何抢到大红包》这一视频。我看了后感觉挺有意思,就来唠唠抢红包这件事儿。
《如何抢到大红包》
微信红包架构
当有人在群里发了一个 N 人的红包,总金额 M 元,后台大概发生的事情如下:
发红包
- 在数据库中增加一条红包记录,存储到CKV,设置过期时间;
- 在 Cache(可能是腾讯内部 kv 数据库,基于内存,有落地,有内核态网络处理模块,以内核模块形式提供服务))中增加一条记录,存储抢红包的人数 N
抢红包
此操作分为抢和拆两部分
抢
抢操作在 Cache 层完成,通过原子减操作进行红包数递减,到 0 就说明抢光了,最终实际进入后台拆操作的量不大,通过操作的分离将无效请求直接挡在 Cache 层外面。
这里的原子减操作并不是真正意义上的原子减操作,是其 Cache 层提供的 CAS ,通过比较版本号不断尝试,存在一定程度上的冲突,冲突的用户会放行,让其进入下一步拆的操作,这也解释了为啥有用户抢到了拆开发现领完了的情况。
拆
拆红包在数据库完成,通过数据库的事务操作累加已经领取的个数和金额,插入一条领取流水,入账为异步操作,这也解释了为啥在春节期间红包领取后在余额中看不到。
拆的时候会实时计算金额,其金额为
1 分到剩余平均值 2 倍之间随机数,一个总金额为 M 元的红包,最大的红包为 M * 2 /N(且不会超过 M )
当拆了红包后会更新剩余金额和个数。财付通按 20 万笔每秒入账准备,实际只到 8 万每秒。
以上即为微信红包的简要架构,我们所要知道的一点就是:
每个人能抢到的金额 ,服从 0.01 到二倍剩余均值间的均匀分布。
所以理论上后抢出大包的概率大。
如果你想抢到大红包,那么抢红包时应该先憋一会儿。但是别憋太久了,否则结果会是这样
Copyright: International CC BY-NC-SA 4.0
真实真实~一新来访~@(滑稽)