微信红包实现原理

标签: 程序相关 原子操作 微信红包 红包 | 发表时间:2015-04-30 07:25 | 作者:admin
出处:http://www.phppan.com

微信红包实现原理

以下内容来源于QCon某高可用架构群聊天记录整理 背景:有某个朋友咨询微信红包的架构,在官方或非官方同学的解释和讨论中得出以下讨论内容,在此期间有多个同学发红包做现网算法测试。

抢红包过程

当有人在群里发了一个N人的红包,总金额M元,后台大概发生的事情如下:

一、发红包后台操作:

  1. 在数据库中增加一条红包记录,存储到CKV,设置过期时间;
  2. 在Cache(可能是腾讯内部kv数据库,基于内存,有落地,有内核态网络处理模块,以内核模块形式提供服务))中增加一条记录,存储抢红包的人数N

二、抢红包后台操作:

  1. 抢红包分为抢和拆,抢操作在Cache层完成,通过原子减操作进行红包数递减,到0就说明抢光了,最终实际进入后台拆操作的量不大,通过操作的分离将无效请求直接挡在Cache层外面。这里的原子减操作并不是真正意义上的原子减操作,是其Cache层提供的CAS,通过比较版本号不断尝试,存在一定程度上的冲突,冲突的用户会放行,让其进入下一步拆的操作,这也解释了为啥有用户抢到了拆开发现领完了的情况。
  2. 拆红包在数据库完成,通过数据库的事务操作累加已经领取的个数和金额,插入一条领取流水,入账为异步操作,这也解释了为啥在春节期间红包领取后在余额中看不到。拆的时候会实时计算金额,其金额为1分到剩余平均值2倍之间随机数,一个总金额为M元的红包,最大的红包为 M * 2 /N(且不会超过M),当拆了红包后会更新剩余金额和个数。财付通按20万笔每秒入账准备,实际只到8万每秒。

FAQ

  1. 既然在抢的时候有原子减了就不应该出现抢到了拆开没有的情况?
    这里的原子减并不是真正意义上的原子操作,是Cache层提供的CAS,通过比较版本号不断尝试。
  2. cache和db挂了怎么办?
    主备 +对账
  3. 有没有红包个数没了,但余额还有情况?
    没有,程序最后会有一个take all操作以及一个异步对账保障。
  4. 为什么要分离抢和拆?
    总思路是设置多层过滤网,层层筛选,层层减少流量和压力。这个设计最初是因为抢操作是业务层,拆是入账操作,一个操作太重了,而且中断率高。 从接口层面看,第一个接口纯缓存操作,搞压能力强,一个简单查询Cache挡住了绝大部分用户,做了第一道筛选,所以大部分人会看到已经抢完了的提示。
  5. 抢到红包后再发红包或者提现,这里有什么策略吗?
    大额优先入账策略
  6. 有没有从数据上证明每个红包的概率是不是均等?
    不是绝对均等,就是一个简单的拍脑袋算法。
  7. 拍脑袋算法,会不会出现两个最佳?
    会出现金额一样的,但是手气最佳只有一个,先抢到的那个最佳。
  8. 发红包人的钱会不会冻结?
    是直接实时扣掉,不是冻结。
  9. 采用实时算出金额是出于什么考虑?
    实时效率更高,预算才效率低下。预算还要占额外存储。因为红包只占一条记录而且有效期就几天,所以不需要多大空间。就算压力大时,水平扩展机器是。

相关 [微信 红包 原理] 推荐:

微信红包实现原理

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

微信红包算法探讨

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

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

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

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

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

微信红包的架构设计简介

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

微信红包金额分配的算法

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

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

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

微信二维码登录的原理

- - 标点符
在电脑上使用 微信时,你可能已经发现微信不提供传统的账号密码登陆,取而代之的是通过扫描二维码进行登陆. 今天就要研究下次登陆方式微信时如何实现的. 1、每次用户打开PC端登陆请求,系统返回一个唯一的uid,并将uid的信息绘制成二维码返回给用户. 这里的uid一定是唯一的,否则就会造成你登陆了其他用户的账号或者其他用户登陆你的账号.

一个红包随机分配算法

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

HandlerSocket的原理

- Roger - MySQLOPS 数据库与运维自动化技术分享
HandlerSocket的应用场景:. MySQL自身的局限性,很多站点都采用了MySQL+Memcached的经典架构,甚至一些网站放弃MySQL而采用NoSQL产品,比如Redis/MongoDB等. 不可否认,在做一些简单查询(尤其是PK查询)的时候,很多NoSQL产品比MySQL要快很多,而且前台网站上的80%以上查询都是简洁的查询业务.