【数据同步】如何快速同步第三方平台数据?

news2024/10/6 12:30:46

文章目录

  • 前言
  • 1. 如何快速同步历史数据?
  • 2. 如何使用SFTP?
    • 2.1 账号权限控制
    • 2.2 统一数据格式
    • 2.3 使用job同步数据
  • 3. 增量数据如何处理?
  • 4. 如何校验数据一致性?

前言

最近知识星球中有位小伙伴问了我一个问题:如何快速同步第三方平台数据?
他们有个业务需求是:需要同步全国34个省市,多个系统的8种业务数据,到他们公司的系统当中。
他们需求同步全量的数据和增量的数据。
全量的数据主要是针对多个系统的历史数据,大概有几千万数据,只需要初始化一次即可。
而增量的数据,是系统后续变更的数据。

这个需求其实不简单,至少有以下难点:

  • 不能直接访问第三方数据库。
  • 不能将历史数据导出到excel中,有泄露数据的风险。
  • 如何快速同步历史数据?
  • 增量数据如何处理?
  • 接口需要做限流吗?
  • 增量数据如何校验数据的一致性?

带着这些问题,开始今天的文章之旅。

1. 如何快速同步历史数据?

想要快速同步历史数据,第一个想到的可能是直接同步数据库中的数据。
但多个第三方系统为了数据安全考虑,不可能直接把他们的数据库访问地址和相关账号密码告诉你。
即使他们告诉你了,但有很多个系统,你一个个去连数据库查数据,也非常麻烦。
有些小伙伴可能会说:这好办,让第三方系统把他们的历史数据导出到excel中,我们写个程序解析去这些excel,就能将数据快速导入到我们的数据库中。
这是个好办法,但忽略了一点:这些数据是敏感数据,不能对外暴露。
因此导出excel的方案行不通。

那么,该如何快速同步历史数据呢?
答:使用SFTP。

不知道你有没有跟银行对接过,SFTP在银行业务中经常会用到。
那么,如何用SFTP同步数据呢?

2. 如何使用SFTP?

说起SFTP,就不得不说一说FTP。

我们都知道,FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时,还可以保证数据传输的可靠性和高效性。

而SFTP是一种可以安全传输文件的协议,它是一种基于SSH(Secure Shell)的文件传输协议,它允许用户将文件以加密的形式传输到远程服务器上,以保护文件的安全性。

FTP和SFTP有哪些区别呢?

  1. 链接方式不同:FTP使用TCP的21号端口建立连接。而SFTP是在客户端和服务器之间通过 SSH 协议 (即TCP22号端口) 建立的安全连接来传输文件。
  2. 安全性不同:SFTP使用加密传输认证信息和传输的数据,相对于FTP更安全一些。
  3. 传输效率不同:SFTP传输文件时使用了加密解密技术,因此传输效率比普通的FTP要低一些。
  4. 使用协议不同:FTP使用了TCP/IP协议,而SFTP使用了SSH协议。
  5. 安全通道:SFTP协议提供了一个安全通道,用于在网络上的主机之间传输文件。而FTP协议没有安全通道。

因此可见,我们使用SFTP来传输文件还是比较安全的。
那么,如何使用SFTP来实现同步历史数据的需求呢?
答:这就需要我们做好SFTP的账号、目录和文件格式的规划了。

2.1 账号权限控制

首先需要运维同学搭建一个SFTP服务器,提供一个可以对外访问的域名和端口号。
然后需要在根目录下,创建一个存放文件的目录,比如:/data。
然后给每个省市的第三方系统都创建一个子目录,比如:/data/sichuan、/data/shenzhen、/data/beijing等。
接下来,我们需要给每个子目录创建一个账号,以及分配权限。
比如有个账号是:sichuan,密码是:sisuan123。这个账号只拥有/data/sichuan目录读数据和写数据的权限。
另外一个账号是:shenzhen,密码是:shenzhen123。这个账号只拥有/data/目录读数据和写数据的权限。
以此类推。
当然大家如果不放心,可以用在线工具,将密码设置成一个8位的随机字符串,包含字母、数字和特殊字符,这样的密码安全性相对来说要高一些。
这样相关的第三方系统都有往SFTP自己目录下读和写数据的权限。

在这里温馨提醒一下:上面这些账号读数据的权限,主要是为了后面他们好排查问题用的,不是必须分配的,我们需要根据实际情况而定。

此外,还需要给我们自己分配一个账号,开通对/data整个目录的只读权限。

2.2 统一数据格式

接下来,最关键的一步是要制定一个统一的文件格式和数据格式。
文件名称为:sichuan_20230724.txt。
也就是用 省市拼音_日期.txt 的格式。
这样大家就能非常清楚的看出,是哪个省市,哪个日期产生的数据。
然后我们需要规定txt文件的格式。
比如:id占20个字符,name占30个字符,金额占10个字符等等。
如果有些列的数据不满对应的字符长度,前面可以补0。
这样我们的程序,只需要在解析txt文件时,先读取一行数据,是一个比较长的字符串,然后按照固定的长度,去解析字符串中每一列的数据即可。

2.3 使用job同步数据

假如第三方系统都按照我们要求,已将历史数据写入到指定目录下的指定文件中。
这时我们需要提供一个job,去读取/data目录下,所有子目录的txt文件,一个个解析里面包含的历史数据,然后将这些数据,做一些业务逻辑处理,然后写入我们的数据库当中。
如图所示:
在这里插入图片描述

当然如果想快一点处理完,我们可以在job中使用多线程解析和读取不同的txt文件,然后写数据。

3. 增量数据如何处理?

对于历史数据,我们通过上面的方案,可以快速的同步数据。
但对于增量的数据如何处理呢?
增量的数据,对实时性要求比较高。
我们没办法跟之前一下,走SFTP同步文件,然后使用job定时解析文件的方案。
为了满足数据实时性的需求,我们不得不走接口实时数据同步的方案。
那么,是第三方系统提供接口,还是我们这边提供接口呢?
很显然,如果让第三方提供接口,第三方有那么多系统,我们需要对接很多很多接口,非常麻烦。
因此,这个接口必须由我们这边提供。
我们这边提供一个统一的数据上报接口,支持传入批量的数据。
为了防止第三方系统,一次性传入过多的参数,导致该接口超时,我们需要对单次上传的数据条数做限制,例如:一次请求,最大允许上传500条数据。
其实,光限制请求参数还不够。
我们的这个数据上报接口,可能会被多个系统调用,并发量可能也不小。

为了防止在高并发下,请求量突增把我们的接口搞挂了,我们需要对接口限流。
我们可以使用redis记录第三方系统请求的url和请求账号,然后在程序中查询redis中的次数,是否超过限额。允许每一个第三方系统,在1秒之内调用10次。第三方系统总的请求次数,1秒不超过500次。
如果超过了限额,则数据上报接口提示:请求太频繁,请稍后再试。

在这里插入图片描述
为了增加数据上报接口的性能,在接收到数据之后,不直接写库。
我们可以将接口中接收到的数据作为mq消息,发送到mq服务器。
然后有专门的mq消费者,实时监听mq服务器的消息,异步读取消息写入数据库。
该方案比较适合,写库操作,包含了一些复杂的业务逻辑。
如果消费速度有点慢,我们可以及时调整mq消费者,使用多线程处理,或者增加mq中队列的数量,增加mq消费者来增加消息的处理速度。
在这里插入图片描述

如果mq消费者在处理mq消息的过程中,由于网络问题,写库失败了,可以增加自动重试机制。
在这里插入图片描述

一旦mq消费者在mq消费过程中出现失败的情况,则自动重试3次,如果还是失败,则将消息写入死信队列,目前RocketMQ自带了失败重试功能。

然后有个job监控死信队列,如果一旦发现异常数据,则发报警邮件给相关开发,后面人工处理。

4. 如何校验数据一致性?

通过上面的方案,我们把历史数据和增量的数据都已经处理了。
但还有一个问题:如何校验数据一致性。
对于历史数据,其实我们好处理,第三方系统已经生成好txt文件上传到SFTP上了,我们可以直接对比那些文件即可。

但对于增量的数据,是第三方系统调用我们的数据上报接口,去上报的数据,这部分数据如何校验数据一致性呢?
答:我们可以要求第三方系统,在某日凌晨,生成一份昨日的增量数据到txt文件,然后上传到SFTP上。

我们有个job,在每天的凌晨1点会读取第三方系统生成昨日增量数据,跟我们数据库中昨日的增量数据做对比,校验数据的差异性。

如果第三方后面产生的增量数据,只有新增,没有删除和修改,使用上面的方案是没有问题的。
但如果增量的数据,包含了删除和修改的数据,可能会有问题。
因为我们做比较的数据源是昨日的增量数据,而我们的job在比较数据的过程中,万一第三方系统上报了我们正在对比的数据,更新成了一个新值,跟昨日的值不一样,这样对比数据就会产生差异。
那么,该如何解决这个问题呢?
答:我们可以只校验昨日的数据(就修改时间是昨天),今日产生的增量数据,会在明日凌晨1点的job中会去校验的。
在比较时,遍历昨日增量txt文件中的每行数据,跟数据库中的数据做对比,如果id相同,但是修改时间是今天,则忽略这条数据。
如果id相同,修改时间是昨天,则判断数据是否一致,如果不一致,则用txt文件中的数据修复我们数据库中的异常数据。

如果txt文件中的id,在我们数据库中不存在,则新增一条数据。
在这里插入图片描述

这两种情况产生的数据变动,修改时间要设置成昨天,不然明日的job又会再重新处理一次这条数据。

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

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

相关文章

Navicat16连接Oracle报错:Oracle library is not loaded

1、有时候我们在用navicat的时候连接oracle的时候,它会提示我们Oracle library is not loaded,这时候我们要首先验证本机上是否已安装oracle的客户端,如果已安装客户段,navicat中的oci.dll选择我们安装的客户段的oci.dll文件 2、…

【C进阶】深度剖析数据在内存中的存储

目录 一、数据类型的介绍 1.类型的意义: 2.类型的基本分类 二、整形在内存中的存储 1.原码 反码 补码 2.大小端介绍 3.练习 三、浮点型在内存中的存储 1.一个例子 2.浮点数存储规则 一、数据类型的介绍 前面我们已经学习了基本的内置类型以及他们所占存储…

PyTorch 深度学习实践 第10讲刘二大人

总结: 1.输入通道个数 等于 卷积核通道个数 2.卷积核个数 等于 输出通道个数 1.单通道卷积 以单通道卷积为例,输入为(1,5,5),分别表示1个通道,宽为5,高为5。假设卷积核大小为3x3&#xff0c…

直线模组选型的参考要素有哪些?

直线模组在自动化行业领域使用广泛,在不同设备运用直线模组,相对来说区别还是比较大的,而选择直线模组也是有很多要素决定的,因此懂得直线模组的选型也是至关重要的。 很多人都觉得选型是比较困难的,尤其是对于公司采购…

Ansible学习笔记10

1、在group1的被管理机里的mariadb里创建一个abc库; 1) 然后我们到agent主机上进行检查: 可以看到数据库已经创建成功。 再看几个其他命令: #a组主机重启mysql,并设置开机自启 ansible a -m service -a "namemy…

Java中异或操作和OTP算法

最近在研究加密算法,发现异或操作在加密算法中用途特别广,也特别好用。下面以Java语言为例,简单记录一下异或操作,以及在算法中的使用,包括常用的OTP算法。 一,异或操作特征 1, 相同出0&#…

二分类问题使用rmse训练会是什么结果

通常情况下,使用均方根误差(RMSE,Root Mean Square Error)来训练二分类问题可能并不是最优选择,因为RMSE通常用于衡量连续值的预测误差,而不是分类问题。二分类问题更常用的衡量标准是交叉熵损失&#xff0…

行业追踪,2023-08-30

自动复盘 2023-08-30 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

java八股文面试[数据库]——MySql聚簇索引和非聚簇索引索引区别

聚集索引和非聚集索引 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。 1、聚集索引 聚集索引表记录的排列顺序和索引的排列顺序一致(以InnoDB聚集索引的主键索引来说,叶子节点中存储的就是行数据,行数据在…

使用errors.Wrapf()代替log.Error()

介绍不同语言的错误处理机制: Error handling patterns[1] Musings about error handling mechanisms in programming languages[2] 项目中 main调func1,func1调取func2... 这样就会出现很多的 if err ! nil { log.Printf()} , 在Kibana上查看时会搜到多条日志, 需要…

解决iPad故障问题的三种重置方式:出厂恢复、软重置和强制重启

这篇文章解释了如何重新启动iPad,以及如果它没有响应,如何强制它重新启动。它还包括如何重置iPad的其他选项。 一、重启iPad的最简单方法(所有型号) 基本的重新启动是最容易做到的,也是遇到硬件问题时应该尝试的第一件事。该过程不会删除你的数据或设置。请执行以下步骤…

源码编译安装opencv4.6.0,别的版本也行

1.下载opencv4.6.0 系统: ubuntu 1804 64位点我下载opencv 4.6.0 https://codeload.github.com/opencv/opencv/zip/refs/tags/4.6.0 2.编译安装opencv4.6.0 进入到下载目录下: unzip -qo opencv-4.6.0.zip -d ./ cd opencv-4.6.0 mkdir build cd build cmake -D…

六、事务-5.事务隔离级别

一、概念 从上至下,隔离级别越来越高,数据越来越安全,性能越来越低。 读未提交read uncommitted —— 隔离级别最低(数据安全性最差),性能最好串行化serializable ——隔离级别最高,性能最差 …

【GNN+异常检测】Deep Anomaly Detection on Attributed Networks

文章目录 论文简介摘要属性网络相关介绍存在的问题论文贡献1. 提出的模型 - Dominant2. 实验 论文简介 原文题目:Deep Anomaly Detection on Attributed Networks 中文题目:基于属性网络的深度异常检测 发表会议:SIAM International Conferen…

Java“魂牵”京东店铺所有商品数据接口,京东店铺所有商品API接口,京东API接口申请指南

要通过京东的API获取店铺所有商品数据,您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例,展示如何通过京东开放平台API获取整店商品数据: 首先,确保您已注册成为京东开放平台的开发者,…

快速提升代码性能:FastAPI多线程的利用

在现代网络应用中,高性能和快速响应是至关重要的,Python 的 FastAPI 框架以其出色的性能和简单易用的特点,成为了许多开发者的首选。然而,在某些场景下,单线程运行可能无法满足需求,这时候就需要考虑使用多…

【AutoLayout案例08-基于AutoLayout的动画 Objective-C语言】

一、好,那么,再给大家说一个什么呢 1.再给大家说一个,这么一个东西, 我们之前,通过frame,是不是可以通过animateWithDuration,可以执行动画吧 通过直接设置frame的方式,可以执行动画, 我们这里,通过约束,的方式, 也可以执行动画, 通过约束,也可以执行动画, …

基于FlaUI自动化+chatGPT实现微信自动回复

先看效果图 本次主要介绍如何实现自动回复: 1.将文件传输助手置顶,模拟鼠标点击文件传输助手; 2.一直刷新会话列表,有新的消息就需要回复内容; 3.当刷新到新的消息时,模拟鼠标点击到对应的会话人&#x…

擦除信道(erasure channel)

定义 二进制擦除通道(BEC)是一种信道模型。发送端发送一个比特(0或1),接收端要么正确接收该比特(0或1),要么以概率 P e P_{e} Pe​接收到该比特没有被接收的信息(即“擦除…

公司电脑文件数据透明加密、防泄密系统

一套利用驱动层透明加密技术实现电子文件安全加密的防护产品,从源头上保障数据安全和使用安全的加密系统。该系统遵循基于文件生命周期安全防护的思想,集成了密码学、访问控制和审计跟踪等技术手段,对企事业单位电子文件的存储、访问、传播和…