分布式系统如何做数据对账?

前言

在分布式系统中,虽然我们会使用各种分布式事务的方案,来保证各个系统之间的一致性。但是,很多时候往往事与愿违。

尤其是现在很多公司都采用最终一致性的方案,而所谓最终一致性,无论是本地消息表、事务消息、还是任务重试,系统之间的调用都是有可能失败的。

而一旦发生失败,就需要有一套机制来发现这些不一致的问题,这时候就需要做数据对账了

对账时机

一般来说,根据对账的时机分为两种,离线对账和(准)实时对账。

实时对账,一般来说基本都是准实时,也就是说并不能保证无延迟,但是一般可以控制在秒级别的延迟上。而离线对账一般都是D+1的核对。

D+1:D指的是自然日,包括工作日和节假日。+1指的是第二天,也就是说数据发生后的第二天进行核对。

T+1:T指的是交易日,一般来说就是工作日,所以T+1指的就是数据发生后的下一个工作日进行核对。

技术实现

那么对账的技术实现上一般主要就是两种,要么是写代码核对,要么是写SQL核对.

写代码就是查出需要比对的两条记录,然后进行字段的比对,不一致的就抛出来。

写SQL就是做join查询或者子查询,然后通过where条件比较需要核对的字段,不一致的就抛出来。

写代码这种核对方式,一般来说都是通过定时任务实现的,通过运行定时任务,然后去扫表,或者去远程拉数据然后在业务代码中进行核对,这种方式的优点就是比较通用,不管是数据库,还是文件,还是远程接口,都可以做核对。缺点就是一旦数据量大了,代码核对的时效性就会比较差,而且代码运行存在失败的可能。万一数据量特别大,就可能会出现扫表扫不动,文件加载到内存导致OOM等问题。

所以,写代码的核对方式不推荐

那么,更好一点的方式就是写SQL了,因为数据都在数据库(数仓或者大数据框架)中,这些都可以通过SQL进行查询,如下就是比较两个系统中金额是否一致的SQL:

SELECT OUTbiz NO,bill NO,
OWNER 
FROMbill item 
WHEREOUT biz NO IN (AND charge ON amount - charge off amount = 0’ SELECTbiz id FROMcollectionCASEitem detail WHERECASEitem state = "COLLECTING" AND cur ovd principal >

那在哪写这些SQL进行核对,就有很多种方案了,一般来说有以下几个:

1、离线数仓,主要用于离线数据核对。我们现在每天会把需要离线存储的数据同步到数仓中,然后在数仓中写SQL进行数据的核对。

2、在线数据库,离线核对的话发现问题比较慢,好一点的方案是在在线库做核对,可以直接在数据库中写SQL进行数据核对。为了避免数据核对影响真实业务,可以考虑在备库中执行SQL。但是有的时候数据核对可能是多个系统之间的,这时候就要做跨库join,但是并不是所有的数据库、所有的引都文持跨库join的。

3、准实时数据库,还有一种方案,那就是不直接在数据库中写SQL,而是把数据同步到其他的地方,比如通过监听binlog的方式,把MYSQL的数据同步到实时数仓,比如我们公司内部用的就是AnalyticDB,把需要做核对的数据同步到ADB中,我们会尽量放到一个空间下面,然后在这里面写SQL作核对。同步出来的这个ADB数据,不仅可以做核对,还可以用于查询或者做报表,

4、ETL核对,还有一种比较常见的方案,那就是通过ETL工具进行数据核对,ETL包括了数据的提取、清洗、转化及加工,所以在这个过程中也是可以做核对的。

5、flink核对,flink是一个非常牛X的流处理框架,可以通过fink进行数据核对。


核对与告警

有朋友提问:如果通过sql语句发现有不一致的数据,一般是怎么处理?是发告警通知开发人员还是说需要将有问题的数据标记出来过段时间重新核对?

我们一般来说,告警的话,人工一定要跟进

至于说过段时间重新核对,这种我们一般在报警规则中把他屏蔽掉了。有需要重新核对的,我们会做一些延迟核对,或者二次核对。或者直接报警规则设置成多次失败后再报警,或者告警值调高一点

这样就是职责单一,核对就是核对,报警就是报警。有报警人就要看,否则都是无效报警,那有效报警也没人看了.

 

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

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

相关文章

蓝桥杯:数组分割(Java)

目录 问题描述输入格式输出格式代码实现 问题描述 小蓝有一个长度为N的数组A[A0,A1,… AN-1]。现在小蓝想要从A对应的数组下标所构成的集合Ⅰ0,1,2,…,N -1中找出一个子集R1,那么R1在Ⅰ中的补集为R2。记S1∈∑Ar,S2∈∑Ar,我们要求S1和S2均为…

node 之 npm

1.什么是包 node.js中的第三方模块又叫做包 就像电脑和计算机指的是相同的东西,第三方模块和包指的是同一个概念,只不过叫法不同 2.包的来源 不同于 Node.js 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所…

【计算机网络——应用层】http协议

文章目录 1. http协议1.1 http协议简介1.2 url组成1.3 urlencode与urldecode 2. http协议的格式2.1 http协议的格式2.2 一些细节问题 3. http的方法、状态码和常见响应报头3.1 http请求方法3.2 http状态码3.3 http常见的响应报头属性 4. 一个非常简单的http协议服务端5. http长…

【X806开发板试用】文章一 ubuntu开发环境搭建

一、环境配置 官方链接: 环境配置 1.安装必要的库和软件 sudo apt-get install build-essential gcc g make zlib* libffi-dev e2fsprogs pkg-config flex bison perl bc openssl libssl-dev libelf-dev libc6-dev-amd64 binutils binutils-dev libdwarf-dev u-b…

pix2pix-zero

pix2pix-zero:零样本图像到图像转换 论文介绍 Zero-shot Image-to-Image Translation 关注微信公众号: DeepGoAI 项目地址:https://github.com/pix2pixzero/pix2pix-zero 论文地址:https://arxiv.org/abs/2302.03027 本文介绍了一种名为…

Golang 函数中 defer 和 return 的调用顺序

先来看一段代码: package mainimport "fmt"func f() (ret int) {defer func() {ret}()return 1 } func main() {fmt.Println(f()) }上面这段代码的输出是2,不是1 原因在于: 1)ret 是在执行 return 1 语句后发生的 2&…

基于SpringBoot多模块项目引入其他模块时@Autowired无法注入

基于SpringBoot多模块项目引入其他模块时Autowired无法注入 一、问题描述1、解决方案 一、问题描述 启动Spring Boot项目时报 Could not autowire. No beans of ‘xxxxxxxx’ type found. 没有找到bean的实例,即spring没有实例化对象,也就无法根据配置文…

【LeetCode-中等】209.长度最小的子数组-双指针/滑动窗口

力扣题目链接 1. 暴力解法 这道题的暴力解法是两层嵌套for循环,第一层循环从 i 0 开始遍历至数组末尾,第二层循环从 j i 开始遍历至找到总和大于等于 target 的连续子数组,并将该连续子数组的长度与之前找到的子数组长度相比较&#xff0…

传输层两大战将TCP、UDP的定位

传输层 定义一些传输数据的协议和端口,传输协议同时进行流量控制,根据接收方的数据吞入熟读,规定适当的发送速率,解决传输效率及能力问题 什么是TCP TCP/IP即传输控制/网络协议,是面向连接的协议,发送数…

什么是IP公网?

IP公网是指互联网上可以公开访问的IP地址。它是经过互联网服务提供商(ISP)向用户提供的公共网络IP地址。与之相对的是内网IP地址,内网IP地址一般是由路由器或交换机分配给连接在局域网中的设备使用。 IP公网的作用非常广泛,可以应…

C#解析JSON

https://blog.csdn.net/weixin_43046974/article/details/131449900 C#解析JSON 1. JSON定义2. JSON一般构成及解析方法3. 解析举例子 1. JSON对象解析,只包含一层对象{}2. 嵌套JSON对象解析,包含多层对象{}3. JSON数组解析1(数组循环遍历&…

Web APIs知识点讲解(阶段二)

DOM-事件基础 一.事件 1.事件 目标:能够给 DOM元素添加事件监听 事件:事件是在编程时系统内发生的动作或者发生的事情,比如用户在网页上单击一个按钮 事件监听:就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函…

http工具类

public class HttpRequstUtil {/*** http请求方法** param message 查询条件* param url 查询地址* param token 身份验证token* param socketTimeout socket 响应时间* param connectTimeout 超时时间* return 返回字符串*/Deprecatedpublic stat…

金仕达与 DolphinDB 建立深度合作,共筑 FICC 科技创新新篇章

从“关起门做交易”到“打开门做服务”,国内 FICC 业务正经历从自营到市场化服务的转变,借助数据分析、算法交易等技术的快速发展,交易团队能够更加主动地发现市场需求,为不同客群提供更好的做市业务,FICC 交易电子化已…

打造智能汽车微服务系统平台:架构的设计与实现

随着智能汽车技术的飞速发展,微服务架构在汽车行业中的应用越来越广泛。采用微服务架构可以使汽车系统更加灵活、可扩展,并且有利于快速推出新功能和服务。本文将从设计原则、关键技术、数据安全等方面,介绍如何搭建智能汽车微服务系统平台架…

网络通信技术

▶1.分组交换技术 在网络通信中,数据通过网络节点的某种转发方式,实现从一个端系统到另一个端系统之间的数据传输技术称为数据交换技术。数据交换技术有电路交换、报文交换和分组交换,计算机网络采用分组交换技术。 分组就是源主机(如服务器…

【Python】FastAPI 项目创建 与 Docker 部署

文章目录 前言&需求描述1. 本地FastAPI1.1 Python 环境准备1.2 本地 Pycharm 创建FastAPI项目 2. Python FastAPI 部署2.1 服务器配置Python环境2.2.1 下载与配置Git、Pyenv等工具2.2.2 下载与配置Python 2.2 FastAPI 打包成镜像2.2.1 项目准备所需环境文件2.2.2 编写Docke…

毕业设计——基于springboot的聊天系统设计与实现(服务端 + 客户端 + web端)

整个工程包含三个部分: 1、聊天服务器 聊天服务器的职责一句话解释:负责接收所有用户发送的消息,并将消息转发给目标用户。 聊天服务器没有任何界面,但是却是IM中最重要的角色,为表达敬意,必须要给它放个…

入侵和攻击模拟 (BAS) 技术应用实践

文章目录 前言一、实施BAS的必要性二、实施BAS的关键步骤1、识别网络中的脆弱区域2、创建基线安全模型3、选择合适的BAS工具4、进行模拟攻击测试5、分析结果并改进三、BAS实施中的挑战1、组织的专业知识和能力有限2、改变传统工作流程3、安全预算不足4、难以与现有安全基础设施…

C语言中的不同变量初始值:深度解析与实践指南

在C语言编程领域,理解和掌握变量的初始化原理和过程是构建稳健、高效代码的基础。C语言对不同类型变量的初始化处理方式存在差异,这要求开发者明确理解并合理应用这些规则以避免潜在的运行时错误和未定义行为。本文将详细解读C语言中各类变量的初始状态设…