微信红包金额分配的算法

标签: 架构 | 发表时间:2015-04-30 02:21 | 作者:Tim
出处:http://timyang.net

虽然春节已经过去一段时间,但不少微信群里面依旧乐此不疲的在玩发红包活动,用户自发的将最初的一个春节拜年的场景功能慢慢演化成一个长尾功能。

用户在微信中抢红包时分成抢包和拆包两个操作。抢包决定红包是否还有剩余金额,但如果行动不够迅速,在拆包阶段可能红包已经被其他用户抢走的情况。

红包的金额是在什么时候算? 据某架构群腾讯财付通专家反馈,红包的金额是拆的时候实时计算,而不是预先分配,实时计算基于内存,不需要额外存储空间,并且实时计算效率也很高。每次拆红包时,系统取0.01到剩余平均值*2之间作为红包的金额。

为了保证每次操作的原子性,拆包过程中使用了CAS,确保每次只有一个并发用户拆包成功。拆包CAS失败的用户可以由系统自动进行重试。但也有可能在重试过程中被别的用户抢得先机而空手而归,因此严格意义拆包的调用也未能保证用户先到先得。

基于上面的原因,当时在群中提到这种算法有些复杂,微信红包为了减少存储,每次进行了一个理解稍复杂的实时计算。对比大部分架构师想到的预分配金额的做法,预先分配金额需要将金额保存在一个内存队列中,如果红包的份额较多,则需要较大的存储空间。而微信红包仅保存 count:balance 这样2个数字。count指还剩几个人可以抢,balance只还剩下的金额。

但是预分配金额也并不是非得需要额外存储。比如利用随机算法,在种子相同的情况下,随机数实际上返回的随机序列也是固定的。如以下Python代码,对于给定的seed 1024,每次执行返回的结果都是相同的。
>>> import random
>>> random.seed(1024)
>>> random.randint(1,100)
80
>>> random.randint(1,100)
49
>>> random.randint(1,100)
39
>>> random.randint(1,100)
83
>>> random.randint(1,100)
88

因此预分配金额也只需要额外存储一个种子,或利用一些红包id做加密变换零存储。而在发放红包时候,无需进行CAS操作,而只需要做一个DECR操作。当DECR<0时,表示红包被拆包抢完。由于DECR是原子操作,无需加锁,用简单的方法达到了先拆包先得,原理上不存在并发冲突的情况。

每个人分配的金额是:total * random(n) / random_total,不需要重复计算。
random(1)..random(n)不需要保存,因为对于给定的seed,random(1)到random(n)返回是固定的。

Reference:
1、https://www.zybuluo.com/yulin718/note/93148
2、网友基于聊天记录整理的微信红包架构图
wechat architecture

对于上文中提到的架构群感兴趣的朋友可以关注Tim公众号“TimYang_net”后回复“arch”获取进群方式。

Similar Posts:

相关 [微信 红包 算法] 推荐:

微信红包算法探讨

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

微信红包金额分配的算法

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

一个红包随机分配算法

- - 樂天笔记
本文简单的讨论一下随机分配红包的算法实现. Python的random库提供了randint函数用于得到整数a和整数b之间的一个随机的整数(包括a和b,其中a<=b). randint函数可以基于random函数实现. random函数可以随机生成 [0.0, 1.0)之间的一个小数,注意是左闭右开的区间.

微信红包实现原理

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

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

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

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

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

微信红包的架构设计简介

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

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

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

你是如何被微信广告选中的?微信广告引擎与社交传播算法实践

- - 36氪
编者按:本文来自微信公众号 “InfoQ”(ID:infoqchina),作者陈功;36氪经授权发布. 微信广告自 2014 年上线以来,分别发布了公众号与朋友圈广告. 微信广告系统承载了每天十亿级以上的访问量,紧密与微信平台生态相结合,同时利用了腾讯大数据体系进行效果优化. 本文首先会给大家展示微信广告的整体系统架构,并介绍重要的功能模块和数据流程.

缓存算法

- lostsnow - 小彰
没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率. 我是LRU缓存算法,我把最近最少使用的缓存对象给踢走. 我总是需要去了解在什么时候,用了哪个缓存对象.