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

news2024/9/22 13:45:31

前言

最近知识星球中有位小伙伴问了我一个问题:如何快速同步第三方平台数据?

他们有个业务需求是:需要同步全国34个省市,多个系统的8种业务数据,到他们公司的系统当中。

他们需求同步全量的数据增量的数据

全量的数据主要是针对多个系统的历史数据,大概有几千万数据,只需要初始化一次即可。

而增量的数据,是系统后续变更的数据。

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

  1. 不能直接访问第三方数据库。

  2. 不能将历史数据导出到excel中,有泄露数据的风险。

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

  4. 增量数据如何处理?

  5. 接口需要做限流吗?

  6. 增量数据如何校验数据的一致性?

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

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/811660.html

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

相关文章

Ray

public Ray(Vector3 origin, Vector3 direction); 射线:origin为起始点,direction为射线方向 public static bool Raycast(Ray ray); 物理射线监测:返回值为bool型,可以确定射线有无碰撞到碰撞体 public static bool Raycast(R…

isp调试工具环境搭建及其介绍!

一、isp调试环境搭建: 后期调试isp,是在rv1126提供的RKISP2.x Tuner工具上进行调试,所以我们大前提必须要把这个环境和一些操作先搞熟悉来,后面有一些专用术语,我们遇到了再去看,现在专门看一些专用术语&am…

Spring Cloud简单记录

1. Spring Cloud是什么 工作这么多年,哈哈。。。没深入理解spring,spring cloud也是没有用过。趁着周末,搞一搞概念,先搞清楚是什么,虽然是什么只有用过之后才能理解的更具体,但是还是需要先整体的熟悉一下…

联想拯救者如何开启独显直连

不同机型有不同的切换方式,下面就分别给大家讲一下: 显卡模式切换方式一: 打开联想电脑管家,选择游戏模式,在左侧菜单栏选择显卡模式,然后就能看到显卡的输出模式了,默认是混合模式&#xff0c…

React之组件的生命周期

React之组件的生命周期 一、概述二、整体说明三、挂载阶段四、更新阶段五、卸载阶段 一、概述 生命周期:一个事务从创建到最后消亡经历的整个过程组件的生命周期:组件从被创建到挂载到页面中运行,再到组件不用时卸载的过程意义:理解组件的生…

RT1052的定时器

文章目录 1 通用定时器1.1 定时器框图1.2 实现周期性中断 2 相关寄存器3 定时器配置3.1 时钟使能3.2 初始化GPT1定时器3.2.1 base3.2.2 initConfig3.2.2.1 clockSorce3.2.2.2 divider3.2.2.3 enablexxxxx 3.3 设置 GPT1 比较值3.3.1 base3.3.2 channel3.3.3 value 3.4 设置 GPT…

10-矩阵(matrix)_方阵_对称阵_单位阵_对角阵

矩阵及其运算 [ a 11 ⋯ a 1 n ⋯ ⋯ ⋯ a m 1 ⋯ a m n ] \begin{bmatrix} a_{11} & \cdots & a_{1n} \\ \cdots & \cdots & \cdots \\ a_{m1} & \cdots & a_{mn} \\ \end{bmatrix} ​a11​⋯am1​​⋯⋯⋯​a1n​⋯amn​​ ​ 矩阵就是二维数组&…

【Golang 接口自动化02】使用标准库net/http发送Post请求

目录 写在前面 发送Post请求 示例代码 源码分析 Post请求参数解析 响应数据解析 验证 发送Json/XMl Json请求示例代码 xml请求示例代码 总结 资料获取方法 写在前面 上一篇我们介绍了使用 net/http 发送get请求,因为考虑到篇幅问题,把Post单…

华为OD机试真题 Java 实现【输出指定字母在字符串的中的索引】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述说明: 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题&#x…

四年前没做成的跑腿代驾平台,四年后再做也许就成了

​几年前新零售概念大火,不止是传统门店商家蠢蠢欲动,很多传统行业都在试图搭上互联网的快车,在传统实体中脱颖而出。当时炒的最热的除了社区团购、智慧门店就是同城跑腿、搬家、拉货、代驾代买这类服务型了。 社区团购几乎是各家杀的头破血流…

Zabbix分布式监控快速入门

目录 1 Zabbix简介1.1 软件架构1.2 版本选择1.3 功能特性 2 安装与部署2.1 时间同步需求2.2 下载仓库官方源2.3 Zabbix-Server服务端的安装2.3.1 安装MySQL2.3.1.1 创建Zabbix数据库2.3.1.2 导入Zabbix库的数据文件 2.3.2 配置zabbix_server.conf2.3.3 开启Zabbix-Server服务2.…

Day47 算法记录|动态规划14子序列

子序列 1143. 最长公共子序列1035.不相交的线53. 最大子数组和 1143. 最长公共子序列 这道题和718. 最长重复子数组的区别:这道题的子序列可以不连续 这个视频讲解的很好 class Solution {public int longestCommonSubsequence(String text1, String text2) {char…

打开域名跳转其他网站,官网被黑解决方案(Linux)

某天打开网站,发现进入首页,马上挑战到其他赌博网站。 事不宜迟,不能让客户发现,得马上解决 我的网站跳转到这个域名了 例如网站跳转到 k77.cc 就在你们部署的代码的当前文件夹下面,执行下如下命令 find -type …

SQL-每日一题【1075. 项目员工 I】

题目 项目表 Project: 员工表 Employee: 请写一个 SQL 语句,查询每一个项目中员工的 平均 工作年限,精确到小数点后两位。 查询结果的格式如下: 解题思路 前置知识 AVG 函数 定义和用法: AVG 函数返回数…

基于ARM+FPGA (STM32+ Cyclone 4)的滚动轴承状态监测系统

状态监测系统能够在故障早期及时发现机械设备的异常状态,避免故障的 进一步恶化造成不必要的损失,滚动轴承是机械设备的易损部件,本文对以滚动 轴承为研究对象的状态监测系统展开研究。现有的监测技术多采用定时上传监 测数据,…

【Spring AOP + 自定义注解 + 数据源 实现主从库切换读写分离】—— 案例实战

💧 S p r i n g A O P 主从数据源切换 读写分离 自定义注解案例实战! \color{#FF1493}{Spring AOP 主从数据源切换 读写分离 自定义注解 案例实战!} SpringAOP主从数据源切换读写分离自定义注解案例实战!💧 …

提升开发效率,Lombok的链式编程和构建模式

目录 链式编程 定义 代码示例 ​编辑 Accessors(chaintrue) 开启链式编程 ​编辑 Accessors(chain true,fluent true) 去除set和get 构建模式 定义 代码示例 ​编辑 踩坑 Singular 定义 代码示例 踩坑默认值情况 ​编辑 With 定义 代码示例 链式编程 定义 链…

SQL-每日一题【1070. 产品销售分析 III】

题目 销售表 Sales: 产品表 Product: 编写一个 SQL 查询,选出每个销售产品 第一年 销售的 产品 id、年份、数量 和 价格。 结果表中的条目可以按 任意顺序 排列。 查询结果格式如下例所示: 示例 1: 解题思路 前置知…

永恒之蓝复现(ms17-010)

目录标题 一、漏洞原理二、影响版本三、永恒之蓝复现复现环境复现过程1.主机发现 2.使用MSF的永恒之蓝漏洞模块3.使用ms17-010扫描模块,对win7进行扫描4.使用ms17-010攻击模块,对win7进行攻击5.得到win7权限6.通过shell对win7进行控制 一、漏洞原理 永恒…

第101章#远程调试西门子PLC(明牛智能网关)入门

一、下载明牛网站上的MNConfig(用于配置MNGate系列产品)。 二、注册账号。 三、用注册的账号登录MNConfig 四、在左侧BOX列表中,点击BOX列表—右键—添加BOX 五、选择联网方式,一般都是用的4G。 可以用自己的手机卡进行测试。 1、插入4G卡&am…