微信红包系统设计 & 优化

微信红包系统设计 & 优化

浏览次数:151次 腾讯大讲堂 2015年04月02日 字号:   

分享到:QQ空间新浪微博腾讯微博人人网豆瓣网开心网更多0

编者按:经过2014年一年的酝酿,2015微信红包总量创下历史新高,峰值1400万次/秒,8.1亿次每分钟,微信红包收发达10.1亿次,系统整体运行平稳, 在这里我分享下微信红包背后的技术。


讲师:jeri

核心功能&目标

首先,了解下微信红包的4个逻辑:摇/发/抢/拆。看似简单,实现可不简单再review下微信红包要实现目标:

摇:摇的流畅

快:抢的要快

爽:拆的爽

稳:能分享出去

系统难点:

1.中国运营商网络环境复杂,覆盖面广,春节期间网络吃紧,容易出现网络故障

2.在尖峰摇时如何避免服务雪崩

3.在服务资源有限时,如何提供柔性服务

4.如何构造有损服务

5.如何构造set模型

6.如何解决并发抢

7.如何实现实现数据一致性

系统整体架构图

跨区域网络解决方案

微信客户端分布全球,接入点较多,用户资料靠近接入点,可以加速用户资料访问,但是红包的业务逻辑层并不全网分布,业务逻辑层访问数据层比较多,数据层有状态强一致性问题,只能同用一个数据副本,比如上海用户与深圳用户在同个群里,抢同一个红包,如果订单数据在上海与深圳都有,在抢的时候,无法保证数据同步,可用性低,所以,设计系统时,一定要梳理清楚系统间的调用关系,优化接入层的业务逻辑,把网络耗时降到最小,系统吞吐量才能提升。

跨区域网络问题,在物理实施上,也需要有备份绕行的能力,这个可以在系统的底层框架中实现,当指定专线出现故障时,快速切换网络,恢复服务

如何构建有损服务

什么是有损服务?选择性牺牲一部分数据一致性和完整性从而保证核心功能绝大多数运行,经过一段时间窗口,数据一致性与完整性能得以恢复,这也是腾讯的一直运营策略,在有限资源前提下,量力而为,满足用户的核心需求

比如,春晚摇一摇,我们的核心点是摇/拆/分享,那系统的资源优先需要保证这些服务的响应,任何关联系统出现异常的时候马上进行系统降级,防止引起系统雪崩。

系统降级可以分为两个方面,一是把核心功能调用链路简化,减少依赖,通过辅助轻量化的服务实现,确保最短关键路径的可行,比方说在接入层置入摇红包逻辑,将每秒千万级请求转化为每秒万级的红包请求,再传到红包服务的后端逻辑,降低雪崩的可能性。

柔性服务.打造好的产品体验

柔性可用是在有损服务价值观支持下的方法,重点在于实际上会结合用户使用场景,根据资源消耗,调整产品策略,设计几个级别不同的用户体验场景,保证尽可能成功返回关键数据,并正常接受请求,绝不轻易倒下。

比如,红包的核心功能拆,拆完需要记录用户头像昵称,转帐资金划转,同时输出同个订单下其它拆记录,拆过程这些操作都可能失败,但是核心操作获取红包是成功的,此时,我们至少可以告诉用户抢到金额,不至于让用户焦急等待,不断重试,未完成的操作(头像补全与资金转帐),可以通异步补尝方式重试。这样解决了用户的问题,也缓解了系统压力。

如果构造set模型

Set模块就像一个集装箱,把各模块标准化,模块化,规模化,它为海量服务运营,特别是设备管理、网络架构,提供了宏观运营支撑框架,从而极大提高了海量服务运营效率。

微信红包的set模块,以拆服务为例,从接入层开始,数据开始sticky,按订单号路由,即按单号分set,同一个set尽可能在一个IDC 里,减少模块间调用的耗时,在同一个set内,逻辑层任何一台机器,调用方可实时摘除,如果是数据层发生故障,先在接入层,把新产生的红包订单号屏蔽有故障对应的set编号,比如,set1 数据库出现故障,为了避免在故障的set1 上继续产生新的支付请求,在订单生成器直接跳过set1的单号规则,把新请求导致其它set, 只有未抢完的部分红包,会提示故障,稍后恢复,阻止了故障引发的进一步恶化,在故障db上的数据,通过备机与业务逻辑层的数据核对,完成数据一致性的修复。

如何解决并发抢

群里红包的规则是金额随机抢,在一个大群发一个红包出去,抢并发请求量高,在同一个资源上操作,需要增加锁操作,避免一个抢总数超过发送红包总数,众所周所,mysql的加锁操作,很多抢在一个锁上等,性能损耗大,吞吐量下降,对于海量服务的操作,是不能满足要求。

在set模块的基础上,我们把发/抢的资源请求都会落到同一个资源set,在最外层,cache红包的状态,如果红包已经被抢完了,即刻返回,如果红包未接完,对于一个红包进去抢环节还有限流,这是第一级保护,通过一致性hash算法,一一个单到dao层都会路由到同一个机器的同一个进程,dao到mysql在现一个连接上完成抢操作,把并发抢修改成串行化,mysql可以无锁等待,性能明显提升。

如何实现数据一致性

谈到分布式系统,先回顾CAP理论

?

C:Consistency数据一致更新,所有变动都是同步的

A:高可用,好的响应性能

P: 分区容忍,可靠性

在我们的系统设计中,同样碰到这个问题,无法同时满足三个因子,移动互联网系统,高可用性是必要要求,数据分区也是分布式系统的条件,所以,我们设计系统时,只能尽量保证数据一致性,只要一定时间窗口内,完成数据一致,让用户满意。

微信红包的数据有几份,订单数据,用户数据,还有对应的cache数据,

N:数据副本份数红包有三份

R: 一次需读取的副本红包一次从一个副本可以全部读取需要数据

W: 一次写入数据2份实时写,一分异步化

R(1) + W(2) <=N从公式算出,我们的数据模型也是弱一致性

用户数据是异步更新,更新失败,通过消息中心,异步重试,根据DB资源负载设置调用方的调用阀值,除了实时重试,我们还有准实时数据核对,保证数据最终一致性。

时间: 2024-08-28 13:46:55

微信红包系统设计 & 优化的相关文章

转:微信红包接口开放!

去年春节红包闪击战,掀起了一阵波澜!马云直呼-珍珠港事件! 2014年春节,超800万的用户通过微信参与了抢红包活动,超过4000万个红包被用户领取,人均抢到红包4-5个,除夕高峰区间,每分钟有2.5万个. 在2014世界杯期间,微信彩票每天发放红包,网友投注世界杯焦点赛事即可100%领取. 现在,微信红包功能接口对商户正式开放.没有了复杂的申请流程,商户可根据开发能力及所举办活动的具体需求来选择红包发放方式.目前,商户发放现金红包有系统自动发放.人工手动发放两种方式.其中“系统自动发放”由商户

微信红包外挂?只是你不知道

微信红包来的时候直接在通知栏显示,点击马上就能抢.相比于原来在通知栏显示微信通知,点击进入再抢红包的步骤,这个直接在通知栏抢红包的优化不知道要高到哪里去.想要这个“红包bug”吗?赶紧随ytkah来看看! 魅族副总裁,Flyme 总设计师,也是魅族发布会颜值担当杨颜发了一条配图微博,说“春节快到了,抢红包和 Flyme 更配哦,今天内测固件的神秘黑科技有毒.” 其实不光是魅族的 Flyme 为微信抢红包做了优化,去年 MIUI 7 发布的时候,雷军也为了演示新版本的性能优化,进行了 100 次的

微信红包接口开放 ,助力开年促销第一战

      摘要:昨日消息,微信正式宣布面向商户开发微信现金红包申请,只要商户(公众号.App或者线下店皆可)开通了微信支付,就可以申请接入现金红包. 2014年,从除夕夜到大年初八,有超过800万的用户通过微信参与了抢红包活动,超过4000万个红包被领取,平均每人抢到了4至5个红包,在除夕夜的最高峰时段,每分钟有2.5万个红包被领取.在2014世界杯期间,微信彩票每天发放红包,网友投注世界杯焦点赛事即可100%领取,不仅吸引了大批球迷关注,甚至很多不看球的普通人也因此开始关注赛程.如今,这项商

微信红包的架构设计简介

@来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢) 概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量. 微信的金额什么时候算? 答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.. 采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低. 实时性:为什么明明抢到红包,点开后发现没有? 答:2014年的红包一点开就知道金额,分两次操作

微信红包的实现

封装一个微信用包类,主要的功能有|: 红包中存有钱,多少个人分:每个分到的钱数,及获收红包的时间: 主要的功能有 打开红包:(如果打开红包的人数没有达到上限,则可以打开,并随机获得金额) 查看红包分配信息: 设置截止日期:(如果超过最大金额,则再打时提示过期) 思路:微信红包类应该具有的属性有红包金额,红包数,过期时间,领红包的人,时间等. 难点在于:将红包如何分成几份,等可能的被其他人抢到,而且不会出现为0的红包. 首先运用取随机数的类,每次取当前所剩金额的随机数,然后将这些分好的红包放到数组

微信红包随机算法

最近看了一篇文章,讲微信红包随机算法的.感觉很不错,所以自己实现了下,并进行了简单测试. 算法 算法很简单,不是提前算好,而是抢红包时计算: 红包里的金额怎么算?为什么出现各个红包金额相差很大?答:随机,额度在0.01和剩余平均值*2之间. 实现 实现上述算法的逻辑主要是: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余的红包数量 // remainMoney 剩余的钱 if (_red

壕,微信6.1版发微信红包更方便了,我们去喝杯茶吧

微信6.1版发布了,附件栏就能发微信红包,壕们,我们出去喝喝茶吧,探讨一下如何搜索朋友圈和附近商家,顺便谈谈理想聊聊人生. 微信6.1 For iOS正式登陆APP Store,除了强化红包功能外,还加入了自定义表情漫游以及搜索朋友圈的内容和附近的餐馆等新功能. 具体更新说明: - 现在可以通过附件栏发微信红包了 - 更换手机时,自定义表情不会丢失 - 可以搜索朋友圈的内容和附近的餐馆

2015年随微信红包即将爆发!

2015年1月的消息,微信即将升级的6.1版本中会出现摇一摇的红包和卡券的功能.此功能意味着,将来“摇一摇”除了寻找朋友,还会成为连通线上和线下的桥梁.在这里一个不可忽视的技术概念是“iBeacon技术”. iBeacon是苹果公司2013年6月推出的技术,并在9月发布的移动设备上配备了此新功能:通过蓝牙(BLE)进行精准定位,当智能设备靠近iBeacon信标时,设备能感应到iBeacon信号,商家因此能为消费者提供基于位置的相关信息,在适当的时间和地点向用户推送所需要的信息. 这是一个简单的场

微信红包金额分配的算法 http://timyang.net/architecture/wechat-red-packet/

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