微信红包的架构设计简介

标签: 高并发编程 | 发表时间:2015-05-04 10:37 | 作者:
出处:http://colobu.com/

来源于QCon某高可用架构群整理,整理 by 朱玉华
背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢)
概况:2014年微信红包使用 数据库硬抗整个流量,2015年使用 cache抗流量。

  1. 微信的金额什么时候算?
    答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储。
    采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。

  2. 实时性:为什么明明抢到红包,点开后发现没有?
    答:2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。
    2015年的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。

  3. 分配:红包里的金额怎么算?为什么出现各个红包金额相差很大?
    答:随机,额度在0.01和剩余平均值 2之间。 例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。
    当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7 2)=17.14之间。
    注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(Tim老师也觉得上述算法太复杂,不知基于什么样的考虑)。

    这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。
    如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。

  4. 红包的设计
    答:微信从财付通拉取金额数据过来,生成个数/红包类型/金额放到redis集群里,app端将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回。根据红包的逻辑处理成功得到令牌请求,则由财付通进行一致性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致就强制回归。

  5. 并发性处理:红包如何计算被抢完?
    答:cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光。财付通按照 20万笔每秒入账准备,但实际还不到 8万每秒

  6. 通如何保持8w每秒的写入?
    答:多主sharding,水平扩展机器。

  7. 数据容量多少?
    答:一个红包只占一条记录,有效期只有几天,因此不需要太多空间。

  8. 查询红包分配,压力大不?
    答:抢到红包的人数和红包都在一条cache记录上,没有太大的查询压力。

  9. 一个红包一个队列?
    答:没有队列,一个红包一条数据,数据上有一个计数器字段。

  10. 有没有从数据上证明每个红包的概率是不是均等?
    答:不是绝对均等,就是一个简单的拍脑袋算法。

  11. 拍脑袋算法,会不会出现两个最佳?
    答:会出现金额一样的,但是手气最佳只有一个,先抢到的那个最佳。

  12. 每领一个红包就更新数据么?
    答:每抢到一个红包,就cas更新剩余金额和红包个数。

  13. 红包如何入库入账?
    数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作。

  14. 入帐出错怎么办?比如红包个数没了,但余额还有?
    答:最后会有一个take all操作。另外还有一个对账来保障。

下面这张图是@周帆 同学的杰作!

相关 [微信 红包 架构] 推荐:

微信红包的架构设计简介

- - 鸟窝
来源于QCon某高可用架构群整理,整理 by 朱玉华. 背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢). 概况:2014年微信红包使用 数据库硬抗整个流量,2015年使用 cache抗流量. 答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.

微信红包算法探讨

- - SegmentFault 最新的文章
今年过年微信红包成了全民焦点,虽然大多数的红包就一块八角的样子,还是搞得大家乐此不彼地,蛋爷我年三十晚什么都没干就守在手机旁边不是摇手机红包就是抢群红包. 作为一名程序猿,自然会想了解下红包的实现细节. 我在网上谷歌了下,微信目前是没有公布红包的实现细节的,所以这里就提出一个自己的方案. 红包领了不少,据观察红包主要有以下几个限制条件:.

微信红包实现原理

- - PHP源码阅读,PHP设计模式-胖胖的空间
以下内容来源于QCon某高可用架构群聊天记录整理 背景:有某个朋友咨询微信红包的架构,在官方或非官方同学的解释和讨论中得出以下讨论内容,在此期间有多个同学发红包做现网算法测试. 当有人在群里发了一个N人的红包,总金额M元,后台大概发生的事情如下:. 在数据库中增加一条红包记录,存储到CKV,设置过期时间;.

从微信红包看微信社交关系链

- - 人人都是产品经理
马年的春节,微信红包是最成功的移动互联网产品,短短几天内就有几千万人参与,很漂亮的病毒营销产品,为微信绑定银行卡支付立下了汗马功劳. 至于微信红包的成功之处,不外乎各路媒体提到的几点:一、微信庞大而活跃的用户群体;二、巧妙的踩准了过年发红包的习俗;三、微信社交关系链的威力. 不过这样的解读稍微有点粗疏,不妨再深入的想一想,微信红包是怎样引爆流行的,有何特别之处.

微信架构的启示

- - Tim[后端技术]
腾讯大讲堂中最近分享了周颢演讲的 微信技术总监解读微信架构的秘密,看完视频的一些心得. 微信的技术设计上有很多微创新,看起来都很小,但是对于系统的稳定性、用户体验及开发敏捷都具有重要作用. 由于客户端升级不便,从技术设计上尽量利用后端的设计来减少依赖客户端升级的方法. 如某个版本新增了群聊功能,按常规思路,需要所有客户端升级才能全部打通.

微信红包真有那么火?PR忙否认

- - 钛媒体网
钛媒体注:春节期间的 微信红包火了后,微信团队,主要是红包团队并没有忙着宣传红包有多火,而是急于证明,红包其实没有传说中的那么火. 对于各种流传的比如支付用户过亿的数据等都连忙否认,微信PR澄清的相关数据是,截止除夕夜,平均每个红包10.7元,抢了最多红包的:869个. 除夕夜参与红包活动的总人数达到482万,最高峰出现在零点时分,瞬间峰值达到每分钟2.5万个红包被拆开.

微信红包金额分配的算法

- - 后端技术 by Tim Yang
虽然春节已经过去一段时间,但不少微信群里面依旧乐此不疲的在玩发红包活动,用户自发的将最初的一个春节拜年的场景功能慢慢演化成一个长尾功能. 用户在微信中抢红包时分成抢包和拆包两个操作. 抢包决定红包是否还有剩余金额,但如果行动不够迅速,在拆包阶段可能红包已经被其他用户抢走的情况. 据某架构群腾讯财付通专家反馈,红包的金额是拆的时候实时计算,而不是预先分配,实时计算基于内存,不需要额外存储空间,并且实时计算效率也很高.

扛住 100 亿次红包请求的架构是这样设计的!

- - DockOne.io
偶然看到了《 扛住 100 亿次请求——如何做一个“有把握”的春晚红包系统》一文,看完以后,感慨良多,收益很多. 正所谓他山之石,可以攻玉,虽然此文发表于 2015 年,我看到时已经过去良久,但是其中的思想仍然可以为很多后端设计借鉴. 同时作为一名微信后端工程师,看完以后又会思考,学习了这样的文章以后,是否能给自己的工作带来一些实际的经验呢.

微信晒单红包大数据:80后最多 广东最壕

- - cnBeta.COM
逢年过节微信抢红包已成为国人最喜爱的生活方式之一,科客从微信官方获悉,春节前微信团队一方面在加紧新春期间服务稳定性的测试与准备,另一方面抽空公布了2016年微信红包使用习惯的多项数据,下面带各位了解相关详情. 1、80后最爱收发微信红包,90后紧随其后. 数据显示2016年全年,80后是收发微信红包最活跃的群体,无论是“收红包”还是“发红包”,次数上都领先于其他年龄层.