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

news2024/11/24 20:41:43

常见的数据同步/集成场景多发生于不同的存储系统、不同的存储格式,如从 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.coloradmin.cn/o/1236977.html

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

相关文章

4.3、Linux进程(2)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 通过系统调用创建进程--fork函数 结果是什么呢&#xff1f; 为什么会出来三个打印呢? 就是因为父进程调用了fork函数创建出了子进程的task_struct,但是一个进程不止task_struct&#xff0c;还有代码和数据&#xff0c;他们…

JVM基础- 垃圾回收器

基本介绍 Java虚拟机&#xff08;JVM&#xff09;中的垃圾回收器是用来自动管理内存的关键组件。它负责识别并回收不再使用的内存&#xff0c;从而防止内存泄漏。不同的JVM实现提供了多种垃圾回收器&#xff0c;每种回收器都有其特定的使用场景和性能特点。以下是一些常见的JV…

Rust生态系统:探索常用的库和框架

大家好&#xff01;我是lincyang。 今天我们来探索Rust的生态系统&#xff0c;特别是其中的一些常用库和框架。 Rust生态系统虽然相比于一些更成熟的语言还在成长阶段&#xff0c;但已经有很多强大的工具和库支持各种应用的开发。 常用的Rust库和框架 Serde&#xff1a;一个…

Tesco EDI需求分析

Tesco&#xff0c;成立于1919年&#xff0c;是一家全球领先的综合性零售企业&#xff0c;总部位于英国。公司致力于提供高质量、多样化的商品和服务&#xff0c;以满足客户的需求。Tesco的使命是通过创新和卓越的客户服务&#xff0c;为客户创造更美好的生活。多年来&#xff0…

51单片机LED灯渐明渐暗实验

51单片机LED灯渐明渐暗实验 1.概述 这篇文章介绍使用单片机控制两个LED彩灯亮度渐明渐暗效果&#xff0c;详细介绍了操作步骤以及完整的程序代码&#xff0c;动手就能制作的小实验。 2.操作步骤 2.1.硬件搭建 1.硬件准备 名称型号数量单片机STC12C2052AD1LED彩灯无2晶振1…

抖音预约服务小程序开发:前端与后端技术的完美融合

开发抖音预约服务小程序成为了一种有趣而又实用的尝试。本篇文章&#xff0c;小编会与大家共同探讨抖音预约服务小程序开发的前端与后端技术融合的关键要点。 一、前端技术选择与设计 1.小程序框架 开发抖音预约服务小程序的前端&#xff0c;首先需要选择一个适用的小程序框…

系统试运行方案

系统试运行的目的&#xff1a; 试运行目的通过既定时间段的试运行&#xff0c;全面考察项目建设成果。并通过试运行发现项目存在的问题&#xff0c;从而进一步完善项目建设内容&#xff0c;确保项目顺利通过竣工验收并平稳地移交给运行管理单位。通过实际运行中系统功能与性能的…

系列三、ThreadLocal vs synchronized

一、ThreadLocal vs synchronized 虽然ThreadLocal与synchronized关键字都能用于处理多线程并发访问变量的问题&#xff0c;但是两者处理问题的角度和思路是不一样的。区别如下&#xff1a; 小总结&#xff1a;虽然上一篇中的案例都实现了线程隔离&#xff0c;但是使用ThreadLo…

计算机网络之概述

一、概述 1.1因特网概述 定义 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。多个网络还可以通过路由器互连起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;因此&#xff0c;互联网是“网络的网络…

【C++】类与对象(中)

一、类的默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会自…

最新红盟云卡个人自动发卡开源系统源码+全开源无加密+虚拟商品在线售卖平台

源码简介&#xff1a; 最新红盟云卡个人自动发卡开源系统源码全开源无加密虚拟商品在线售卖平台&#xff0c;支持多个接口的个人免签功能。 红盟云卡系统是一款基于PHP和MySQL开发的虚拟商品在线售卖平台。它具备美观且功能丰富的发卡网站特性&#xff0c;并可与社区进行无缝…

微信小程序点击图片放大预览,新页面中全屏预览图片

第一步&#xff1a;在wxml中定义image组件&#xff0c;并设置绑定事件。 <image src"{{priceUrl}}" bindtap"imgClick"></image>第二步&#xff1a;在js中设置需要预览图片的URL数组&#xff0c;切记一定要是数组&#xff0c;即使一张图也要是…

排序算法--插入排序

实现逻辑 ① 从第一个元素开始&#xff0c;该元素可以认为已经被排序 ② 取出下一个元素&#xff0c;在已经排序的元素序列中从后向前扫描 ③如果该元素&#xff08;已排序&#xff09;大于新元素&#xff0c;将该元素移到下一位置 ④ 重复步骤③&#xff0c;直到找到已排序的元…

DataFunSummit:2023年智能风控技术峰会-核心PPT资料下载

一、峰会简介 智能风控的技术体系涉及多个方面&#xff0c;包括数据架构、数据类型、风控算法、团队建设等。随着风控事件发生愈发频繁和规模化&#xff0c;风控数据架构将持续优化具有高并发、高吞吐特点的实时计算场景&#xff0c;带来更加及时的响应。 由于风控事件以人与…

为什么录屏没声音?实用技巧大放送!

录屏已成为我们在数字时代记录和分享内容的重要方式之一。但有时&#xff0c;您可能会遇到录制视频却没有声音的问题。这个问题可能出现在不同的录屏软件中&#xff0c;导致许多人感到疑惑。在本文中&#xff0c;我们将探讨为什么录屏没声音&#xff0c;并提供两种解决方案&…

【狂神说】CSS3详解

目录 CSS概述什么是CSSCSS发展史快速入门CSS的三种导入方式 2 选择器2.1 基本选择器标签选择器类选择器id选择器 2.2 层次选择器2.3 结构伪类选择器2.4 属性选择器&#xff08;常用&#xff09; 3 美化网页元素3.1 为什么要美化网页3.2 字体样式3.3 文本样式 视频课程见链接&am…

Word隐藏批注知识分享,快速提升工作效率!

“请问大家&#xff0c;word里的批注应该怎么隐藏呢&#xff1f;有没有什么简单的方法可以将批注隐藏的呀&#xff1f;感谢感谢&#xff01;” Word中的批注功能在文档编辑中起着重要的作用&#xff0c;但有时为了保护文档的隐私和保密性&#xff0c;我们需要隐藏批注。 Word隐…

数据结构——栈的详细介绍

数据结构——栈 一、栈的结构和概念二、 栈的两种构建方式①、用数组进行构建②、用链表进行构建 三、栈的创建四、栈的初始化五、栈的销毁六、压栈七、出栈八、判空九、获取栈顶元素十、获取栈的size 一、栈的结构和概念 栈&#xff1a;栈是一种特殊的线性表&#xff0c;其只…

什么台灯最好学生晚上用?专业的学生台灯分享

大家都知道现在的孩子学习压力都很重&#xff0c;尤其是年级越高的孩子&#xff0c;作业、学习任务也就越重&#xff01;如今的孩子夜晚学习似乎成为了一件再常见不过的事情&#xff0c;不过晚上单靠一盏室内灯的光线是肯定不够的&#xff0c;还需要搭配一台书桌台灯一起使用&a…