技术分享|电商数据接口|淘宝天猫京东商品API接口之数据同步

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

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

本系列文章描述笔者在实际工作中对接快手、淘宝等开放平台同步商品、订单、接口售后单等数据的一些个人经验总结和实践方案。

数据同步接口

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

  • 分页接口。比如获取仓库列表,平台类目列表等。

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

数据同步的难点也在于准确、实时地通过时间范围分页查询接口同步数据。

基本实现:分页请求

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

请求参数 json 如下:

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

响应结果 json 如下:

{
 "dataCount": 10000,
 "pageIndex": 1,
 "pageSize": 50,
 "datas": [...]
}

接入方在接入数据的时候可以根据时间范围、分页参数逐时间段逐页同步数据,确保数据不丢失。

时间类型

开放平台往往也会根据业务需求,提供不同类型的时间范围,比如订单场景,有订单创建时间,修改时间,支付时间,出库时间等。对于数据接入者来说来说,最喜欢的时间类型为修改时间,根据修改时间同步可以确保数据发生修改后实时地同步过来。

但是修改时间有个丢数据的陷阱:需要根据修改时间降序同步。

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

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 被重复同步,接入方需要做好数据更新的幂等性。

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

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

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

接口常见限制

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

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

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

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

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

取消 dataCount 响应字段,改为使用 hasNext

对于关系型数据库的存储,如 mysql,返回结果中的 dataCount 和 datas 两个字段无法在同一条查询语句中获取,需要分别执行一次 count 和分页 select 请求才能获取 dataCount 和 datas

接口响应包含 dataCount 字段的目的是为了接入方能够计算何时终止分页请求,这是必要的,因为接入方需要能够确定何时终止分页,为此开放平台接口需要多执行一次 count 语句。

为支持接入方分页请求,在接口响应中返回 boolean 类型的 hasNext 字段,表示是否还有下一页,帮助接入方判断是否到达最后一页。

接口响应中不再返回 dataCount 字段,可以避免开放平台进行 count 查询,极大提高接口性能。

那么开放平台该如何确定 hasNext 的值呢?

可以在执行 select 语句时设置 size 为 pageSize + 1,如果查询语句返回数据量为 pageSize + 1,存在下一页,否则不存在。

这种接口设计请求参数不变,响应参数如下:

{
 "hasNext": true,
 "pageIndex": 1,
 "pageSize": 50,
 "datas": [...]
}

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

取消 pageIndex 入参,改用 cursor

分页接口普遍惧怕深分页,即 limit 100 offset 1000000,深分页不仅会拖累接口响应时间,还会对数据库造成较大压力,带来潜在的系统崩溃风险。

为了减少深分页,开放平台多会限制时间范围间隔,比如结束时间开始时间不能相差超过 7 天,但是这种方式只能减少深分页而无法彻底杜绝。

cursor 方案可以彻底避免深分页问题。

请求参数 json 如下:

{
 "startTime": "2021-11-11 00:00:00",
 "endTime": "2021-11-12 00:00:00",
 "cursor": "1639487400913_5",
 "pageSize": 50 
}

响应参数 json 如下:

{
 "hasNext": true,
 "cursor": "1639487400918_10",
 "pageSize": 50,
 "datas": [...]
}

交互时第一次请求时 cursor 为空不传入,之后每次请求传入响应中 cursor 值,直到 cursor 返回一个特殊标识,分页结束。

使用 cursor 避免深分页的原理在于 cursor 的构成形式:为 datas 的最后一条数据的 timestamp + id。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源】基于Vue.js的高校学院网站的设计和实现

项目编号&#xff1a; S 020 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S020&#xff0c;文末获取源码。} 项目编号&#xff1a;S020&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教…

webpack 创建typescript项目

【视频链接】尚硅谷TypeScript教程&#xff08;李立超老师TS新课&#xff09; 创建webpack 项目 IDE&#xff1a;webstorm 新建一个空的项目运行npm init初始化项目目录结构 1. 安装 webpack&#xff1a;构建工具webpack-cli&#xff1a; webpack的命令行工具typescript&am…

福州大学《嵌入式系统综合设计》实验三:多媒体开发基础编程

一、实验目的 本实验基于搭建好的开发环境和硬件环境&#xff0c;通过编写简单的通信实验&#xff0c;验证开发环境&#xff0c;掌握多媒体开发编程基础&#xff0c;包括SOCKET编程、多线程编程和线程同步知识。 二、实验内容 基于套接字、多线程、同步锁机制实现多媒体文件…

c++语言核心及进阶

核心编程 内存分区模型 根据c执行将内存划分为5个区域&#xff1a; 代码区&#xff0c;存放函数体的二进制&#xff0c;即CPU执行的机器指令&#xff0c;并且是只读的&#xff1b;常量区&#xff0c;存放常量&#xff0c;即程序运行期间不能被改变的量。全局区&#xff08;静…

汇编-PUSHFD和POPFD标志寄存器值压栈和出栈

PUSHFD指令将32位EFLAGS寄存器内容压入堆栈&#xff0c; 而POPFD指令则将栈顶单元内容弹出到EFLAGS寄存器 格式&#xff1a;

finalshell上传文件失败的解决方法

问题描述 最近使用虚拟机docker部署项目&#xff0c;使用的finalshell远程连接虚拟机&#xff0c;然后奇怪的发现无法往里面传输文件&#xff0c;各种传输方式&#xff08;手动or直接拉拽&#xff09;都不行&#xff0c;直接报错如下&#xff1a; 原因分析 一开始我以为是新…

kibana 7安装

手动安装 下载 wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.15-linux-x86_64.tar.gz 解压 mv kibana-7.17.15-linux-x86_64.tar.gz /usr/local tar -zxvf kibana-7.17.15-linux-x86_64.tar.gz chown -R es:es kibana-7.17.15-linux-x86_64修改配置 s…

【HarmonyOS】获取备案需要的公钥和MD5签名问题

【关键字】 HarmonyOS、公钥、MD5签名 【问题描述】 有cp反馈Harmony App如何获取备案需要的公钥和MD5签名。 【解决方案】 1、获取备案需要的公钥&#xff1a; 1&#xff09;用记事本打开签名对应.cer文件 2&#xff09;里面的内容粘贴到一个可以查看证书的网站上面&…

23设计模式详解「全23种」

✍️作者简介&#xff1a;码农小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f449;关注✨、点赞&…

【idea】解决idea 执行maven build总下载 Downloading maven-metadata.xml文件

可以看到如下日志中打印了执行的命令行&#xff0c;其中包含 --update-snapshots&#xff0c;是强制更新的意思。 日志内容如下&#xff1a; D:\env\jdk1.8.0_261\bin\java.exe --update-snapshots -s D:\env\apache-maven-3.8.6\conf\settings.xml -Dmaven.repo.localD:\env\…

苹果Siri怎么打开?教你两招轻松唤醒!

苹果Siri助手是苹果公司开发的智能语音助手。作为智能语音助手&#xff0c;Siri可以理解用户的指令&#xff0c;并给出相应的回答或执行相应的操作&#xff0c;帮助大家完成各种任务&#xff0c;比如发送短信、查询天气、播放音乐、设置提醒等等。 然而&#xff0c;还有一些小…

【软件工程师从0到1】- 继承 (知识汇总)

前言 介绍&#xff1a;大家好啊&#xff0c;我是hitzaki辰。 社区&#xff1a;&#xff08;完全免费、欢迎加入&#xff09;日常打卡、学习交流、资源共享的知识星球。 自媒体&#xff1a;我会在b站/抖音更新视频讲解 或 一些纯技术外的分享&#xff0c;账号同名&#xff1a;hi…

React函数组件渲染两次

渲染两次是因为react默认开启了严格模式 React.StrictMode标签作用&#xff1a; 1、识别不安全的生命周期 2、关于使用过时字符串 ref API 的警告 3、关于使用废弃的 findDOMNode 方法的警告 4、检测意外的副作用 5、检测过时的 context API 注释掉React.StrictMode即为关闭严…

webpack external 详解

作用&#xff1a;打包时将依赖独立出来&#xff0c;在运行时&#xff08;runtime&#xff09;再从外部获取这些扩展依赖&#xff0c;目的时解决打包文件过大的问题。 使用方法&#xff1a; 附上代码块 config.set(externals, {vue: Vue,vue-router: VueRouter,axios: axios,an…

springboot+jsp+bootstrap+java问卷调查系统

系统功能需求包含业务需求和功能需求&#xff0c;系统功能需求分析是在了解用户习惯、开发人员技术和实力等各个因素的前提下&#xff0c;对其进行深入分析&#xff0c;了解系统基本需求后&#xff0c;基本功能如下&#xff1a; 本课题要求实现优质的问卷调查系统&#xff0c;就…

JavaScript中的设计模式

目录 1.工厂模式 2.构造函数模式 构造函数中new关键字作用&#xff1a; 3.原型模式 4.组合模式 JavaScript中有四种常见的设计模式 &#xff0c;目的是为了批量创建对象 为了实现继承。 1.工厂模式 利用工厂模式批量创建对象 优点&#xff1a;可以批量创建对象 …

苹果录音删除了可以恢复吗?请收藏好这些方法!

录音可以用于记录重要的信息&#xff0c;比如会议记录、课堂讲解、创作灵感等等。通过录制好的音频&#xff0c;我们可以随时回放这些录音&#xff0c;以便后续参考和使用。 但难免会发生意外&#xff0c;我们有时候可能会不小心删除手机中的录音文件。苹果录音删除了可以恢复…

bootstarp+springboot基于Java的教学仪器设备商城销售网站_o9b00

1、商品分类功能 商品分类是教学仪器设备销售网站中十分重要的一部分&#xff0c;它能够提高用户在网站上的浏览速度&#xff0c;并方便用户快速找到自己需要的商品。因此&#xff0c;需要对该功能进行分析和设计&#xff0c;确保其体验性、可用性和易用性。可以将商品分为多个…

如何配置ESB单据集成接口

ESB企业服务总线在实际项目中主要用于各业务系统之间的集成&#xff0c;集成包括数据集成、应用集成以及业务单据集成等&#xff0c;ESB企业服务总线主要包含三部分&#xff1a;ESB设计器、SMC管理控制台以及Server运行环境&#xff0c;ESB设计器用于服务以及集成流程的开发&am…
最新文章