6个月清洗近千亿条微信支付交易记录,他们要搞什么大事情?

本文转载自腾讯技术工程官方号

背景: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.20,11.11等),请求量也会突然翻倍。针对这种场景,如果用大量机器资源去扛节假日峰值,一会造成资源的浪费,此外还会加重运维扩容、缩容机器的工作。因此,我们在节假日高峰采用一些柔性策略,削弱峰值请求的影响。当请求峰值大于我们预设的阈值,就把大于这个阈值的请求先缓存到接入机的本地磁盘,当峰值过后再将这些请求按一定速度落到底层存储。在未落底层存储前,这些记录无法查询,因此那些记录能够做消峰的柔性处理,需要结合业务场景,在实际应用中,我们只会将红包的请求做消峰处理,而对其他支付请求不会做这样的处理。

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


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


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


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


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




效果



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

新交易记录系统交互界面




总结



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






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

右下角文字如何写_如何提取任意小程序的小程序路径

这几天我在写关于公众号和小程序互通的文章,在公众号跳转小程序的设置中有一个信息绕不过去,那就是小程序路径,对于非开发人员,如何轻松获取小程序路径是本文所讲述的内容本文内容本文通过具体截图文字描述,获取某个小…

基于Docker持续交付平台建设的实践

导读:中国五矿和阿里巴巴联手打造的钢铁服务专业平台五阿哥,通过集结阿里巴巴在大数据、电商平台和互联网产品技术上的优势,为终端用户带来一站式采购体验。本文是五阿哥运维技术团队针对Docker容器技术在如何在持续交付过程中探索和实践&…

计算机课件比赛总结,课件制作比赛活动总结

【www.gz85.com - 投篮比赛活动工作总结】课件制作比赛,是对计算机多媒体等辅助手段的一次检阅,也有力地促进了制作多媒体课件技艺的提高。下面是小编为您整理的“课件制作比赛活动总结”,仅供参考,希望您喜欢!更多详细…

设置pandas显示行数_Pandas这样来设置,做数据分析舒适百倍

在日常使用pandas的过程中,由于我们所分析的数据表规模、格式上的差异,使得同样的函数或方法作用在不同数据上的效果存在差异。而pandas有着自己的一套「参数设置系统」,可以帮助我们在遇到不同的数据时灵活调节从而达到最好的效果&#xff0…

深度解析京东个性化推荐系统演进史

在电商领域,推荐的价值在于挖掘用户潜在购买需求,缩短用户到商品的距离,提升用户的购物体验。京东推荐的演进史是绚丽多彩的。京东的推荐起步于2012年,当时的推荐产品甚至是基于规则匹配做的。整个推荐产品线组合就像一个个松散的…

模拟微信支付服务器测试,专栏 - 腾讯WeTest-All Test in WeTest

一、异常压测场景模拟说明:压测服务器具备自动完成初始化(支持快速扩缩容),初始化后均已支持:stress 、tc等工具(不需安装)1.使用stress模拟压力(CPU/内存/IO繁忙)a.如何使用:cpu高负载模拟:stress -c 44 -t 60内存高…

网易容器云平台的微服务化实践

摘要:网易云容器平台期望能给实施了微服务架构的团队提供完整的解决方案和闭环的用户体验,为此从 2016 年开始,我们容器服务团队内部率先开始进行 dogfooding 实践,看看容器云平台能不能支撑得起容器服务本身的微服务架构&#xf…

逐鹿工具显示服务器错误连接不上怎么解决,win7系统安装逐鹿工具箱提示“error launching installer”错误的解决方法...

win7系统使用久了,好多网友反馈说win7系统安装逐鹿工具箱提示“error launching installer”错误的问题,非常不方便。有什么办法可以永久解决win7系统安装逐鹿工具箱提示“error launching installer”错误的问题,面对win7系统安装逐鹿工具箱…

唯品会2017年双11大促技术保障实践,全域提供25万QPS服务能力

作者简介:刘惊惊,唯品会业务架构部高级架构师,负责唯品会电商平台的用户系统,营销系统和库存系统的架构设计工作。2016年加入唯品会,参与了唯品会电商系统的大重构,负责多个核心系统的梳理和大促准备。 张…

iis7 mysql_windows 7 下搭建php开发环境(windows7+IIS7+php+mysql)

首先需要说明的是,基于IIS v6.0/v7.0(2008),可以支持的脚本相当完整,不仅支持Linux无法支持的asp/asp.net,还可以安装php、mysql、zend实现php环境。同时,利用Serv-U可以实现ftp管理。操作简单,无需键入任何…

从核心技术到高可用实践——解密数据库深度挖掘指南

SDCC系列峰会各站在技术圈遍地花开之余,主办方CSDN为了更好地服务技术开发者并拓展受众,同步启动SDCC 2017系列之线上峰会——线上线下双管齐下,一举打破地域限制,内容为基,便捷加成,带来更友好的听众体验。…

Unity中Shader观察空间推导

文章目录 前言一、本地空间怎么转化到观察空间二、怎么得到观察空间的基向量1、Z轴向量2、假设 观察空间的 Y~假设~ (0,1,0)3、X Y 与 Z 的叉积4、Y X 与 Z 的叉积 三、求 [V~world~]^T^1、求V~world~2、求[V~world~]^T^ 四、求出最后在Unity中使用的公式1、偏移坐标轴2、把…

portainer 启动mysql_docker 安装portainer容器后,启动/Portainer 安装MySQL并开启远程访问...

启动命令:docker run -d -p 9000:9000 --restartalways -v /var/run/docker.sock:/var/run/docker.sock --name portainer docker.io/portainer/portainer下载mysql镜像文件:docker search mysqldocker pull mysql:5.7.32创建mysql容器:docker run -d --…

追求极简:Docker镜像构建演化史

作者简介:白明,东软互联网运营平台技术负责人,毕业于哈尔滨工业大学,Go语言专家,GopherChina讲师,技术培训师和撰稿人,博客tonybai.com作者,拥有多年后端服务架构设计和开发经验。目…

特征选择算法在微博业务应用中的演进历程

近年来,人工智能与机器学习的应用越来越广泛,尤其是在互联网领域。在微博,机器学习被广泛地应用于微博的各个业务,如Feed流、热门微博、消息推送、反垃圾、内容推荐等。值得注意的是,深度学习作为人工智能和机器学习的…

c winform mysql类_C#连接MySQL数据库操作类

首先需要安装MySQL Connector Net 6.8.3然后在项目中引用MySQL Connector,如下图所示C#连接MySQL的操作类代码如下:public class MySQLHelper{private string db_host "localhost"; //数据库服务器private string db_port "3306";…

病历智能处理引擎的架构设计、实现和应用

作者简介:吴大帅,新屿算法工程师,曾供职于宅米网、新达达,从事系统架构设计、算法设计等工作。 李智慧,《大型网站技术架构:核心原理与案例分析》作者,从事大型网站、分布式系统、大数据方面的研…

Heron:来自Twitter的新一代流处理引擎应用篇

作者 | 吴惠君,吕能,符茂松责编 | 郭芮【导语】 本文对比了Heron和常见的流处理项目,包括Storm、Flink、Spark Streaming和Kafka Streams,归纳了系统选型的要点。此外实践了Heron的一个案例,以及讨论了Heron在这一年开…

2017 JavaScript 调查报告概述

本文转载自极光日报知乎专栏,地址:https://zhuanlan.zhihu.com/p/32260460简评:最近一份超过 23,000 名开发者参与的关于 JavaScript 的调查报告 - the State of JavaScript 2017 出炉了。内容包含框架的流行趋势、薪资水平等等,感…

python动态_python --动态类型

动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概念相关。动态类型在我们接触的对象中,有一类特殊的对象&…