多品类统一商品上架系统设计:电商·虚拟商品·本地生活
一、背景与挑战
1.1 现状痛点
在数字电商/本地生活平台中,商品上架的数据来源和审核策略差异极大:
1.1.1 数据来源分类
| 数据来源 | 触发方式 | 数据可信度 | 审核策略 | 典型场景 |
|---|---|---|---|---|
| 供应商 Push | 供应商实时推送 MQ 消息 | 高(合作方) | 自动审核(快速通道) | 电影票场次变更 |
| 供应商 Pull | 定时任务主动拉取 API | 高(合作方) | 自动审核(快速通道) | 酒店房型价格同步 |
| 运营上传 | 运营后台单品/批量 | 高(内部) | 免审核或自动审核 | 话费充值面额配置 |
| 商家上传 | Merchant App/Portal | 低(需审核) | 人工审核 | 商家自营电子券 |
| API 接口 | 第三方系统调用 | 中(看调用方) | 根据来源配置 | 批量导入工具 |
1.1.2 品类上架流程对比
| 品类 | 主要数据来源 | 对接方式 | 审核策略 | 特殊处理 |
|---|---|---|---|---|
| 酒店 (Hotel) | 供应商 Pull / 运营批量 | 定时拉取 API (Cron) | 自动审核 | 价格日历校验 |
| 电影票 (Movie) | 供应商 Push | 实时推送 (MQ) | 自动审核(快速通道) | 场次时间校验 |
| 话费充值 (TopUp) | 运营上传 | 单品表单 / Excel 批量 | 免审核 | 面额范围校验 |
| 电子券 (E-voucher) | 商家上传 / 供应商 Pull | Portal + 券码池 / API | 人工审核 | 券码池异步导入 |
| 礼品卡 (Giftcard) | 运营上传 / 商家上传 | 单品表单 / Merchant App | 商家需审核,运营免审 | 库存校验 |
核心痛点:
- 流程不统一:每个品类上架流程各异,代码无法复用。
- 状态管理混乱:草稿、审核、上线、下线等状态散落在不同表中。
- 批量上传困难:Excel 批量上传缺乏统一处理机制。
- 数据一致性差:并发上架时数据冲突频发,缺乏乐观锁保护。
- 审核策略不灵活:无法根据数据来源(供应商/运营/商家)动态调整审核策略。
- 供应商对接方式不统一:有的推送、有的拉取,各自实现,缺乏标准化。
1.2 设计目标
| 目标 | 说明 | 优先级 |
|---|---|---|
| 统一上架流程 | 所有品类共享统一状态机和流程 | P0 |
| 异步化处理 | 上传、审核、发布异步化,提升响应速度 | P0 |
| 批量上传 | 支持 Excel/CSV 批量上传 | P0 |
| 状态可追溯 | 完整的状态变更历史记录 | P0 |
| 并发安全 | 乐观锁 + 唯一索引保证一致性 | P1 |
| 故障自愈 | 看门狗机制监控超时任务,自动重试 | P1 |
二、整体架构
2.1 分层架构
1 | ┌─────────────────────────────────────────────────────────────┐ |
2.2 核心设计思想
- 统一状态机:所有品类共享同一套状态流转(DRAFT → Pending → Approved → Online),通过审核规则引擎适配不同品类的校验逻辑。
- 策略模式:不同品类的校验规则、供应商对接方式通过策略模式实现,新品类只需注册校验规则即可接入。
- 数据来源驱动审核:根据数据来源(供应商/运营/商家)自动选择审核策略(快速通道/免审核/人工审核)。
- 异步化:所有耗时操作(文件解析、审核、发布)通过 Kafka + Worker 异步处理,API 层只负责创建任务和返回 task_code。
- 事件驱动:每个状态变更都发送 Kafka 事件,下游消费者(ES 同步、缓存刷新、通知)解耦处理。
三、状态机设计
3.1 状态流转图
1 | ┌──────────┐ |
3.2 状态枚举
1 | const ( |
四、数据模型
4.1 上架任务表(listing_task_tab)
每次上架操作对应一条任务记录,是整个流程的核心载体:
1 | CREATE TABLE listing_task_tab ( |
4.2 批量任务表(listing_batch_task_tab)
Excel 批量导入时,一个文件对应一条批量任务,下挂多条 listing_task:
1 | CREATE TABLE listing_batch_task_tab ( |
4.3 批量任务明细表(listing_batch_item_tab)
1 | CREATE TABLE listing_batch_item_tab ( |
4.4 审核日志表 & 状态变更历史表
1 | -- 审核日志 |
4.5 审核策略配置表
根据数据来源自动选择审核策略:
1 | CREATE TABLE listing_audit_config_tab ( |
五、核心流程设计
5.1 审核策略决策流程
根据数据来源自动选择审核策略:
1 | 创建上架任务 |
5.2 单品上架流程
1 | 用户提交表单 |
5.3 批量上架流程(Excel)
1 | 用户上传 Excel |
5.4 供应商推送同步流程(Movie — 实时)
1 | 供应商发送影片/场次变更消息 (MQ) |
5.5 供应商定时拉取流程(Hotel — 批量)
1 | 定时任务触发(每小时 / 每 30 分钟) |
六、供应商对接双模式设计
6.1 推送 vs 拉取对比
| 对比项 | 推送模式 (Push) | 拉取模式 (Pull) |
|---|---|---|
| 代表品类 | Movie(电影票) | Hotel(酒店)、E-voucher |
| 触发方式 | 供应商主动推送 MQ 消息 | 定时任务周期性拉取 |
| 实时性 | 高(毫秒级) | 中(分钟级) |
| 数据完整性 | 依赖 MQ 可靠性 | 主动拉取保证完整 |
| 系统耦合度 | 供应商需感知平台 | 平台主动拉取,供应商无感知 |
| 适用场景 | 高频变更、实时性要求高、单次数据量小 | 低频变更、可接受延迟、单次数据量大 |
6.2 选型建议
- 推送模式:实时性要求 < 1s、变更频率高、供应商支持 MQ 推送。
- 拉取模式:可接受分钟级延迟、数据量大、需保证不丢失。
- 混合模式:E-voucher 等品类可同时支持两种 — 推送处理实时变更,拉取做每日全量对账。
6.3 同步状态管理
1 | CREATE TABLE supplier_sync_state_tab ( |
七、关键技术方案
7.1 乐观锁 + 版本号(并发安全)
所有状态变更使用乐观锁,防止并发冲突:
1 | func UpdateStatus(taskID int64, fromStatus, toStatus int, action string) error { |
7.2 唯一索引保证幂等
task_code 唯一索引保证同一上架操作不会重复创建:
1 | func CreateTask(req *CreateTaskRequest) (*ListingTask, error) { |
7.3 看门狗机制(Watchdog)
监控超时和卡住的任务,自动重试或告警:
1 | func (w *WatchdogService) Start() { |
7.4 数据校验引擎(策略模式)
不同品类注册不同校验规则,通过规则引擎统一执行:
1 | type ValidationEngine struct { |
7.5 Worker Pool 并发处理
批量上架使用 Worker Pool 控制并发度:
1 | func PublishBatch(batchID int64) error { |
八、Kafka 事件设计
8.1 Topic 设计
| Topic | 触发时机 | 消费者 |
|---|---|---|
listing.batch.created |
Excel 上传完成 | ExcelParseWorker |
listing.audit.pending |
提交审核 | AuditWorker |
listing.publish.ready |
审核通过 | PublishWorker |
listing.published |
发布成功 | ES 同步、缓存刷新、通知 |
listing.batch.parsed |
Excel 解析完成 | BatchAuditWorker |
listing.batch.audited |
批量审核完成 | BatchPublishWorker |
8.2 消息格式
1 | message ListingEvent { |
九、业界最佳实践参考
9.1 淘宝/天猫
- 强模板约束:不同类目不同发布模板,必填项严格校验。
- 分阶段发布:草稿 → 待审核 → 审核通过 → 定时上架 → 已上线。
- AI 图片审核:AI + 人工双重审核,识别违规图片。
- 定时上架:支持定时自动上架,营销活动同步上线。
9.2 京东
- 三级审核:自动审核 → 算法审核(价格异常检测、重复商品识别) → 人工审核。
- 商品池概念:草稿池 → 待审核池 → 在售池 → 下架池。
- 快速通道:VIP 商家快速审核通道。
- 实时监控:异常自动下架。
9.3 Amazon
- ASIN 去重:自动生成全球唯一商品标识,防止重复上架。
- 商品质量评分:图片/标题/描述完整度评分,引导商家优化。
- Buy Box 算法:多卖家同一商品,算法决定展示归属。
- API 接入:Seller Central 表单 + MWS/SP-API 双通道。
9.4 本设计借鉴点
| 借鉴来源 | 应用方式 |
|---|---|
| 淘宝:强模板 + 定时上架 | 品类校验规则引擎 + 定时发布 |
| 京东:三级审核 + 商品池 | 自动/人工审核 + 状态机管理 |
| Amazon:质量评分 + API 接入 | 数据完整度校验 + 供应商/API 双模式 |
| Shopee:本地化 + 快速上架 | 多国家模板 + 供应商快速通道 |
十、监控与告警
10.1 关键指标
| 指标 | 目标值 | 告警阈值 |
|---|---|---|
| 上架成功率 | > 95% | < 90% |
| 平均上架时长 | < 5 分钟 | > 10 分钟 |
| 批量处理速度 | > 100 条/分钟 | < 50 条/分钟 |
| 审核通过率 | > 90% | < 80% |
| Worker 处理延迟 | < 1 分钟 | > 5 分钟 |
| Kafka 消息积压 | < 1000 条 | > 5000 条 |
10.2 Prometheus Metrics
1 | listing_task_total{type="single|batch|supplier", status="success|fail"} |
十一、新品类接入指南
四步接入:
- 定义品类模板:确定必填字段、可选字段、校验规则。
- 注册校验规则:实现
ValidationRule接口,注册到校验引擎。 - 配置审核策略:根据数据来源配置(运营免审/商家人工审/供应商快速通道)。
- 配置供应商对接(可选):推送模式注册 Consumer,拉取模式配置 Cron。
1 | // 示例:接入新品类"演唱会门票" |
十二、设计总结
核心设计决策
| 决策 | 选择 | 原因 |
|---|---|---|
| 统一 vs 独立流程 | 统一状态机 + 策略模式 | 复用流程,新品类零代码接入 |
| 同步 vs 异步 | API 层同步创建任务,审核/发布异步 Worker | 快速响应 + 后台可靠处理 |
| 供应商对接 | Push + Pull 双模式 | 适配不同供应商实时性需求 |
| 审核策略 | 数据来源驱动(供应商/运营/商家) | 灵活控制审核流程 |
| 并发控制 | 乐观锁 + 唯一索引 | 轻量级,无分布式锁开销 |
| 故障恢复 | 看门狗 + 自动重试 | 超时/卡住任务自动恢复 |
| 批量处理 | Worker Pool + 分批事务 | 控制并发 + 保证一致性 |