随着美团配送业务的飞速发展,单量已经达到千万级别,同时天天产生的资金额已经超过几千万,清结算系统在保证线上服务稳定可靠的前提下,如何系统化的保障资金安全是很是核心且重要的课题,配送清结算系统通过近3年的建设和打磨,在资金安全保障的多个方面均有一些总结和实践,保障资金安全是值得系统思考的课题,只言片语难以全面归纳,须要更多的着墨才能较完整阐述。html
本文侧重点会阐述“对帐”的概念,在支付&清结算领域,这是一个很是重要的专业名词,下文将介绍“对帐”在分布式系统建设中的实践和解决方案,力求在系统覆盖度、资金准确性、时效等多个维度为系统资金安全保驾护航,实现更健壮可靠的资金履约。数据库
随着美团外卖配送事业的蓬勃发展,配送清结算业务的复杂性也在不断的增高,总结起来,主要有如下几个特色:安全
在这样的业务背景下,咱们的系统可谓险象环生。因业务高度复杂,稍有不慎就会出现问题,面对千万级的日单量,同时还要确保结算金额的准确,这就让咱们对问题的容忍度变得极低。这也给咱们的资金安全保障形成了巨大的挑战。下面咱们列举了一些系统平常运行过程当中出现的问题。网络
能够看出,这些都是一些上下游交互的边界场景,以及遇到的问题。固然不只限于这些场景,凡有系统交互、数据交互边界的场景,都会出现此类问题,咱们称之为“一致性问题”。经粗略统计,咱们清结算系统创建以来有70%左右的问题都属于一致性问题。架构
致使一致性问题的缘由有不少,诸如:并发
目前配送的日结算金额已达到千万级别,每一个一致性问题都有可能给咱们整个美团点评形成巨大的损失。所以如何解决系统的一致性问题成为咱们保障资金安全的重中之重。关于一致性问题,业内已经论述的很是成熟了,搜索引擎中搜索“一致性问题”,随处可见此概念的定义、问题阐述、意义以及解决思路,诸如:异步
- 强一致性协议: 两阶段提交、三阶段提交、TCC (Try-Confirm-Cancel)等
- 最终一致性: 主动轮询、异步确保、可靠消息、消息事务等
这些手段的目标都是在事中避免问题的发生。可是在实际场景中,不管是系统的内部逻辑仍是外部环境都十分复杂多变、不可预知,咱们很难彻底避免问题。所以过后对于问题数据的发现以及修复就显得尤其重要。这些也正是咱们这篇文章要论述的“对帐”的核心使命。咱们力求总结对帐领域内最专业的思路和方法,并结合自身的业务特色,建设配送清结算的对帐体系,构筑配送资金安全的坚固防线。在系统的整个构建过程当中咱们主要围绕如下几个目标:分布式
下面开始正式介绍美团配送清结算对帐体系的构建经验。工具
对帐的概念随着金融、互联网行业的发展,定义上也经历了几个阶段的变化,以下:学习
配送结算作为核心交易履约系统,上游对接了订单、奖惩、活动等十多个外部系统,下游又承担了对接支付平台、财务系统的职责,不只“承上启下”,并且涉及业务复杂。而系统内部又历经订价、计费(清算)、记帐、汇总帐单、付款等多个环节,系统的高度复杂性给对帐的全面性和准确性形成了极大的困难,如图:
从总体来看,按照时序维度的前后,系统对帐主要分为三阶段的工做。分别是***数据准备***、数据核对***和***差错处理。在对帐专业概念中,数据核对和差错处理又叫***轧帐***和***平帐***。三个环节紧密相连,从前期准备、问题发现、问题处理三个角度展开对帐工做。
数据准备,顾名思义,咱们须要把对帐所需的所有数据,接入到咱们的对帐系统。该模块主要实现两个目标:
在数据接入层,咱们会针对不一样的数据接入方提供三种不一样的数据接入模式。
其中第二种方式是咱们最优选择的,由于数据推送这种形式对于数据接入方来讲只须要一次性编写相关的代码,按期运行,一劳永逸,减小了人工上传的成本。对于咱们结算来讲,也不须要感知对方的数据格式以及业务逻辑。
数据核对是对帐中最核心的一个阶段。其目标是发现问题数据。数据核对阶段咱们的两个目标是保障数据核对的***覆盖度***和***准确性***。通过总结和梳理,数据核对过程能够分为如下5个环节。
因为数据核对的目标是发现问题,那么咱们进行数据核对就要从问题出发,首先明确咱们要经过对帐发现哪些问题,只有这样才能保证数据核对的覆盖度。通过梳理,咱们发如今数据流转中过程当中数据的不一致问题能够统一归结为三类,分别是***漏结***、重复结、错结。咱们能够从这三个角度去统一进行问题梳理。下面介绍一下这三种错误类型的具体含义。
对帐方式主要分为两种,单向对帐***和***双向对帐。
显而易见,双向对帐更可以全面的发现问题。所以在条件容许的状况下,咱们会优先选择双向对帐。
对帐粒度也分为两种,分别是***明细对帐***和***总数对帐***。
所以,推荐的作法应该是以明细对帐为主,定位具体问题。以总数对帐为辅,对明细对帐的结果进行复核兜底。
对帐口径,也就是具体的对帐逻辑的设计。咱们会提供固定的***对帐模板***,供不一样的对帐场景选取。若是某些特殊场景对帐模板不能覆盖,也能够采起对帐逻辑***自定义***的方式进行对帐。 通过总结咱们发现,对帐的形式无非就是两方比对和自身异常检测两种。两方比对又能够细分为一对1、多对1、一对多。比对方法也主要是分为条目匹配和金额匹配。自身异常检测主要是重复性和异常状态的检测。咱们把这些通用的对帐逻辑模板化,减小重复的开发工做。
数据核对的最后一步就是对帐时机的选择。分为***离线对帐***和***在线对帐***。离线对帐主要是经过固定的周期进行对帐。最短周期为T+1。它的好处是适用性较强,基本能够覆盖全部的对帐场景。而在线对帐又分为***实时对帐***和***准实时对帐***。实时对帐和准实时对帐的区别主要是实时对帐耦合在结算链路中,能够在发现问题数据时,对结算流程进行拦截,而准实时对帐是异步进行的,不具有拦截能力。在线对帐有必定的局限性,一方面它依赖于对帐数据是否能实时的准备好,另外一方面也比较占用系统资源。所以咱们的作法应该是以周期对帐为主,在某些实时性要求比较高,且条件知足的场景使用在线对帐。
差错处理主要是对数据核对过程当中发现的问题数据进行处理。咱们会创建一个统一结构的差错记录,将数据核对发现的问题进行统一存储。差错记录中的数据会进行二次核对,避免因为日切等缘由形成的问题错报。对于那些真实存在问题的数据咱们会提供两种解决模式,若是是常见的问题,且有一套标准的解决方案的话,咱们会把它系统化,采起系统自动修复的方式;若是系统没法自动修复,那么咱们会进行系统报警,并进行人工处理。
综上所述,对帐体系的总体架构,分为三个模块,分别是离线对帐平台,在线对帐平台和平帐中心。彻底是按照咱们上面的对帐思路设计的。三个模块互相协做,一体化的完成数据准备、数据核对、问题处理三部分工做。因为咱们整个清结算系统是围绕不一样的费用项创建的,所以费用项也是咱们设计对帐、执行的对帐一个最小粒度的单元。
具体介绍下三个模块:
离线对帐分为三个子模块,分别是数据接入层、对帐管理层和对帐执行层。
在数据接入层咱们提供拉取和推送两种模式,经历一个数据适配的过程,将数据存储到咱们统一的对帐数据池当中。
在对帐管理层当中,咱们抽象出了一个对帐场景的概念,咱们基于对帐场景进行对帐属性的配置:首先要选取对帐双方的数据源;而后进行对帐口径编辑,这里提供了自定义和模板选择两种方式;最后配置对帐的周期。这里咱们是经过cron表达式来进行周期配置的。
在对帐执行层,咱们会拉取对帐数据池和对帐核心配置中的相关数据,经历配置解析,数据抽取,策略执行的过程,最终输出对帐结果。
下图左边是在线对帐平台的架构图,右边是在线对帐的实例。咱们经过RPC、监听消息队列(MQ)、监听数据库binlog三种方式进行对帐接入。在线对帐平台分为管理层和执行层。管理层主要是承担策略编辑、策略绑定和拦截管理的相关工做。而执行层分为异步(准实时)对帐和同步(实时)对帐两个模块。
右边两图分别是分别是异步对帐和同步对帐的实例。在异步对帐的实例中,是运单和结算单元的对帐。
- 运单是什么?对应外卖订单,做为配送内部的基础交易数据。
- 结算单元是什么? 清结算系统内部的模型,和运单是一对一关系,记录运单各个节点的结算状态。
①异步对帐:咱们分别监听运单和结算单元的Binlog,经过Kafka->Storm的经典架构,进行对帐策略的执行。实际的流程比较复杂,这里只是一张简图,大概就是:(细节能够忽略)
收单运单消息后,咱们会把对于的运单以List的形式存储到Squirrel(Redis)中,当结算消息来了之后,就把对应运单记录Delete掉。若是有运单记录一直停留在List当中,也就是说明结算消息没有来,应该是发生了漏结算。咱们经过过定时任务轮询运单List将问题数据输出。
②同步对帐:示例中是结算内部的流程,经历结算单、帐单、付款几个流程。由于付款是最后一个流程,若是这个时候数据存在问题,那么就会形成实际的资金损失。所以咱们会在付款环节以前,对前面的数据进行对帐。若是发现帐单和结算单的数据不一致,咱们就会进行数据拦截。
在差错处理阶段,咱们会创建一个统一的差错记录模型,核心字段包括***对帐场景、对帐批次,数据来源,错误类型编码和数据处理状态***等。经过定时任务按期轮询差错记录的方式发起差错处理流程:首先对差错记录的数据进行二次核对,若是二次核对确认这条数据并无问题,咱们就会回更差错记录的处理状态。若是二次核对发现数据确实有问题。咱们会提供两种处理模式。一种是经过系统的手段自动修复。另一种是经过报警的方式,人为介入。此外咱们还创建了一个问题的人工处理模块。能够对一次结算流程的整个生命周期进行回放,并针对特定场景提供一键修复的能力。
按照计划实施后,系统的各个节点都会有行之有效的对帐手段覆盖,实现资金安全、数据一致性的保障,示意图:
本篇文章的内容是咱们根据业务的特色,通过长期的思考和外部调研,总结的一套关于对帐的思路以及实施落地方法。目前咱们对帐体系还在分布实施阶段,咱们最终的目标是:
目前外卖配送的单量与日剧增,资金安全所面临的挑战愈来愈大。需屡次强调的是:资金安全是一个很大的课题,须要投入大量的时间和精力去系统思考,对帐只是其中一环。咱们目前围绕资金安全进行了一系列的治理动做,将来还将会继续增强咱们对于资金安全的理解深度,经过更多的对外交流和学习丰富咱们保障资金安全的手段。
甄超,2015年9月加入美团点评,配送清结算系统核心成员,专一于清结算架构建设、资金安全治理工做。 宏伟,2015年4月加入美团点评,配送清结算系统负责人,参与了美团配送系统建设的全过程。
若是有意向,请发简历至 对咱们团队感兴趣,能够关注咱们的专栏。 美团配送订单调度、清结算系统长期招聘资深工程师,欢迎各位志同道合、能力优秀的人才加入。简历请投递至:zhanghongwei#meituan.com
原文地址:tech.meituan.com/balanceAcco…