ESync 平台对接项目总结归纳
ESync(creekson esync)是一套**跨境电商 ERP 平台对接微服务集群**,负责将全球 15+ 主流电商/物流平台的订单、商品、库存、财务等数据,同步至 ERP 内部系统。 所有服务的定时任务都不是通过 cron 触发的,
一、项目概览
1.1 项目定位
ESync(creekson esync)是一套跨境电商 ERP 平台对接微服务集群,负责将全球 15+ 主流电商/物流平台的订单、商品、库存、财务等数据,同步至 ERP 内部系统。
- 代码根目录:
D:\workspace\esync - 所属业务域: ERP 核心数据入口(平台 → esync → creeks-fulfillment / creeks-inventory / creeks-order-center / creeks-finance 等)
1.2 服务全景
| # | 服务名 | 对接平台 | 模块结构 | 特殊说明 |
|---|---|---|---|---|
| 1 | esync-amazon |
Amazon(SP-API + MWS) | 3 模块 (client + common + server) | 最复杂:3 种数据源、100+ 定时任务、6 线程池 |
| 2 | esync-ebay |
eBay(SOAP + REST + Webhook) | 4 模块 (base + common + service + service-client) | 独立 Python Token 模块、SMTP 告警 |
| 3 | esync-wish |
Wish(v1 + v3 双管线) | 3 模块 (base + core + service) | 双版本 API 并行迁移模式 |
| 4 | esync-shopee |
Shopee 虾皮 | 标准 client + server | — |
| 5 | esync-shopify |
Shopify(client + server) + Go 网关 | client + server | codo-shopify-gateway 为独立 Go 反代 |
| 6 | esync-shein |
SHEIN | client + server | 48 小时 API 窗口、PurchaseOrder 流程 |
| 7 | esync-aliexpress |
AliExpress 速卖通 | client + server | 使用 codo-taobao-sdk |
| 8 | esync-tiktokshop |
TikTok Shop | 独立 client + server 仓库 | 支持 i18n、FBT 库存 |
| 9 | esync-temu |
Temu | 单模块(src 在根目录)+ 独立 client | Spring Cloud Sleuth 分布式追踪 |
| 10 | esync-walmart |
Walmart 沃尔玛 | 多模块 | — |
| 11 | esync-mercadolidre |
MercadoLibre 美客多 | 多模块 | 拉美市场 |
| 12 | esync-joom |
Joom | core + server | — |
| 13 | esync-joybuy |
JoyBuy | 多模块 | — |
| 14 | esync-cdiscount |
Cdiscount | 多模块 | 法国平台 |
| 15 | esync-winit |
万邑通(物流) | 单模块 | MyBatis + MySQL(非 MongoDB) |
| 16 | codo-shopify-gateway |
Shopify 网关代理 | 单文件 Go(182 行) | 基于 X-Shop header 反代 |
1.3 统一技术栈
| 技术 | 选型 | 说明 |
|---|---|---|
| 语言 | Java 8(JDK 8) | Go 仅用于 Shopify 网关 |
| 框架 | Spring Boot(codo-java-bom:1.2.2/1.2.4) | 统一 BOM 管理 |
| 数据库 | MongoDB(主) | 每服务独立库,如 esync_amazon、esync_temu |
| 缓存/锁 | Redis + Redisson 3.13.3 | 分布式锁 + 限流 |
| 消息队列 | Apache Kafka(spring-kafka) | 纯生产者模式 |
| HTTP 客户端 | OkHttp + Feign | 跨服务调用 |
| 文档 | Springfox Swagger 2 + swagger-bootstrap-ui | /swagger-ui.html |
| 构建 | Maven + fmt-maven-plugin | 代码格式化检查 |
| 容器 | Docker(CentOS 7 + Oracle JDK 8) | 统一基础镜像 |
| CI | Jenkins(ci profile) | 构建跳过测试和格式化 |
二、架构设计
2.1 整体数据流
外部平台 API (SP-API / SOAP / REST)
│
│ 定时/手动触发 (HTTP Scheduler)
▼
┌─────────────────┐
│ Fetch Task │ ← Redisson 分布式锁(防止并发执行)
│ (分页拉取) │ ← 时间窗口切分(防止超时)
│ @Async @Retry │ ← 自动重试 + 补偿任务
└────────┬────────┘
│
▼
┌─────────────────┐
│ Converter │ 平台模型 → ERP 标准模型
│ (数据转换) │ AmazonOrderConverter / PlatformOrderViewConverter
└────────┬────────┘
│
▼
┌─────────────────┐
│ MongoDB │ 持久化 + sended 标记(幂等控制)
│ (持久化) │ 支持重试查询(sended=false)
└────────┬────────┘
│
▼
┌─────────────────┐
│ MessageProducer│ Kafka 推送到下游 ERP 服务
│ (Kafka 推送) │ 平台专属 topic + order_center_collect(订单池)
└────────┬────────┘
│
▼
下游 ERP 服务:
├── creeks-order-center(订单池 / ES 查询)
├── creeks-fulfillment(订单履约 / 业务处理)
├── creeks-inventory(库存管理)
├── creeks-sales(商品管理)
├── creeks-finance(财务结算)
└── creekson-mall(商城)
2.2 模块结构(三种模式)
模式 A: 同仓库多模块(经典) 模式 B: Client 独立仓库 模式 C: 纯单模块
esync-xxx/ esync-xxx/ esync-xxx/
├── client/ ├── pom.xml ├── src/
│ └── pom.xml ├── server/ ├── pom.xml
├── server/ └── pom.xml └── Dockerfile
│ └── pom.xml esync-xxx-client/
└── pom.xml └── pom.xml
适用: shopee/aliexpress/joom 适用: temu/tiktokshop 适用: temu/winit/temu-client
2.3 分层架构(标准模板)
controller/ ← 薄层,仅接收请求并转发到 service/repository
│
service/ ← 核心业务逻辑(拉取、转换、重试)
│
repository/ ← MongoDB 操作(MongoTemplate 直接操作,非 Spring Data)
│
mq/ ← Kafka 消息发送(纯生产者)
│
job/task/ ← 实际同步任务实现(分页拉取 + 持久化 + 推送)
│
scheduler/ ← HTTP 触发器(非 @Scheduled cron,由外部编排调用)
│
converter/ ← 平台模型 ↔ ERP 模型转换
│
config/ ← Kafka / Redis / Feign / Swagger / 异常处理
│
aop/ ← 日志切面 (LoggingAspect)
│
enums/ ← 平台专属枚举常量
三、核心实现思路
3.1 同步调度:HTTP 触发器模式
所有服务的定时任务都不是通过 @Scheduled cron 触发的,而是暴露为 REST 端点,由外部调度器(如 XXL-JOB、K8s CronJob)调用:
@RestController
@RequestMapping("/remote/sync/order")
public class SyncOrderScheduler {
@GetMapping("/start")
public void startSyncOrders() {
// 触发分布式锁 → 异步执行任务
}
}
优势: 支持外部编排、动态调度、运行时开关控制(如 ebay 的 esync-ebay-task-switch 配置)。
3.2 分布式锁(防并发执行)
RLock lock = lockService.getLock("temu:order:sync");
if (lock.isLocked()) return;
lockService.lockAndExecute("temu:order:sync", 0, -1, TimeUnit.SECONDS, this::executeSync);
- Key 命名:
{platform}:{entity}:sync - 实现: Redisson 分布式锁
- 目的: 多实例部署时保证同一任务不被重复执行
3.3 时间窗口切分(防 API 超时)
各平台 API 对时间跨度有不同限制,需切分为小窗口:
| 平台 | 窗口大小 | 原因 |
|---|---|---|
| Temu | 按月 | 数据量大 |
| TikTok Shop | 10 天 | API 限制 |
| SHEIN | 48 小时 | 平台硬性限制 |
| eBay (订单) | 30 分钟 | SOAP API 响应慢 |
| eBay (商品) | 12 小时 | GetSellerList 分页 |
| Wish v3 | 1 小时 | 防超时 |
| Amazon | 按报告类型 | SP-API 报告生命周期 |
3.4 双目标 Kafka 推送
订单数据同时发送到两个 Kafka topic:
// 1. 平台专属 topic(供履约服务消费)
kafkaHelper.send(TOPIC_ORDER, orderJson);
// 2. 订单池统一 topic(供订单中心消费)
kafkaHelper.send(ORDER_CENTER_COLLECT_TOPIC, platformOrderViewJson);
下游消费关系:
esync-{platform} → {platform}_order (topic) → creeks-fulfillment
esync-{platform} → order_center_collect (topic) → creeks-order-center
esync-{platform} → {platform}_item (topic) → creeks-inventory
esync-{platform} → {platform}_product (topic) → creeks-sales
esync-{platform} → {platform}_finance (topic) → creeks-finance
3.5 幂等持久化
MongoDB 中使用 sended 字段标记消息是否已发送:
// 持久化
document.put("sended", false);
mongoTemplate.save(document);
// 重试逻辑:查询未发送记录,重新发送
Query query = Query.query(Criteria.where("sended").is(false));
List<Document> unsent = mongoTemplate.find(query, Document.class);
for (Document doc : unsent) {
kafkaHelper.send(TOPIC, toJson(doc));
mongoTemplate.updateFirst(Query.query(Criteria.where("_id").is(doc.getId())),
Update.update("sended", true), Document.class);
}
3.6 重试与补偿机制
| 层级 | 机制 | 实现 |
|---|---|---|
| API 调用层 | @Retryable(maxAttempts=3, backoff=@Backoff(delay=2000L)) |
Spring Retry |
| 消息发送层 | 查询 sended=false 记录重发 |
MongoDB 游标分页 |
| 数据补偿层 | 补偿任务重新扫描最近 N 天数据 | 独立补偿 Scheduler |
| 手动重试层 | /remote/.../retry HTTP 端点 |
MessageFailController |
| DLT 兜底层 | Kafka Dead Letter Topic | Amazon 的 finance/inventory 等 |
3.7 限流策略
| 服务 | 限流方式 | 详情 |
|---|---|---|
| Amazon (MWS) | Token Bucket 内存限流 | CallThrottling 信号量 + CallCountRecovery 后台线程 |
| Amazon (Captain) | Redis 分布式限流 | RedisCallThrottling 500次/min |
| Amazon (SellFox) | Redisson 原子计数器 | @RateLimit 注解 |
| eBay | Thread.sleep | API 调用间隔 1 秒 |
| Wish v3 | Thread.sleep(2000) | 商品详情请求间隔 |
| 通用 | 单线程线程池 | esyncCaptainExecutor: core=1, max=1 |
3.8 多数据源适配(Amazon 特有)
Amazon 服务支持 5 种数据源,每种有独立的同步链路:
1. SP-API 直连(官方 Selling Partner API)
2. MWS 直连(旧版 Merchant Web Service)
3. Creekshub(内部数据中台代理)
4. SellFox(第三方数据聚合器)
5. Captain(第三方数据聚合器)
采用模板方法模式:CreekshubBaseSyncTask<T> 为抽象基类,各子类实现 doSync() / doQuery()。
3.9 报告生命周期模式(Amazon 大数据量)
对于商品/库存等大数据量,不走 list API,而是走 Amazon 报告生成流程:
1. requestReport() → 提交报告生成请求
2. pollReportStatus() → 轮询状态(高频/低频两种策略)
3. downloadReport() → 流式下载(逐行回调,内存 O(1))
4. parseRow() → 按 OrderId 分组构建对象
5. batchPersist() → 批量写入 MongoDB
6. sendKafka() → 推送下游
3.10 Token 管理与认证
| 平台 | 认证方式 | Token 管理 |
|---|---|---|
| Amazon SP-API | LWA (Login with Amazon) | 网关代理签名 |
| eBay OAuth2 | OAuth2 Authorization Code | Python 脚本批量导入 + QQ SMTP 过期告警 |
| Wish | OAuth2 Refresh Token | 检测错误中的 "token" 关键词自动刷新 |
| TikTok Shop | Access Token | Mall 服务统一管理 |
| Temu | API Key | Mall 服务获取 |
| SHEIN | App Key + Sign | 签名工具类 |
四、各服务技术亮点
4.1 esync-amazon(最复杂)
- 100+ 定时任务,按数据源和数据类型精细拆分
- 6 个专用线程池(CPU 密集型、报告轮询、限流单线程等)
- 三种授权源并行同步(ECPP / Creekshub / SellFox / Captain)
- 策略模式处理 13 种财务事件(发货、退款、调整、Chargeback、广告费等)
- 流式 CSV 解析(避免全量加载到内存)
- SyncTimeMonitorTask(每日巡检 + 飞书告警,数据质量哨兵)
- V1/V2 双版本订单共存(支持灰度迁移)
4.2 esync-ebay
- SOAP + REST 双 SDK(
ebaycalls v1225+codo-ebay-sdk-rest) - Webhook 推送管线(HTTP 接收 XML → Kafka → JAXB 并行解析)
- 反射清除 JAXB
any字段(setAnyToZero()解决 MongoDB 循环引用) - Python Token 种子脚本(AES-256-ECB 加密 + MongoDB 直写)
- Spring Mail SMTP 告警(Token 过期邮件通知)
- 硬编码 XML 修复(生产环境问题快速修复
fixOrder) - 运行时开关(
esync-ebay-task-switch配置)
4.3 esync-wish
- v1 → v3 双管线并行迁移(渐进式升级,互不影响)
- 滑动窗口分页(左游标移动到上一页最大
updated_at) - OAuth2 Token 自动刷新(异常检测 + 实时刷新)
- 独立 API Client 层(
esync-wish-core模块可复用)
4.4 esync-shein
- 48 小时 API 窗口(平台硬性限制)
- PurchaseOrder 流程(采购订单 + 交货订单 + 自动接单)
- Client 模块自包含 AutoConfiguration(
spring.factories自动装配)
4.5 esync-tiktokshop
- FBT(Fulfilled by TikTok)库存同步
- i18n 国际化(
esync-tiktokshop_messages) - 补偿任务(最近 2 天数据补偿重拉)
4.6 esync-temu
- Spring Cloud Sleuth 分布式追踪
- 全托管 / 半托管双模式(SKU 标签差异化处理)
- Testcontainers 集成测试(MySQL 容器)
4.7 codo-shopify-gateway(Go)
- 182 行纯反代(无业务逻辑)
- 基于
X-Shopheader 路由到*.myshopify.com - Caddy + nerdctl 部署(轻量、安全隔离)
4.8 esync-winit(物流)
- MyBatis + MySQL(唯一不用 MongoDB 的 esync 服务)
- Redisson 分布式锁(物流操作的并发控制)
- 独立 SDK 模块(
creeks-winit-sdk)
五、可复用模式总结
以下模式已在多个服务中验证,可作为标准化模板推广到新平台对接:
| 模式名称 | 核心思路 | 适用场景 | 最佳实践来源 |
|---|---|---|---|
| HTTP Scheduler | REST 端点触发 + 分布式锁 | 所有定时同步任务 | Amazon / Temu |
| Time Window Chunking | 大时间窗口切分为小片段 | 平台 API 有跨度限制 | Wish v3 DateTimeRangesCreator |
| Distributed Lock | Redisson 防并发 | 多实例部署 | 所有服务统一使用 |
| Dual Topic Push | 平台 topic + 订单池 topic | 订单/商品同步 | Amazon / eBay |
| Idempotent sended | MongoDB sended 标记 + 游标重试 | 消息幂等 | Temu / TikTokShop |
| Token Auto-Refresh | 错误检测 + 自动刷新 | OAuth2 平台 | Wish v3 |
| Template Method Sync | 抽象基类 + 子类实现 | 多数据源同步 | Amazon Creekshub |
| Strategy Pattern Events | 事件处理器分发 | 财务/结算事件 | Amazon Finance |
| Streaming Parse | 逐行回调解析 | 大文件/报告 | Amazon SP-API |
| Compensation Task | 独立补偿任务重扫最近数据 | 数据兜底 | TikTokShop |
| Kill Switch | 配置开关控制任务执行 | 紧急停止/维护 | eBay |
| Monitor + Alert | 巡检任务 + 飞书告警 | 数据质量保障 | Amazon |
| Webhook → Kafka → Parse | 异步解耦平台推送 | Webhook 接收 | eBay Notification |
六、可拓展点
6.1 统一同步框架
当前每个服务都实现了相似的"拉取 → 转换 → 持久化 → 推送"模式,可以抽象为统一的同步框架:
public abstract class PlatformSyncTemplate<P, D> {
// 1. 获取授权店铺列表
abstract List<Store> getStores();
// 2. 拉取数据(分页、时间窗口由框架统一处理)
abstract List<D> fetchData(Store store, DateRange range);
// 3. 转换为 ERP 模型
abstract P convert(D data);
// 4. 持久化到 MongoDB
void persist(P model) { ... }
// 5. 推送到 Kafka
void push(P model, String topic) { ... }
}
收益: 新平台对接只需实现 3 个抽象方法,共享时间窗口、分页、重试、锁等通用逻辑。
6.2 统一限流器
当前各服务限流方式分散(内存 Token Bucket、Redis 计数器、Thread.sleep),可统一为注解式限流:
@RateLimit(key = "shopify:orders", limit = 100, duration = 60, unit = TimeUnit.SECONDS)
public List<Order> fetchOrders(Store store) { ... }
6.3 Webhook 通用管线
eBay 的 Webhook → Kafka → 并行解析模式可推广到所有支持 Webhook 的平台(Shopify、TikTokShop、SHEIN 等),替代轮询。
6.4 统一监控大盘
当前只有 Amazon 有 SyncTimeMonitorTask,可扩展为全平台统一监控:
- 各店铺各数据类型最后同步时间
- API 调用成功率 / 失败率
- Kafka 消息堆积情况
- 飞书/钉钉统一告警
6.5 配置中心化
各服务的 application.yml 中有大量重复配置(Redisson、KafkaTopic、Feign 超时等),可统一收归到配置中心(Nacos / Apollo)。
6.6 新平台对接 SDK
为每个新平台提供一个脚手架工程:
esync-{platform}/
├── client/
│ ├── pom.xml
│ └── src/main/java/.../client/
│ ├── model/ # DTO / 枚举
│ ├── remote/ # Feign Client(平台 API)
│ └── config/ # AutoConfiguration
├── server/
│ ├── pom.xml
│ └── src/main/java/.../server/
│ ├── config/ # 基础设施配置(Redisson / Kafka / MongoDB)
│ ├── task/ # 同步任务(继承基类)
│ ├── converter/ # 平台模型 → ERP 模型
│ ├── mq/ # Kafka 发送
│ ├── repository/ # MongoDB 仓储
│ └── scheduler/ # HTTP 触发器
├── pom.xml
└── Dockerfile
6.7 事件驱动架构升级
当前为纯轮询模式,可逐步引入平台 Webhook + 事件总线:
平台 Webhook → API Gateway → Kafka Events → esync Consumer → ERP
减少 API 调用频率,提升数据实时性。
七、优化点
7.1 高优先级
| 优化项 | 问题 | 建议方案 | 影响范围 |
|---|---|---|---|
| FastJSON 安全漏洞 | 使用 FastJSON 1.2.70(已知 RCE 漏洞) | 升级到 1.2.83+ 或迁移到 Jackson/Gson | 全服务 |
| 未使用的依赖 | Wish 的 POI/iText/Dom4j/Druid 仅声明未使用 | 清理无用依赖,减小包体积 | esync-wish |
| 硬编码敏感信息 | MongoDB URI、Redis 密码写在 yml 中 | 全部走环境变量或 K8s Secret | 全服务 |
| README 空文件 | 8 个服务的 README 为空 | 统一填充标准化 README 模板 | shein/walmart/shopify/temu/mercadolidre/cdiscount/joybuy |
| 无 API 文档更新 | Swagger 版本停留在 2.x | 迁移到 SpringDoc OpenAPI 3.x | 全服务 |
7.2 中优先级
| 优化项 | 问题 | 建议方案 | 影响范围 |
|---|---|---|---|
| 重复的 Config 类 | RedissonAutoConfiguration 等在各服务中 byte-for-byte 重复 |
提取到 creeks-common-services 公共模块 |
全服务 |
| Java 8 版本 | JDK 8 已停止公共更新 | 规划迁移到 JDK 17/21 LTS | 全服务 |
| 缺少单元测试 | 测试覆盖率低(除 Amazon/Temu 外) | 引入单元测试模板,目标 80%+ | 全服务 |
| 手动重试依赖人工 | MessageFailController 需人工触发 |
接入自动重试队列(Kafka 延迟消息) | 全服务 |
| 无集成测试 | 除 Temu 外均无 Testcontainers 集成测试 | 统一引入 Testcontainers MySQL/MongoDB | 全服务 |
| 日志不规范 | 缺少结构化日志(traceId / spanId) | 统一集成 Sleuth + ELK | 全服务 |
7.3 低优先级
| 优化项 | 问题 | 建议方案 | 影响范围 |
|---|---|---|---|
| Lombok 版本 | Lombok 1.18.8 较旧 | 升级到 1.18.30+ | 全服务 |
| Redis DB 混用 | 全部使用 DB 14 | 按服务分配独立 DB 索引 | 全服务 |
| MongoDB 索引缺失 | 部分集合缺少索引 | 启动时自动创建索引(已部分实现) | 全服务 |
| Go 网关单文件 | Shopify 网关 182 行单文件 | 适当拆分(配置、日志、健康检查) | codo-shopify-gateway |
| Python Token 脚本 | eBay Token 导入用 Python 脚本 | 整合到 Java 服务 API | esync-ebay |
7.4 架构演进方向
当前状态(轮询主导) 目标状态(事件驱动)
┌──────────┐ HTTP Scheduler ┌──────────┐ Webhook
│ 平台 API │ ◄──── 定时拉取 │ 平台 API │ ────► API Gateway
└────┬─────┘ └────┬─────┘
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ esync │ │ Kafka │
│ 服务 │ │ Events │
└────┬─────┘ └────┬─────┘
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ Kafka │ │ esync │
│ 推送 │ │ Consumer│
└────┬─────┘ └────┬─────┘
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ ERP │ │ ERP │
│ 服务 │ │ 服务 │
└──────────┘ └──────────┘
延迟: 分钟~小时级 延迟: 秒级
API 调用: 高频 API 调用: 低频(仅补偿/兜底)
八、与 ERP 核心系统的集成关系
┌─────────────────────────────────────┐
│ 外部电商平台 (15+) │
│ Amazon / eBay / Wish / Shopee /... │
└──────────────┬──────────────────────┘
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ esync │ │ esync │ │ esync │
│ -amazon │ │ -ebay │ │ -temu │
│ -wish │ │ -shein │ │ -tiktok │
│ -shopee │ │ -walmart │ │ ... │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└────────────────┼─────────────────┘
│ Kafka
┌──────────────┼──────────────┐
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ creeks- │ │ creeks- │ │ creeks- │
│ order- │ │ fulfill- │ │ inventory │
│ center │ │ ment │ │ │
│ (订单池) │ │ (订单履约) │ │ (库存管理) │
└───────────┘ └───────────┘ └───────────┘
│ │ │
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ creeks- │ │ creeks- │ │ creeks- │
│ sales │ │ finance │ │ logistics │
│ (商品管理) │ │ (财务结算) │ │ (物流管理) │
└───────────┘ └───────────┘ └───────────┘
关键集成点
| 集成方向 | 方式 | 协议 |
|---|---|---|
| esync → ERP | Kafka 生产者 | JSON 消息 |
| ERP → esync | Feign Client | HTTP REST |
| esync → 平台 API | OkHttp / 平台 SDK | HTTPS |
| 平台 → esync | Webhook(部分平台) | HTTPS POST |
九、关键数据流详解
9.1 订单同步流(以 Temu 为例)
1. 外部调度调用 → GET /remote/temu/unCn/syncOrder
2. TemuSyncUnCnScheduler 获取分布式锁 temu:order:sync
3. SyncOrderTaskJob 执行:
a. 从 Mall 服务获取 Temu 授权店铺列表
b. 按月切分时间窗口(含 5 分钟重叠区防漏数据)
c. 对每个店铺 + 时间窗口:
- 调用 Temu API 分页拉取订单列表
- 对每批订单调用详情 API 获取完整信息
- 解密收件人地址(平台加密字段)
- 构建 ERP 订单模型(PlatformOrderView)
- 存入 MongoDB(sended=false)
- 发送 Kafka → temu_order_fulfillment(仅卖家发货订单,2025-05-12 后)
- 发送 Kafka → order_center_collect(所有订单)
- 更新 MongoDB(sended=true)
4. 释放分布式锁
9.2 商品同步流(以 TikTok Shop 为例)
1. 外部调度调用 → GET /remote/tiktokshop/job/product/start
2. TikTokShopJobScheduler 获取分布式锁 tiktokshop:product:sync
3. SyncProductTask 执行:
a. 按 10 天窗口分页拉取商品摘要列表
b. 对每个商品调用详情 API
c. 构建 ERP 商品模型(GoodsRegisterBo)
d. 存入 MongoDB
e. 发送 Kafka → tiktokshop_product
f. 如果是 FBT 商品,额外发送 Kafka → tiktokshop_stock_register
9.3 财务同步流(以 Amazon 为例)
1. 外部调度调用 → GET /remote/sync/finance/event/sp/startSyncFinanceEvent
2. FetchSpFinanceEventTask 执行:
a. 遍历所有 Amazon 店铺
b. 调用 SP-API Settlement Report API
c. 下载报告 → 流式解析(逐行回调)
d. 策略模式分发 13 种事件处理器:
- ShipmentEventHandler(发货)
- RefundEventHandler(退款)
- AdjustmentEventHandler(调整)
- ChargebackEventHandler(拒付)
- DebtRecoveryEventHandler(债务恢复)
- RetrochargeEventHandler(追溯收费)
- ServiceFeeEventHandler(服务费)
- RemovalShipmentEventHandler(移除发货)
- RemovalShipmentAdjustmentEventHandler(移除发货调整)
- ProductAdsPaymentEventHandler(广告费)
- GuaranteeClaimEventHandler(保障索赔)
- SellerDealPaymentEventHandler(卖家交易费)
- CouponPaymentEventHandler(优惠券)
e. 每种事件发送到独立 Kafka topic
f. 配置 DLT 兜底(finance_group.DLT)
十、项目总结
10.1 项目规模
- 18 个子项目(16 个平台对接 + 1 个 Go 网关 + 1 个物流对接)
- 46 个 Maven 模块(client / server / common / base 等)
- 17 个 Dockerfile
- 26 个 deploy 脚本
- 技术栈: Java 8 + Spring Boot + MongoDB + Kafka + Redis + Feign
- 对接平台: Amazon / eBay / Wish / Shopee / Shopify / SHEIN / AliExpress / TikTok Shop / Temu / Walmart / MercadoLibre / Joom / JoyBuy / Cdiscount / Winit
10.2 核心设计理念
- Pull → Process → Push:统一的拉取-处理-推送流水线
- 事件驱动 + 轮询兜底:Kafka 解耦上下游,轮询补偿保障数据完整性
- 平台差异化适配:每个服务针对平台 API 特性定制(时间窗口、认证、限流)
- 幂等保障:MongoDB sended 标记 + 分布式锁 + 游标重试
- 外部编排:HTTP Scheduler 替代 cron,支持动态调度
10.3 项目优势
- 架构统一,新平台对接有章可循
- 模块边界清晰,client/server 职责分明
- 丰富的重试 / 补偿 / 限流机制保障数据不丢不漏
- MongoDB schema-less 特性适配多平台差异化数据模型
- 与 ERP 核心系统通过 Kafka 松耦合集成
10.4 改进方向
- 抽象统一同步框架,减少重复代码
- 引入 Webhook 事件驱动,降低 API 调用频率
- 统一监控大盘,覆盖全平台数据质量巡检
- FastJSON 安全升级 / JDK 8 → 17 迁移
- 补充测试覆盖率达到 80%+