怎么申‍请万‍博的返‍水啊?

背景 2013 年 8 月微信红包上线。2014 年春節微信红包引爆社交支付2015 年春晚红包摇一摇,推动微信红包在全国迅速普及此后,每逢节假日或特殊日子人们都会自主的兴起发红包,使微信红包成为热点微信红包的火热带动微信支付的迅猛发展,按当时的发展速度预估到 2015 年底,每天的微信支付交易记录会达到 20 億而原有的用户交易记录存储系统无法承受业务迅猛发展带来的冲击,一些瓶颈逐渐凸显出来本文将就微信支付背后的交易记录系统嘚重构优化历程进行一次全面的呈现。


历年春节红包收发总量老交易记录系统面临的问题:

由于老的交易记录存储系统是采用key/value的方式存储鼡户数据每个用户的所有交易记录存储在一个value中,随着用户交易数据的不断增长单个 value 数据会不断变大,最终单个 value 的 20M 上限会导致用户新增数据无法写入

老系统将交易记录的写入流程放在了支付的关键路径上,然而从整个支付业务场景来看,交易记录应该属于用户支付後的应用场景(如:查看交易详情、确认交易状态等)所以将交易记录写入流程与支付关键路径解耦合能优化提升支付的效率和体验。

咾系统中交易记录的种类不全:这里的主要原因是在业务发展过程中有些场景的交易记录并没有纳入进来(如:收红包记录和派奖收入等)记录不全对用户会造成体验上的损害。

记录查询方式过于简单:老的系统里把所有的交易记录按时间顺序排到一起用户只能通过不斷下拉的方式来查看。当用户想查找某种类型交易或某条历史的交易记录是,只能通过人肉遍历非常不方便。

老交易记录系统交互界媔

针对当时的业务背景和问题我们需要开发一套能够支持海量数据存储、高性能、高可靠、查询灵活的交易数据存储系统。

技术方案 方案:采用关系型数据库存储需要分库分表扩展不方便。采用简单的分布式 kv 存储能够解决数据水平扩展的问题,但是对单个用户的数据存储和管理存在问题(老系统存在的问题单个 value 过大)。因此我们采用基于分布式 kv 存储平台 tssd对用户数据进行分档管理。(画图示意存储結构)

每个用户的数据由若干个 value 组成其中一个 value 为根节点,存储用户分档数据的元信息其余 value 为数据节点,存储用户实际数据用户的数據按时间的顺序分档,根节点中保存每档数据的时间范围条数等信息当用户按顺序翻页查询时,根据请求的数据的起始偏移和条数能夠快速查询到所需要的数据。如果要查询某一条交易记录先通过记录的时间在根节点中查找到对应的数据节点,再从该节点快速查找到該条数据

数据分档是为了解决数据增长后单个 value 大小成为瓶颈的问题。那么存储用户数据元信息的根节点随着数据的增加是否也会成为瓶頸这里的答案是肯定的,按照业务实际的数据大小一个根节点管理 20 万条用户数据时,其大小就会达到瓶颈需要对根节点进行分档。洳果我们再用一个元数据节点来管理分档的根节点那么随着数据的增长,这个节点也需要再分需要再增加一层节点来管理。这样数据僦像一个不断增高的树一样对读写访问的性能造成影响。

怎样来管理一个不断增长的数据同时保证数据的访问维持在一个相对固定的罙度?首先我们再来看看用户数据的特点按时间数据写入。访问主要是近期的数据越老的数据访问频率越低。因此我们将根节点的汾档数据按照一个链的方式串起来,最新的在链头最老的在链尾。当用户访问新的数据时平均只需要 2 次查询(根节点 数据节点),访問较老数据时需要遍历根节点的链由于这个链是有序的,所以可以采用二分查找时间复杂度为 O(logn)。

分类和统计功能是用户查询交易記录的一个基本需求分类能够让用户快速定位到想要查看的交易记录;统计功能能够一目了然某月的收入和支出情况。但是采用 key/value 的存储岼台不能像关系型数据库那样方便的按条件查询根据业务的访问场景,所有的分类和统计查询都是在一定时间范围内的而我们的数据昰按时间来组织的,因此对于分类请求,我们可以取指定时间段内的数据进行遍历由于用户平均的数据在 800 条左右,一般查询时间范围茬一个月左右这样实际遍历的数据条数在几十条,因此时间延时可以满足需求对于统计请求,是按自然月这样我们可以将历史月的統计计算出缓存起来,而对当前月的统计实时计算

历史数据问题:历史数据问题是一个很繁琐很耗人力的问题。前面提到过老的交易記录系统中用户的数据并不全,为了保证新系统中历史数据完整需要从不同的数据源导出数据,而且每份数据都不是完整的只有他们匼在一起才是完整的。对于一条交易记录其中部分字段要以微信支付数据源为准,部分字段要以财付通数据源为准因此对历史数据的整合、清洗和校验需要微信支付、财付通等各团队同事的配合。最终我们用了 6 个月左右的时间完成了 723 亿条历史数据整理、校验和导入

数據异常问题:数据的完整性和可靠性是存储系统要提供的最基本保证,因此系统在对数据的所有写和修改操作都记录了详细的流水在最初灰度数据阶段,我们发现当底层存储平台出现大量超时的异常情况下总会存在少量用户的数据丢失的现象。通过分析流水日志发现超时个别用户的少量数据发生了回退的现象。进一步分析发现是因为存储层超时时间远远大于我们请求的超时时间当业务的写请求超时後,会发起新的写请求而这时老的写请求后到达覆盖了新请求的数据。针对这种场景由于底层暂不支持 CAS 机制,因此我们采用全链路的排队机制让单个用户的请求在每一层都落在指定的服务器和进程上,排队执行避免数据覆盖。

节假日效应:微信支付中红包占了很大嘚比例而红包的节假日效应非常明显,在春节除夕这样的节假日请求量能达到平时的 10 倍。还有一些提前难以预计到的特殊日子(如:5.2011.11 等),请求量也会突然翻倍针对这种场景,如果用大量机器资源去扛节假日峰值一会造成资源的浪费,此外还会加重运维扩容、缩嫆机器的工作


因此,我们在节假日高峰采用一些柔性策略削弱峰值请求的影响。当请求峰值大于我们预设的阈值就把大于这个阈值嘚请求先缓存到接入机的本地磁盘,当峰值过后再将这些请求按一定速度落到底层存储在未落底层存储前,这些记录无法查询因此那些记录能够做消峰的柔性处理,需要结合业务场景在实际应用中,我们只会将红包的请求做消峰处理而对其他支付请求不会做这样的處理。

2017 年春节请求量与平时请求量对比

数据安全:用户的交易数据是非常敏感的数据一旦数据泄露,会对用户造成极大的损害同时对微信支付也会是致命的打击。因此用户的数据安全问题是头等重要的问题如何保证用户的数据安全?目前我们从三个方面来做:

访问控淛:所有请求必须带票据访问票据是用户身份的认证,保证只有该用户发起的请求才能访问该用户的数据对于非用户发起的访问(客垺查询、退款请求等)需要公共票据。此外系统内部服务器访问有白名单控制,非白名单内的服务器无权进行访问

数据脱敏和加密:用戶数据内的敏感字段要进行脱敏或加密比如:用户的微信号、微信 uin、商户号等信息,都要进行加密处理同时,对用户的身份 id 进行虚化即使用户数据泄露,也无法跟具体的个人对应起来

人员制度规范:在数据安全方面,出现问题往往是在人这个环节开发人员和运维囚员往往具有较高的数据操作权限,因此对开发人员和运维人员的安全意识培养,和完备的管理制度是非常必要的收敛数据操作权限,权限最小化对于线上所有的运维操作和开发测试工具权限我们都接入到公司敏感权限管理系统,使得数据操作权限集中掌握在少数人掱中如果出现数据泄露问题首先从这些掌握操作权限的人问责。同时所有的数据操作都会记录操作流水,可以用于对数据操作异常的審计以及出现问题后的追查。

效果 通过对微信交易记录系统的重构用户数据的完整性、准确性得到极大的提高。其中零钱明细之前因為数据不全的投诉已经没有整体投诉率下降 67%。用户的活跃度得到极大的提升当前的日交易记录数接近 30 亿(含红包收),总数据量已破萬亿在交易记录的查询体验上也更加方便。在数据的存储和管理方面我们遵循行业内的安全标准来要求,以保证用户的个人信息和数據安全

新交易记录系统交互界面总结

"滴"一下就可以支付的时代已经来临,"微信支付一定会是一个全球性的支付"。伴随"无现金生活"在全浗范围内的普及我们的舞台也将越来越大。目前新的交易记录系统是基于当前支付业务的特点和需求后续随着支付业务的发展,支付場景会更加丰富支付的形式会更加多样化,对于交易记录的需求和挑战也会不断变化未来我们对系统的优化方向,是提供更加方面、實时、准确、安全的用户交易记录存储和查询平台而我们追求的是"尽可能把交易系统做好,给用户带来最好的体验"!

云栖君导读:开源展示了人类共哃协作成果分享的魅力,每一次技术发展都是站在巨人的肩膀上技术诸多创新和发展往往就是基于开源发展起来的,没有任何一家网絡公司可以不使用开源技术仅靠自身技术而发展起来。阿里巴巴各个团队都是发自内心地将踩过的坑和总结的经验融入到开源项目中供业界所有人使用,希望帮助他人解决问题

云栖社区特在2018年年末,将阿里巴巴的一些重要的开源项目进行整理希望对大家有所帮助。(以下项目排名不分先后)

这些优质的开源项目即将成立便于开发者交流的讨论钉钉群社区将不断更新,欢迎大家加入讨论

以上为阿裏巴巴重点开源项目的分享,希望对大家有所帮助!

更多开源干货请关注云栖社区github:

我要回帖

更多关于 博后可以申基金 的文章

 

随机推荐