当前位置: 首页 > news >正文

对账平台设计

背景

随着公司业务的蓬勃发展,交易履约清结算业务的复杂性也在不断的增高,资金以及各种数据的一致性和准确性也变得越发重要。

  • 以交易链路为例,存在着如下一些潜在的不一致场景:

  • 订单支付成功了,但是订单状态却还是“待付款”

  • 物流已经发货了,但是订单上面还是“待发货”

  • 订单用券成功了,但是优惠券状态还是 “未使用”

  • 订单参与活动下单成功了,但是活动没有核销记录

上述每个业务场景,都可能产生用户反馈,给用户带来困扰。业务对账平台的核心目的,就是及时发现类似问题,并及时修复。使问题在反馈前即被提前处理。

需求分析

对账的概念随着金融、互联网行业的发展,定义上也经历了几个阶段的变化,如下:

  • stage 1 :对账最初来源于会计核算,是为保证账簿记录正确可靠,对账簿中的相关数据进行检查和核对的工作。
  • stage 2 :随着互联网金融或电商行业的发展,对账也扩大了应用范围,这一时期,对账是指在固定周期内,支付使用方和支付提供方(银行和第三方支付)相互确认交易、资金的正确性,保证双方的交易、资金一致正确。
  • stage 3 :从广义来看,所有的跨端系统之间的数据核对都应该叫对账,主要是检查和发现数据在流转过程中的不一致问题。通常分为信息流的核对和资金流的核对。信息流核对主要是对业务数据之间的核对,资金流是对资金交易数据进行核对。
    想要构建一个通用的业务对账平台,不可避免的要面临以下挑战:

我们对于一个业务对账平台的核心诉求,主要包括要方便业务系统快速接入,要能处理业务方海量的数据,并保证一定的实时性。这会深刻影响业务对账平台的系统设计。

系统分析:

对账流程,可以分解为 “数据加载”、“转换解析”、“数据对比”、“结果处理” 这 4 步。为了适应多样化的业务场景,其中的每一步都需要做到可编排,放置各种差异化的执行组件。在每一个流程节点,需要通过规则可以自由选择嵌入哪个组件。其次,需要把数据从原始格式,转换到对账的标准格式(基于标准格式,就能做标准的通用对比器)。总结起来,我们认为对账引擎需要具备以下的能力:

  • 流程编排能力。

  • 规则能力。

  • 插件化接入能力。

对账数据标准格式:

无论是信息流对账还是资金流对账,我们都可以尝试把对账信息进一步归纳总结,抽取出公共信息字段,组成标椎数据格式,便于对账引擎的设计。

基于此,这里简单设计了一些标准对账字段,如下:


对账标准数据格式,也可以再对账失败时进行落库操作,便于对账告警,自动修复,人工查看等。

对账有一对一,一对多, 多对一 等关系,比对数据主要分为 条目匹配,状态匹配,金额匹配等。raw_data 可以存放此数据,便于对比。

对账方式

对账方式主要分为两种,单向对账和双向对账。

  • 单向对账:以一方数据为基准进行对账。比如结算跟支付平台,以结算数据为基准和支付平台核对,用来发现结算数据为支付成功,支付平台支付失败等问题。
  • 双向对账:以双方的数据互为基准对账。既要保证结算数据为成功的,支付平台也要成功,又要保证支付平台数据为成功的,结算数据也要成功。
    显而易见,双向对账更能够全面的发现问题。因此在条件允许的情况下,我们会优先选择双向对账。

对账力度

对账粒度也分为两种,分别是明细对账 和总数对账。

  • 明细对账:对双方的每条数据依次进行比对。它的优点是可以准确定位问题数据。缺点是对账口径的设计比较复杂。因为我们需要同时针对漏、重、错三种错误类别设计不同的对账口径,同时还要考虑到业务的边缘场景。稍有不慎,就会影响对账的准确性。
  • 总数对账:选择一个维度,进行总数级别的对账。总数级别的对账好处是对账口径的设计比较简单,可以快速实现,不易出错。缺点就是无法定位问题数据,一旦对账发现问题。还需要进一步寻找问题数据。
    推荐的做法应该是以明细对账为主,定位具体问题。以总数对账为辅,对明细对账的结果进行复核兜底。

对账时机:

目前对账时机有2种, 一种是离线对账,一种是实时对账。两种模式再系统设计层面非常相似,只有数据加载方式不同,下面介绍两种对账模式的系统流程:

离线对账:

离线对账主要是通过固定的周期进行对账。最短周期为T+1。它的好处是适用性较强,基本可以覆盖所有的对账场景。一些离线定时对账场景,单次对账的数据量可能达到百万级,甚至千万级。这对对账平台的吞吐量造成了挑战。

离线对账有两种方法:

常规方法是,通过数据平台(包含了所有要进行对账的原始主键数据,如订单号)将数据 push 到对账中心的 DB,然后对账中心集群通过分片策略,并按分页分批加载,加载数据进行离线数据对比。

另一种,则是当数据量超过千万时,利用数据平台从 hive 表中获取数据,然后投递到 MQ(kafka)。每个对账服务实例都是一个 Consumer 负责从 MQ 拉取消息消费,这样千万级的数据会变成消息被分散的对账服务器执行。

对账任务一般会选择在业务量较小的凌晨进行,是因为在对账过程中可能会需要通过反查业务接口,来获取实时数据。另一种方案是,对账时不要对业务接口进行反查。但是,会需要对业务数据进行准实时同步,提前进入对账中心的 DB 集群。两者优缺点如下:

结合我们自身业务,我们这里采取的是第一种方式:即由数据平台发送对账数据到 MQ,对账平台通过 MQ 消息反查业务方接口,进行数据对账。

实时对账:

实时对账又可称为 在线对账或准实时对账,往往基于业务消息进行触发,指在事件被触发后的短时间内执行完对账任务。且事件消息触发可能会有高并发,状态易改变等特点,因此需要相应的架构来进行支持。

在线对账和准实时对账的区别主要是在线对账耦合在结算链路中,可以在发现问题数据时,对结算流程进行拦截,而准实时对账是异步进行的,不具备拦截能力。在线对账有一定的局限性,一方面它依赖于对账数据是否能实时的准备好,另一方面也比较占用系统资源。因此我们的做法应该是以周期对账为主,在某些实时性要求比较高,且条件满足的场景使用在线对账。

这里我们主要考虑准实时对账,简单来说就是,通过 监听 业务方 DB 的binlog 日志(或者业务方本身的MQ),投递到 MQ 并进行 binlog 解析,由对账引擎消费 MQ 消息进行对账。

差错处理

差错处理主要是对数据核对过程中发现的问题数据进行处理。可以建立一个统一结构的差错记录,将数据核对发现的问题进行统一存储。差错记录中的数据会进行二次核对,避免由于日切 或者 状态时间差 等原因造成的问题错报。对于那些真实存在问题的数据可以提供两种解决模式,如果是常见的问题,且有一套标准的解决方案的话,可以考虑把它系统化,采取系统自动修复的方式;如果系统无法自动修复,那么我们会进行系统报警,并进行人工处理。

日切,在传统的银行业务中,每日作业需要有一个结束的时间,在该时间之后,需要对当日尚未完成的业务进行集中处理,并盘清当日的业务账目,做好受理下一日业务的所有准备后,即将记账日期更新为下一日。这一过程就叫日切。

系统设计

考虑到 离线对账和实时对账的特点,对账引擎设计需要兼顾这两种类型的对账,现设计对账引擎各个组件如下:

其中 ResourceLoader 、Trigger, Parser 、 Checker 、 ResultHandler 均为标准接口,所有实现了对应接口的 spring bean,都能被编排到对账流程之中,包括业务方自己实现的 plugin。这样就实现了插件化和可编排。每个流程节点的功能如下:

  • ResourceLoader :基于各种数据源(DB、HIVE、RPC、REST 等)提供加载器工厂,加载各个数据源的原始数据。加载的方式支持驱动加载、并行加载、多方加载等方式。业务方也可以自己实现加载器,利用流程编排能力嵌入到对账流程中。

  • Trigger:对账触发器,对账的触发主要依靠触发器,针对不同类型的对账可以编写不同的触发器,常用的触发器可由对账平台提供,如 OrderTrigger(订单触发器),StockTrigger (库存触发器)。

  • Parser :对已加载的原始数据进行建模,转换为对账标准模型。

  • Checker :按照配置对指定字段、按指定规则进行比较,利用规则引擎,提供脚本化化对账方式或者自定义对账插件等。产生对账结果。

  • ResultHandler :使用指定的 handler 对结果进行处理,常见的处理器包括持久化、发送报警、甚至直接修复数据等等。

其中 Config 作为对账平台的配置中心,可以对 对账业务方进行配置,编排,也可提供对账的可视化功能。

实时对账设计要点:

实时对账考虑基于业务MQ消息触发,主要关注 实时性,吞吐量等方面,如消费速率,消息堆积造成实时对账不准确问题。

设计中主要加入了 限流、取样、路由、等 pipeline 来处理高并发事件消息。同时在进入事件处理线程池之前,需要进入阻塞队列,避免大量的请求直接耗尽线程资源,同时实现事件处理的异步化。处理线程批量定时从阻塞队列获取任务来执行。同时,利用延迟阻塞队列,还可以实现延迟对账的特性。出现不一致的情况时,如果立即去进行对比,往往还是不一致的。所以就需要根据情况,在事件发生后的一段时间内,再触发对比

差错处理设计:

在差错处理阶段,可以建立一个统一的差错记录模型,核心字段包括 对账场景、对账批次,数据来源,对账业务ID,错误类型编码,错误原因,数据处理状态 等。通过定时任务定期轮询差错记录的方式发起差错处理流程:首先对差错记录的数据进行二次核对,如果二次核对确认这条数据并没有问题,我们就会回更差错记录的处理状态。如果二次核对发现数据确实有问题。

可以提供两种处理模式。一种是通过系统的手段自动修复。另外一种是通过报警的方式,人为介入。此外可以建立一个问题的人工处理模块。可以对一次结算流程的整个生命周期进行回放,并针对特定场景提供一键修复的能力。

差错处理标准模型

差错处理流程

整体架构图

接入方式

我们提供了一个配置后台可以让用户编写脚本的方式,实现对账。脚本使用了:AviatorScript:https://www.yuque.com/boyan-avfmj/aviatorscript

  • 配置后台

  • 失败明细

相关文章:

对账平台设计

背景 随着公司业务的蓬勃发展,交易履约清结算业务的复杂性也在不断的增高,资金以及各种数据的一致性和准确性也变得越发重要。 以交易链路为例,存在着如下一些潜在的不一致场景: 订单支付成功了,但是订单状态却还是“…...

JavaEE进阶第五课:SpringBoot的创建和使用

上篇文章介绍了Bean 作用域和生命周期,这篇文章我们将会介绍SpringBoot的创建和使用 目录1.为什么要学习StringBoot1.1什么是SpringBoot1.2SpringBoot的优点2.如何用Idea创建SpringBoot项目3.项目目录介绍和运行3.1输入Helloworld结尾1.为什么要学习StringBoot 在前…...

我带过的一名C++实习生——Z同学

刚开始带Z同学,吃饭聊天时,我顺便了解了下他的擅长:linux平台下C、C网络编程。 接下来的实习,主要分为两个阶段:小组公共培训和项目实训。 小组公共培训为期2周,主要学习和了解公司文化制度,讲师…...

面试题13. 机器人的运动范围

面试题13. 机器人的运动范围 难度:middle\color{orange}{middle}middle 题目描述 地上有一个 mmm 行 nnn 列的方格,从坐标 [0,0][0,0][0,0] 到坐标 [m−1,n−1][m-1,n-1][m−1,n−1] 。一个机器人从坐标 [0,0][0, 0][0,0] 的格子开始移动,它…...

LeetCode189_189. 轮转数组

LeetCode189_189. 轮转数组 一、描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,…...

java Files和Paths的使用详解 附有使用demo

前言 Java Files和Paths是Java 7中引入的新API,用于处理文件和目录。Files类提供了许多有用的静态方法来操作文件和目录,而Path类则表示文件系统中的路径。 创建文件和目录 在Java中创建文件和目录非常简单。我们可以使用Files类的createFile()方法和…...

如何使用ApacheTomcatScanner扫描Apache Tomcat服务器漏洞

关于ApacheTomcatScanner ApacheTomcatScanner是一个功能强大的Python脚本,该脚本主要针对Apache Tomcat服务器安全而设计,可以帮助广大研究人员轻松扫描和检测Apache Tomcat服务器中的安全漏洞。 功能介绍 1、支持使用多线程Worker搜索Apache Tomcat服…...

js中的定时器 setTimeout()和setInterval()

JavaScript 定时器,有时也称为“计时器”,用来在经过指定的时间后执行某些任务,类似于我们生活中的闹钟。 在 JavaScript 中,我们可以利用定时器来延迟执行某些代码,或者以固定的时间间隔重复执行某些代码。例如&…...

【吃透Js】深入学习浅拷贝和深拷贝

一、JavaScript数据类型原始类型对象类型二、原始类型和对象类型的区别1.原始类型2.引用类型3.复制4.比较5.值传递三、浅拷贝概念实现方法四、深拷贝概念五、浅拷贝、深拷贝和赋值的区别浅拷贝和赋值六、小结想要真正搞明白深浅拷贝,你必须要熟练掌握赋值、对象在内…...

AUTOSAR为啥要开发新的社区商业模式?

总目录链接>> AutoSAR入门和实战系列总目录 文章目录1 自适应平台架构中的集群更新1.1 ara::diag 服务(诊断)更新1.2 信号到服务映射和自动驾驶接口让我们讨论一下信号到服务映射服务:Automated Driving Interface:2 车载应用商店概念本文介绍Re…...

数据结构和算法面试常见题必考以及前端面试题

1.数据结构和算法 1.1 反转单向链表 public class Node {public int value;public Node next; }public Node reverseList(Node head) {Node pre null;Node next null;while (head ! null) {next head.next;head.next pre;pre head;head head.next}return pre; }1.2 在顺…...

一文解决Python所有报错

前言 Python是一种强大的编程语言,但是它也有一些报错,这些报错可能会让你感到困惑。本文将介绍如何解决Python中的常见报错。 首先,让我们来看看Python中最常见的报错:SyntaxError。这种报错表明你的代码中有语法错误&#xff0c…...

LeetCode 1237. Find Positive Integer Solution for a Given Equation【双指针,二分,交互】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

【C语言】结构体进阶

一、结构体 1. 结构体的声明 (1) 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。(2)结构的声明 struct tag {member-list; }variable-list;例如描述一个学生&#x…...

全志T3+FPGA国产核心板——Pango Design Suite的FPGA程序加载固化

本文主要基于紫光同创Pango Design Suite(PDS)开发软件,演示FPGA程序的加载、固化,以及程序编译等方法。适用的开发环境为Windows 7/10 64bit。 测试板卡为全志T3+Logos FPGA核心板,它是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计…...

深度学习之 imgaug (图像增强)学习笔记

深度学习之 imgaug (图像增强)前言1\. 安装和卸载2\. 示例2.1 基本使用2.2 包含常用的变换示例3 Augmenters常用函数3.1 iaa.Sequential()3.2 iaa.someOf()3.3 iaa.OneOf()3.4 iaa.Sometimes()3.5 iaa.WithColorspace()3.6 iaa.WithChannels()3.7 iaa.No…...

mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题

一、事故还原 我们仍然使用学生信息表,但是我们只需要保留两个字段即可: CREATE TABLE student_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,name varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT 姓名, PRIMARY KEY (id) ) ENGINEIn…...

一个关于事件溯源Event Sourcing的小荔枝,Golang实现

最后更新于2023年3月1日 10:23:13 参考的这个文章:https://martinfowler.com/eaaDev/EventSourcing.html 用C sharp实现的,我改写成Golang了 最简单的例子 func main() {eProc : NewEventProcessor()//refact : Cargo{Name: "Refactoring"}…...

Vue3 组合式函数,实现minxins

截至目前,组合式函数应该是在VUE 3应用程序中组织业务逻辑最佳的方法。它让我们可以把一些小块的通用逻辑进行抽离、复用,使我们的代码更易于编写、阅读和维护。 一. 什么是“组合式函数”? 根据官方文档说明,在 Vue 应用的概念中…...

什么是钉钉消息推送?

我是3y,一年CRUD经验用十年的markdown程序员👨🏻‍💻常年被誉为职业八股文选手 在前阵子我就已经接入了钉钉的群机器人和工作消息推送,一直没写文章同步到给大家。 像这种接入渠道的工作,虽然我没接入过&…...

利用 NVIDIATAO 和 WeightBias 加速AI开发

利用 NVIDIATAO 和 Weight&Bias 加速AI开发 利用图像分类、对象检测、自动语音识别 (ASR) 和其他形式的 AI 可以推动公司和商业部门内部的大规模转型。 然而,从头开始构建人工智能和深度学习模型是一项艰巨的任务。 构建这些模型的一个共同先决条件是拥有大量高…...

token - 令牌

文章目录token - 令牌学前须知:1,base64 防君子不防小人2,SHA-256 安全散列算法的一种(hash)3,HMAC-SHA2564,RSA256 非对称加密2.1 JWT - json-web-token1,三大组成2,jwt…...

应用模型开发指南上新介绍

Module、HAP、Ability、AbilitySta-ge、Context……您是否曾经被这些搞不懂又绕不开的知识点困扰? 现在,全新的《应用程序包基础知识》及《应用模型开发指南》为您答疑解惑! 这里有您关注的概念解析、原理机制阐述,也有丰富的…...

Dbeaver连接Hive数据库操作指导

背景:由于工作需要,当前分析研究的数据基于Hadoop的Hive数据库中,且Hadoop服务端无权限进行操作且使用安全模式,在研究了Dbeaver、Squirrel和Hue三种连接Hive的工具,在无法绕开useKey认证的情况下,只能使用…...

【RabbitMQ笔记09】消息队列RabbitMQ之常见方法的使用

这篇文章,主要介绍消息队列RabbitMQ之常见方法的使用。 目录 一、消息队列常见方法 1.1、连接工厂ConnectionFactory 1.2、连接Connection 1.3、通道Channel 1.4、交换机相关方法 (1)exchangeDeclare()声明交换机 1.5、队列相关方法 …...

Linux字符设备驱动模型之设备号

从上文中可知,在Linux用户空间中,如若需要操作硬件设备,均通过/dev目录下的设备文件节点进行操作,基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中,其表示字符设备的结构成员也提供了相应的设备号…...

C++多态原理

请看下面的程序&#xff0c;该程序演示了多态类对象存储空间的大小。 #include <iostream> using namespace std; class A {public:int i;virtual void func() {}virtual void func2() {} }; class B : public A {int j;void func() {} }; int main() {cout << si…...

PMP认证与NPDP认证哪个含金量高?

两个证涉及的领域不一样的&#xff0c;一个是项目管理&#xff0c;对应的是项目经理&#xff1b;一个是产品管理&#xff0c;对应的是产品经理。含金量不能相比&#xff0c;但在各自的领域的含金量是很高的&#xff0c;至少专业程度或者知名度是最高的。 我来分别说一下PMP认证…...

改进YOLOv7-Tiny系列:首发改进结合BiFPN结构的特征融合网络,网络融合更多有效特征,高效涨点

💡该教程为改进进阶指南,属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 内容出品:CSDN博客独家更新 @CSDN芒果汁没有芒果 💡本篇文章 基于 YOLOv5、YOLOv7芒果改进YOLO系列:芒果改进YOLOv7-Tiny系列:首发改进结合BiFPN结…...

PPC Insights系列:洞见安全多方图联邦

开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号知…...

免费追剧网站/官网首页入口百度

程序员往往渴望加入的是一支“30%的时间在写代码&#xff0c;而70%的时间在喝着咖啡讨论着如何将产品做好”的团队。可现实情况却是&#xff0c;团队在一边超负荷的做着需求&#xff0c;一边改着没完没了的Bug&#xff0c;软件工作已经无可挽回的沦落成了体力劳动&#xff0c;别…...

毕业设计做的网站抄袭/凡科网站官网

INFORMIX数据库常用命令 一、onstat命令集 1、onstat - 说明&#xff1a;查看数据库当前的状态 用法&#xff1a;onstat - 2、onstat -c 说明&#xff1a;查看数据库的配置文件 用法&#xff1a;onstat -c 3、onstat -d 说明&#xff1a;查看数据库空间的使用情况 用法&…...

做网站的学校有哪些/标题关键词优化报价

2019独角兽企业重金招聘Python工程师标准>>> 负载均衡 负载均衡是一种手段&#xff0c;用来把对某种资源的访问分摊给不同的设备&#xff0c;从而减轻单点的压力。 架构图 图中左侧为ZooKeeper集群&#xff0c;右侧上方为工作服务器&#xff0c;下面为客户端。每台工…...

ps如何做网站专题/推广手段

Windows 10 家庭组其实特别好用&#xff0c;但是使用过程中也可能会遇到一些问题。常见的现象有&#xff1a;在建立或加入家庭组时&#xff0c;显示“Windows 无法在此计算机上设立家庭组”&#xff1b;或者无法启动 Peer Name Resolution Protocol 和 Peer Networking Groupin…...

叫人建设网站要注意什么问题/抖音流量推广神器软件

代码编写阶段 CSDN发布时间&#xff1a;2018年04月11日 11:13:52 3月29日会议之后&#xff0c;后端进入了代码实现的阶段&#xff0c;而前端也开始也具体的界面设计。 此后小组集中讨论了三次&#xff0c;会议的主要内容即是编写代码并且解决技术问题&#xff0c;每次内容不多&…...

网站建设运营的灵魂是什么/网站关键字排名优化

lambda 传递ref参数有个语法bug&#xff0c;必须要显式书写参数类型。 //如 delegate bool FuncType(ref int num);FuncType func1; func1 num > true; //错 func1 (ref num) > true;//错 func1 (ref int num) > true;//ok//并且,当一个参数书写类型&#xff0c;其…...