电商API接口——实现数据同步的实时数据封装接口

常见的数据同步/集成场景多发生于不同的存储系统、不同的存储格式,如从 mysql 同步数据至数仓、excel 或 csv 导入数据库中,但是众多数据同步解决方案很少涉及从 http 接口同步数据。

如淘宝、拼多多等电商平台平台,平台内部不同团队之间的数据打通,很多的开源数据集成工具可以满足大部分场景。但是像三方卖家入驻电商平台后,就需要在电商平台注册自研应用,通过开放平台提供的接口打通自研应用与电商平台的数据壁垒,准确及时地获取到商品、订单、物流、售后以及评价等实时变更数据,而无法实现数据库 binlog 或消息队列等形式的数据同步。

本系列文章描述在对接快手、淘宝等开放平台同步商品、详情,订单、售后单等数据的一些经验总结和实践方案。

数据同步接口

根据数据量和实时性的不同需求,开放平台数据接口查询接口总共有 2 种形式:

  • 详情接口。

    • 详情接口又分为单详情接口和批量详情接口。如查询店铺信息,单详情接口只支持根据单个店铺 id 获取店铺信息,而批量详情接口可以同时传入 20 个店铺 id,在需要获取 100 个店铺信息的情况下,前者需要发起 100 次调用,后者只需要调用 5 次。

    • 单实体和多实体。如获取店铺详情,使用店铺 id 即可获取,而对于 sku 库存详情,需要同时传入 sku id 和仓库 id。对于 sku 库存,需要同时遍历 sku 和仓库,才能获取完整的 sku 库存数据。

  • 列表接口,或者分页接口。比如店铺下的商品列表接口,仓库列表,平台类目列表等。

  • 增量接口。支持时间范围查询的分页接口。比如订单列表接口,根据订单修改时间分页查询。

而数据同步的难点也在于对支持时间范围查询的分页接口准确、及时地同步数据,下面也主要介绍增量接口的几种实现。

增量接口

1.普通形式

根据时间范围进行分页请求的基本实现,请求参数中带有开始结束时间加上分页参数。

请求参数和响应结果如下:

{"startTime": "2021-11-11 00:00:00","endTime": "2021-11-12 00:00:00","pageIndex": 1,"pageSize": 50 
}[{...},{...},{...}
]

请求接口时需要携带时间范围和分页信息,而接口响应为数据列表,响应不包含分页信息,判断是否请求下一页,需要根据当前响应数据列表 size 是否等于请求参数中的 pageSize。github 的 list-commits 就是此种类型。

2.响应包含分页信息

普通形式接口响应是不包含分页信息,github 的 list-commits 接口获取分页信息需要一些特殊的技巧。

在管理后台类型的 web 页面中经常可以看到支持分页的列表页,这种页面接口的返回数据一般如下:

{"startTime": "2021-11-11 00:00:00","endTime": "2021-11-12 00:00:00","pageIndex": 1,"pageSize": 50 
}{"dataCount": 10000,"pageIndex": 1,"pageSize": 50,"datas": []
}

接入方在判断是否有一页的时候,可以判断 pageIndex * pageSize 是否大于 dataCount 来决定是否继续请求。

这种响应结果,接入方可以根据 dataCount 和 pageSize 计算得出 maxPageIndex,因此分页请求形式可以从第一页请求到最后一页,也可以从最后一页请求到第一页。

一般情况下,开发者都会直接从第一页开始请求,直到最后一页,什么情况下才会出现不得不从最后一页请求呢?当出现修改时间陷阱的时候。

修改时间陷阱

开放平台往往也会根据业务需求,提供不同类型的时间范围,比如订单场景,有订单创建时间,修改时间,支付时间,出库时间等。一般情况下,订单创建时间、支付时间、出库时间等一旦确定就不会再改变,修改时间为每次订单发生状态变更如支付、发货、确认收货等都会将修改时间置为当前时间。如果使用不会变动的订单创建时间等来同步,一旦订单发生变更,如出现退货退款,这些时间是无法感知到订单实时变动的,而使用修改时间,无论是订单创建、还是用户支付、卖家发货,一旦订单有变更,都会反映到修改时间,从而可以实时地获取订单状态变更。

对于数据接入者来说来说,最喜欢的时间类型为修改时间,根据修改时间同步可以确保数据发生修改后实时地同步过来。

因为订单状态每次发生变更,修改时间都会变动。如果正好处在同步时间区间内的订单发生了变更,会存在一个丢数据的陷阱:必须按照修改时间降序进行同步,原因如下:

假设有订单数据在某个时间范围内从左向右按照修改时间升序排序,效果如下:

1 2 3 4 5    6 7 8 9 10    11 12 13 14 15    16 17 18 19 20

在同步这个时间范围内,如果 20 条数据没有发生任何修改,分页拉取第一页 1 ~ 5,第二页 6 ~ 10 等可以确保数据不会漏。

但是在拉取第一页 1 ~ 5 后,数据 5 发生修改,其余数据不变,拉取第二页时再按照修改时间升序排序,此时排序效果如下:

1 2 3 4 6    7 8 9 10 11    12 13 14 15 16    17 18 19 20

可以看到数据 6 被归到第一页中,之后拉取第二页时会从数据 7 开始,数据 6 被遗漏。

按照修改时间同步,需要分页请求多次才能同步完成时,中间数据发生修改会导致数据排序顺序发生变动,从而造成数据遗漏。

处理方式也很简单,从最后一页向前拉即可。

同样是上面的 20 条数据,在同步完最后一页数据 16 ~ 20 条后,数据 5 发生变更,同步倒数第二页时,同步到的数据为 12 ~ 16,逐步推进分页,在最后一次请求中同步到数据 1 ~ 6。

倒着拉虽然不会出现数据遗漏的情况,但是可以观察到数据 16 是被重复拉取的,接入方需要做好数据更新的幂等性。

数据接入时需确定时间类型,会不会发生变动,以及排序顺序:

  • 开放平台根据修改时间升序排序时,接入方需要从后向前翻页;

  • 开放平台根据修改时间降序排序时,接入方需要从前往后翻页。

3.翻页优化:取消 dataCount ,使用 hasNext

对于分页接口,普遍存在深翻页潜在风险。开放平台在实现分页接口时,会尽量减少深翻页的影响或者直接规避深翻页,使用 hasNext 代替 dataCount 就是一种减少翻页消耗的手段。

请求参数和响应结果如下:

{"startTime": "2021-11-11 00:00:00","endTime": "2021-11-12 00:00:00","pageIndex": 1,"pageSize": 50 
}{"hasNext": true,"pageIndex": 1,"pageSize": 50,"datas": []
}

对于关系型数据库如 mysql,返回结果中的 dataCount 和 datas 无法在一条 sql 中查询获取,需分别执行一次 count 和 select limit offset 请求才能获取 dataCount 和 datas

接口响应包含 dataCount 字段的目的是为了方便接入方判断何时中止分页请求,开放平台使用 boolean 类型的 hasNext 字段,帮助接入方判断是否到达最后一页。

开放平台该如何确定 hasNext 的值呢?执行 select 语句时设置 size 为 pageSize + 1,如果查询语句返回数据量为 pageSize + 1,存在下一页,否则不存在。

接口不返回 dataCount 字段,可以避免 count 查询,极大提高接口性能。

淘宝开放平台接口大量采用此种形式,如查询卖家已卖出的增量交易数据(根据修改时间)。

使用 hasNext 时需要开放平台根据修改时间降序排列,因为接入方无法实现从后向前翻页。

4.翻页优化:取消 pageIndex,使用 cursor

分页接口普遍惧怕深翻页,深分页会拖累接口响应时间,对数据库造成较大压力,带来潜在的系统崩溃风险,而开放平台保证稳定性必须小心处理深分页。

深分页 sql 的问题在于过深的排序:select * from table limit 50 offset 1000000

一般解决深分页的思路是使用 search afterselect * from table where id > 2000000 limit 50

cursor 就是用来实现 search after 的一种方式:取 datas 的最后一条数据的 timestame + id 作为 cursor,交互时第一次请求时 cursor 为空不传入,之后每次请求传入响应中 cursor 值,直到 cursor 返回一个特殊标识,分页结束。

请求参数和响应结果如下:

{"startTime": "2021-11-11 00:00:00","endTime": "2021-11-12 00:00:00","cursor": "1639487400913_5","pageSize": 50 
}{"cursor": "1639487400918_10","pageSize": 50,"datas": []
}

开放平台接口对 cursor 进行解析构建 select 语句:

select * 
from table 
where id > ${id} 
and time >= ${timestame} 
and time < ${endTime} 
order by time, id
limit ${pageSize} 

快手开放平台大量使用采用此种形式,如获取订单列表v2。

接口常见限制

开放平台为了保护接口安全,会对接口进行一定限制:

  • 开始时间结束时间相差不能过大以避免深翻页。比如不能超过 7 天

  • 只允许同步近期数据。比如订单类只允许同步 90 天内订单

  • 减少每次请求数据量。比如限制每页数据最多 100 条

  • 接口限流。限制接口请求并发和 qps

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

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

相关文章

pre-existing shared memory block

发生原因: 1.服务器cpu、内存进行扩容 2.非正常关闭,导致任在占用共享内存段 解决方案: 根据shmid进行关闭 ipcs -mipcrm -m xxx

JavaScript进阶知识汇总~

JavaScript 进阶 给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 1.原型链入门 1) 构造函数 当我们自定义一个函数时(箭头函数与生成器函数除外)&#xff0c;这个函…

LV.12 D13 C工程与寄存器封装 学习笔记

一、C语言工程简介 把模板在linux解压出来 代码写在interface.c就可以了。 map.lds是链接脚本文件&#xff08;负责代码的排布&#xff09; include中是头文件&#xff0c;src中是写好的源代码 start.s是启动代码&#xff0c;在interface.c之前运行&#xff0c;把cpu和栈做一…

mac vscode 使用 clangd

C 的智能提示 IntelliSense 非常不准&#xff0c;我们可以使用 clangd clangd 缺点就是配置繁琐&#xff0c;优点就是跳转和提示代码精准 开启 clangd 之后会提示你关闭 IntelliSense 1、安装插件 clangd 搜索第一个下载多的就是 2、配置 clangd 可执行程序路径 clangd 插…

【数据结构】面试OJ题——时间复杂度2

目录 一&#xff1a;移除元素 思路&#xff1a; 二&#xff1a;删除有序数组中的重复项 思路&#xff1a; 三&#xff1a;合并两个有序数组 思路1&#xff1a; 什么&#xff1f;你不知道qsort&#xff08;&#xff09; 思路2&#xff1a; 一&#xff1a;移除元素 27. 移…

L2-1 插松枝

L2-1 插松枝 分数 25 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始…

IDEA 2023.2.2 使用 Scala 编译报错 No scalac found to compile scala sources

一、问题 scala: No scalac found to compile scala sources 官网 Bug 链接 二、临时解决方案 Incrementality Type 先变成 IDEA 类型 Please go to Settings > Build, Execution, Deployment > Compiler > Scala Compiler and change the Incrementality type to …

如何使用批量重命名的方法替换重复文件名内容

在文件管理过程中&#xff0c;我们有时会遇到文件名中包含相同部分内容的情况&#xff0c;这不仅会使文件显得混乱&#xff0c;而且还会给文件检索和使用带来不便。为了解决这个问题&#xff0c;我们可以使用云炫文件管理器批量重命名进行批量替换。下面是如何使用这种方法进行…

机器学习---使用 TensorFlow 构建神经网络模型预测波士顿房价和鸢尾花数据集分类

1. 预测波士顿房价 1.1 导包 from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport itertoolsimport pandas as pd import tensorflow as tftf.logging.set_verbosity(tf.logging.INFO) 最后一行设置了Ten…

面试测试工程师一般问什么问题?

面试和项目一起&#xff0c;是自学路上的两大拦路虎。面试测试工程师一般会被问什么问题&#xff0c;总结下来一般是下面这4类&#xff1a; 1.做好自我介绍 2.项目相关问题 3.技术相关问题 4.人事相关问题 接下来&#xff0c;主要从以上四个方向分别展开介绍。为了让大家更有获…

[双指针](一) Leetcode 283.移动零和1089.复写零

[双指针] Leetcode 283.移动零和1089.复写零 移动零 283. 移动零 1.题意分析 (1) 给你一个数组&#xff0c;将数组中的所有0移动到数组的末尾 (2) 保证非0元素在数组中相对位置不变 (3) 在原数组中操作 2.解题思路 由于题目要求我们移动数组内容&#xff08;也就是交换两…

离线语音通断器开发-稳定之后顺应新需求

使用云知声的US516p6方案开发了一系列的离线语音通断器&#xff0c;目前已经取得了不小的收获&#xff0c;有1路的&#xff0c;3路的&#xff0c;4路的&#xff0c;唛头和扬声器包括唛头线材也在不断的更新打磨中找到了效果特别好的供应商。 离线语音通断器&#xff0c;家用控…

Beyond Compare比较规则设置 Beyond Compare怎么对比表格

在对文件进行比较时&#xff0c;文件夹内的文件可能存在不同类型、不同后缀名、不同内容等差异&#xff0c;这些差异会影响具体的比较结果&#xff0c;因此需要我们对软件的比较规则进行一些设置。接下来就让我们一起来学习一下Beyond Compare比较规则设置&#xff0c;Beyond C…

重构之美:Java Swing中 如何对指定行文本进行CSS样式渲染,三种实现思路分享

文章目录 需求分析Document 应用彩蛋 需求分析 在Swing中&#xff0c;如果期望实现对JTextArea 或者 TextPane等文本区域实现单行渲染改怎么做&#xff1f;如上图所示 总的来说有两种实现方案 文本行数可控&#xff0c;那么构造一组JLabel集合按表单顺序添加&#xff0c;这样可…

松下A6B伺服 马达不动问题解决

本人在用信捷XDH plc ethercat总线&#xff0c;连松下A6B伺服&#xff0c;轴配置完成轴调试时&#xff0c;出现能使能&#xff0c;但 马达不动的情况。 开始总怀疑时信捷PLC的原因&#xff0c;后面查明是输入口定义引起的。 用USB线连接伺服&#xff0c;打开PANAPARM软件,自…

在Mac上安装MongoDB 5.0

MongoDB 5.0安装 1、环境描述 操作系统&#xff1a;macOS 14.0 (23A344) 2、安装MongoDB 2.1、tar解压包安装 下载地址&#xff1a;Download MongoDB Community Server | MongoDB 创建一个目录&#xff0c;以便数据库将文件放入其中。&#xff08;默认情况下&#xff0c;数据…

linux--

一、crond 任务调度 1、原理示意图 2、crontab 进行定时任务的设置 2.1. 概述 任务调度&#xff0c;是指系统在某个时间执行的特定的命令或程序。任务调度分类&#xff1a; 系统工作: 有些重要的工作必须周而复始地执行。如病毒扫描等 个别用户工作:个别用户可能希望执行某些…

深度学习:张量 介绍

张量[1]是向量和矩阵到 n 维的推广。了解它们如何相互作用是机器学习的基础。 简介 虽然张量看起来是复杂的对象&#xff0c;但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。 向量是元素的一维列表&#xff1a; 矩阵是向量的二维列表&#xff1a; 下标…

Ajax学习笔记第三天

做决定之前仔细考虑&#xff0c;一旦作了决定就要勇往直前、坚持到底&#xff01; 【1 ikunGG邮箱注册】 整个流程展示&#xff1a; 1.文件目录 2.页面效果展示及代码 mysql数据库中的初始表 2.1 主页 09.html:里面代码部分解释 display: inline-block; 让块元素h1变成行内…

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示