电商系统设计(十):B 端运营系统
电商系统设计系列(篇次与(一)推荐阅读顺序一致)
- (一)全景概览与领域划分
- (二)商品中心系统
- (三)库存系统
- (四)营销系统深度解析
- (五)计价引擎
- (六)计价系统 DDD 实践
- (七)订单系统
- (八)支付系统深度解析
- (九)商品上架系统
- (十)B 端运营系统(本文)
本文是电商系统设计系列的第十篇,聚焦 B 端运营系统的设计。
一、背景与挑战
1.1 业务背景
在数字电商/本地生活平台中,B端商品运营管理系统面临的最大挑战是:
如何在多品类、多数据源、差异化业务规则的前提下,提供统一、高效的商品管理能力?
平台涵盖多种品类,每种品类的商品属性、数据来源、审核要求、库存模型、定价逻辑都存在显著差异。系统需要服务三类B端用户:
- 供应商:推送商品数据、同步库存价格
- 运营人员:商品上架、批量管理、价格调整、首页配置
- 商家:自营商品上传、信息维护
系统涵盖两大核心能力:
| 核心能力 | 职责 | 用户 | 典型操作 |
|---|---|---|---|
| 商品供给侧 | 商品快速上架到平台 | 供应商、运营、商家 | 单品上传、批量导入、供应商同步、审核发布 |
| 运营管理侧 | 已上线商品高效管理 | 运营人员 | 批量编辑、价格调整、库存管理、首页配置 |
1.2 多品类差异与统一挑战
1.2.1 品类差异对比(核心)
| 品类 | 商品特点 | 主要数据来源 | 审核策略 | 库存模型 | 价格模型 | 特殊处理 |
|---|---|---|---|---|---|---|
| 电子券 (Deal) | 券码制,每券唯一 | 运营上传 | 免审核 | 券码池,预订扣减 | 面值 vs 售价 | 券码池异步导入 |
| 虚拟服务券 (OPV) | 数量制,分平台统计 | 运营/商家 | 商家需审核 | 数量制,预订扣减 | 固定价 + 促销 | 平台分润规则 |
| 酒店 (Hotel) | 房型 × 日期 | 供应商Pull | 自动审核 | 时间维度库存 | 日历价 + 动态定价 | 价格日历校验 |
| 电影票 (Movie) | 场次 × 座位 × 票种 | 供应商Push | 快速通道 | 座位制库存 | 场次定价 + Fee | 场次时间校验 |
| 话费充值 (TopUp) | 面额制 | 运营上传 | 免审核 | 无限库存 | 面额 + 折扣 | 面额范围校验 |
| 礼品卡 (Giftcard) | 实时生成/预采购 | 运营/商家 | 商家需审核 | 券码制/无限 | 面值定价 | 卡密生成逻辑 |
| 本地生活套餐 | 组合型,多子项 | 商家上传 | 人工审核 | 组合库存联动 | 套餐价 + 子项加总 | 组合校验规则 |
1.2.2 数据来源分类
在数字电商/本地生活平台中,商品上架的数据来源和审核策略差异极大:
| 数据来源 | 触发方式 | 数据可信度 | 审核策略 | 典型场景 |
|---|---|---|---|---|
| 供应商 Push | 供应商实时推送 MQ 消息 | 高(合作方) | 自动审核(快速通道) | 电影票场次变更 |
| 供应商 Pull | 定时任务主动拉取 API | 高(合作方) | 自动审核(快速通道) | 酒店房型价格同步 |
| 运营上传 | 运营后台单品/批量 | 高(内部) | 免审核或自动审核 | 话费充值面额配置 |
| 商家上传 | Merchant App/Portal | 低(需审核) | 人工审核 | 商家自营电子券 |
| API 接口 | 第三方系统调用 | 中(看调用方) | 根据来源配置 | 批量导入工具 |
1.2.3 品类上架流程对比
| 品类 | 主要数据来源 | 对接方式 | 审核策略 | 特殊处理 |
|---|---|---|---|---|
| 酒店 (Hotel) | 供应商 Pull / 运营批量 | 定时拉取 API (Cron) | 自动审核 | 价格日历校验 |
| 电影票 (Movie) | 供应商 Push | 实时推送 (MQ) | 自动审核(快速通道) | 场次时间校验 |
| 话费充值 (TopUp) | 运营上传 | 单品表单 / Excel 批量 | 免审核 | 面额范围校验 |
| 电子券 (E-voucher) | 商家上传 / 供应商 Pull | Portal + 券码池 / API | 人工审核 | 券码池异步导入 |
| 礼品卡 (Giftcard) | 运营上传 / 商家上传 | 单品表单 / Merchant App | 商家需审核,运营免审 | 库存校验 |
1.3 核心痛点
1.3.1 商品供给侧痛点
核心挑战:
如何在品类差异如此大的情况下,避免每个品类独立开发一套系统,实现代码复用和流程统一?
具体痛点:
- 流程不统一:每个品类上架流程各异,代码无法复用。
- 状态管理混乱:草稿、审核、上线、下线等状态散落在不同表中。
- 批量上传困难:Excel 批量上传缺乏统一处理机制。
- 数据一致性差:并发上架时数据冲突频发,缺乏乐观锁保护。
- 审核策略不灵活:无法根据数据来源(供应商/运营/商家)动态调整审核策略。
- 供应商对接不统一:有的推送、有的拉取,各自实现,缺乏标准化。
1.3.2 运营管理侧痛点
- 批量操作效率低:万级SKU的价格/库存调整需要逐个操作,耗时数小时,影响运营效率
- 配置管理分散:首页Entrance、Tag标签、类目属性分散在不同系统,维护困难
- 数据对账困难:库存Redis/MySQL差异、价格不一致需要人工排查和修复
- 操作追溯性差:批量操作缺乏审计日志,出现问题难以回溯和定责
- 多品类管理复杂:不同品类各自后台,运营需切换多个系统,学习成本高
- 跨品类操作不支持:无法在同一界面同时管理电子券、酒店、电影票等商品
1.4 设计目标
| 目标 | 说明 | 优先级 |
|---|---|---|
| 多品类统一模型 | 所有品类共享统一状态机、数据模型、策略接口 | P0 |
| 差异化策略路由 | 通过策略模式适配不同品类的审核、库存、定价逻辑 | P0 |
| 统一上架流程 | 数据来源驱动审核策略(供应商/运营/商家) | P0 |
| 批量操作高效 | Excel批量导入/导出,万级SKU分钟级完成 | P0 |
| 异步化处理 | 上传、审核、发布异步化,提升响应速度 | P0 |
| 运营工具完善 | 价格、库存、配置批量管理工具 | P0 |
| 状态可追溯 | 完整的状态变更历史和操作审计 | P0 |
| 并发安全 | 乐观锁 + 唯一索引保证一致性 | P1 |
| 故障自愈 | 看门狗机制监控超时任务,自动重试 | P1 |
二、整体架构
📊 可视化架构图:
- Excalidraw 架构图(可在 Excalidraw 中打开编辑)
- Mermaid 流程图(可直接在支持 Mermaid 的编辑器中渲染)
2.1 多品类统一处理架构
1 | ┌─────────────────────────────────────────────────────────────────────┐ |
2.2 分层架构
2.2.1 架构流程图(Mermaid)
graph TB
subgraph 多品类数据入口层
A1[运营上传
Deal/TopUp/Giftcard
表单/Excel
免审核]
A2[商家上传
OPV/本地服务
Portal/App
人工审核+限流]
A3[批量导入
跨品类Excel
CSV
流式解析]
A4[供应商Push
Movie/实时商品
MQ实时推送
快速通道]
A5[供应商Pull
Hotel/酒店
定时拉取
增量同步]
A6[API接口
第三方系统
RPC/REST
幂等保证]
end
subgraph 统一Service层
B[ListingUploadService
数据来源识别
审核策略路由
雪花算法生成task_code
乐观锁+唯一索引]
end
subgraph 统一状态机
SM[统一状态机引擎
DRAFT→Pending→Approved→Online
所有品类共享]
end
subgraph 策略引擎层_差异化处理
V1[校验引擎
HotelRule
MovieRule
DealRule
TopUpRule]
V2[审核引擎
AutoAuditor
ManualQueue
FastTrack]
V3[发布引擎
ItemCreator
SKUCreator
AttributeCreator]
end
subgraph Kafka异步队列
C1[listing.batch.created]
C2[listing.audit.pending]
C3[listing.publish.ready]
C4[listing.published]
C5[*.dlq 死信队列]
end
subgraph Worker层
D1[ExcelParseWorker
流式解析
多品类模板]
D2[AuditWorker
规则引擎
策略路由]
D3[PublishWorker
Saga事务
品类适配]
D4[WatchdogWorker
超时监控]
D5[OutboxPublisher
可靠发布]
end
subgraph 数据层
G1[MySQL分库分表
16张表+归档]
G2[Redis缓存
L1+L2双层]
G3[Elasticsearch
搜索+统计]
G4[OSS文件存储]
G5[Outbox本地消息表]
end
A1 --> B
A2 --> B
A3 --> B
A4 --> B
A5 --> B
A6 --> B
B --> SM
SM --> V1
SM --> V2
V1 --> C2
V2 --> C3
C3 --> D3
C1 --> D1
C2 --> D2
D1 --> C2
D2 --> C3
D3 --> C4
D3 --> G1
D5 --> G5
G5 --> C4
C4 -.-> G3
C4 -.-> G2
2.2.2 文字描述
1 | ┌─────────────────────────────────────────────────────────────┐ |
2.3 核心设计思想
统一状态机 + 策略模式:
- 所有品类共享统一状态机(DRAFT → Pending → Approved → Online)
- 通过策略模式适配不同品类的校验规则、库存模型、定价逻辑
- 新品类零代码接入(只需注册策略)
数据来源驱动审核:
- 供应商(Push/Pull)→ 快速通道(可信数据源,仅基础校验)
- 运营上传 → 免审核(内部可信)
- 商家上传 → 人工审核(需质量把控)
- 同一品类,不同来源 → 不同审核策略
统一入口,差异化处理:
- API层统一接口(CreateTask/Submit/Approve/Publish)
- Worker层按品类路由到不同策略实现
- 运营后台统一界面,品类差异通过配置体现
异步化 + 事件驱动:
- 所有耗时操作(文件解析、审核、发布)通过 Kafka + Worker 异步处理
- API 层只负责创建任务和返回 task_code
- 每个状态变更都发送 Kafka 事件,下游消费者(ES 同步、缓存刷新、通知)解耦处理
支持海量批量操作:
- Excel批量导入:单次支持万级SKU,跨品类混合导入
- 批量价格/库存调整:分钟级完成
- 供应商批量同步:定时拉取 + 批量处理
三、商品供给侧:多品类统一上架
本章涵盖:本章描述多品类统一商品上架流程,包括状态机设计、审核策略路由、数据模型、核心流程(单品/批量/供应商同步)等,强调统一模型如何适配多品类差异。
3.1 统一状态机设计
3.1.1 状态流转图
所有品类(Deal/Hotel/Movie/TopUp等)共享同一套状态流转:
1 | ┌──────────┐ |
3.1.2 状态枚举
1 | const ( |
3.2 审核策略路由(数据来源驱动)
根据数据来源自动选择审核策略:
1 | 创建上架任务 |
审核策略配置示例:
| 品类 | 数据来源 | 审核策略 | 说明 |
|---|---|---|---|
| 电子券 | 运营表单 | 免审核 | 内部可信,直接发布 |
| 酒店 | 供应商Pull | 快速通道 | 合作方可信,仅基础校验 |
| 电影票 | 供应商Push | 快速通道 | 实时同步,秒级上线 |
| OPV | 商家Portal | 人工审核 | 需质量把控 |
| 礼品卡 | 运营批量 | 免审核 | 内部导入 |
| 礼品卡 | 商家App | 人工审核 | 商家上传需审核 |
3.3 核心数据模型
3.3.1 上架任务表(listing_task_tab)
每次上架操作对应一条任务记录,是整个流程的核心载体:
1 | CREATE TABLE listing_task_tab ( |
3.3.2 统一批量操作表(operation_batch_task_tab)
设计思想:所有批量操作(商品上架、价格调整、库存设置、商品编辑等)共享统一的批次管理表,通过 operation_type 字段区分不同操作类型。
1 | -- ===== 统一批量操作主表 ===== |
3.3.3 统一批量操作明细表(operation_batch_item_tab)
1 | -- ===== 统一批量操作明细表 ===== |
说明:
listing_batch_task_tab/listing_batch_item_tab:专门用于商品上架批量操作,关联listing_task_taboperation_batch_task_tab/operation_batch_item_tab:用于所有运营管理侧批量操作(调价/设库存/编辑/券码导入/打标等)
统一后的优势:
| 维度 | 优化前(分散表) | 优化后(统一表) |
|---|---|---|
| 表数量 | listing_batch + price_batch + inventory_batch(3套) | operation_batch(1套统一表) |
| 代码复用 | 每种批量操作独立实现(0%复用) | 框架代码复用80% |
| 进度跟踪 | 仅上架有进度,其他无 | 所有批量操作统一进度 |
| 结果文件 | 仅上架有结果文件 | 所有批量操作统一结果文件 |
| 监控告警 | 分散监控 | 统一监控指标 |
| 审计追溯 | 分散日志 | 统一 before/after 对比 |
| 适用范围 | 仅商品上架批量 | 所有运营批量操作 |
3.3.4 审核日志表 & 状态变更历史表
1 | -- 审核日志 |
3.3.5 审核策略配置表(多品类 × 多数据源)
根据品类和数据来源自动选择审核策略:
1 | CREATE TABLE listing_audit_config_tab ( |
3.4 多品类统一上架流程
3.4.1 单品上架流程(通用)
1 | 用户提交表单 |
多品类差异化处理示例:
1 | // 统一入口,品类自适应 |
3.4.2 批量上架流程(Excel多品类混合)
1 | 用户上传 Excel |
跨品类批量导入示例:
1 | Excel模板支持多品类混合导入(统一模板,差异化字段): |
3.4.3 供应商推送同步流程(Movie — 实时)
1 | 供应商发送影片/场次变更消息 (MQ) |
3.4.4 供应商定时拉取流程(Hotel — 批量)
1 | 定时任务触发(每小时 / 每 30 分钟) |
3.5 供应商对接双模式设计
3.5.1 推送 vs 拉取对比
| 对比项 | 推送模式 (Push) | 拉取模式 (Pull) |
|---|---|---|
| 代表品类 | Movie(电影票) | Hotel(酒店)、E-voucher |
| 触发方式 | 供应商主动推送 MQ 消息 | 定时任务周期性拉取 |
| 实时性 | 高(毫秒级) | 中(分钟级) |
| 数据完整性 | 依赖 MQ 可靠性 | 主动拉取保证完整 |
| 系统耦合度 | 供应商需感知平台 | 平台主动拉取,供应商无感知 |
| 适用场景 | 高频变更、实时性要求高、单次数据量小 | 低频变更、可接受延迟、单次数据量大 |
3.5.2 选型建议
- 推送模式:实时性要求 < 1s、变更频率高、供应商支持 MQ 推送。
- 拉取模式:可接受分钟级延迟、数据量大、需保证不丢失。
- 混合模式:E-voucher 等品类可同时支持两种 — 推送处理实时变更,拉取做每日全量对账。
3.5.3 同步状态管理
1 | CREATE TABLE supplier_sync_state_tab ( |
3.5.4 供应商对接策略接口(多品类统一)
1 | // SupplierSyncStrategy 供应商同步策略接口 |
四、运营管理侧:批量操作与配置管理
职责说明:本章描述运营人员管理已上线商品的批量操作工具,包括跨品类的商品编辑、价格调整、库存管理、类目维护、首页配置等功能。所有工具支持多品类,统一入口。
4.1 运营管理全景
1 | ┌────────────────────────────────────────────────────────────────┐ |
4.2 跨品类商品批量管理
4.2.1 商品查询与筛选(支持多品类)
1 | // 跨品类商品查询(统一接口) |
4.2.2 跨品类Excel批量编辑
1 | // Excel批量编辑(导出 → 编辑 → 导入) |
运营使用示例:
1 | 场景:同时编辑电子券、酒店、电影票 |
4.3 价格批量管理(支持多品类)
4.3.1 批量价格调整(统一批量框架)
1 | // ⭐ 批量调整价格(使用统一批量操作框架) |
多品类价格调整示例:
1 | 运营操作:选择"本地生活"大类下所有商品,统一涨价10% |
4.3.2 促销活动配置(跨品类)
1 | // 创建促销活动(可跨多个品类) |
跨品类促销示例:
1 | 活动:新用户立减50元(适用于电子券、虚拟服务、礼品卡) |
4.4 库存批量管理(支持多品类)
4.4.1 库存批量设置
1 | // ⭐ 批量设置库存(使用统一批量操作框架) |
4.4.2 券码池批量导入(Deal/Giftcard专用)
1 | // 券码批量导入(流式处理,支持百万级) |
性能数据:
- 10万券码导入:< 2分钟
- 100万券码导入:< 15分钟
- 批量插入优化:TPS 5万+
4.4.3 库存对账与修复
1 | // 库存对账工具(运营后台手动触发) |
4.5 类目与属性管理
4.5.1 类目树维护
1 | CREATE TABLE category_tab ( |
4.5.2 类目属性配置(品类差异化)
1 | CREATE TABLE category_attribute_tab ( |
4.6 首页配置管理(Entrance/Group/Tag)
4.6.1 Entrance配置发布(热Key分散)
1 | // Entrance/Group 配置发布(避免热 Key) |
热Key分散效果:
| 优化项 | 优化前 | 优化后 | 效果 |
|---|---|---|---|
| 单个Redis Key QPS | 6万 | 600(分散到100个Key) | 降低100倍 |
| Redis CPU使用率 | 80% | 15% | 大幅降低 |
| P99延迟 | 150ms | 5ms | 提升30倍 |
4.6.2 Tag标签管理(跨品类)
1 | CREATE TABLE tag_tab ( |
1 | // 批量打标(支持跨品类) |
跨品类标签示例:
1 | 场景:春节促销,需要给多个品类的商品打上"新春特惠"标签 |
4.7 统一批量操作框架深度解析
4.7.1 统一批量操作全流程图
1 | ┌─────────────────────────────────────────────────────────────────┐ |
4.7.2 统一前后架构对比
4.7.1 架构演进:分散 → 统一
优化前架构(分散式):
1 | 批量调价流程: |
优化后架构(统一框架):
1 | 所有批量操作统一流程: |
4.7.2 统一前后架构详细对比
对比维度一:表设计
| 表名 | 优化前 | 优化后 | 说明 |
|---|---|---|---|
| 批次主表 | listing_batch_task_tab price_batch_task_tab inventory_batch_task_tab (3套重复表) |
operation_batch_task_tab (1套统一表) |
通过operation_type字段区分操作类型 |
| 批次明细表 | listing_batch_item_tab price_batch_item_tab inventory_batch_item_tab (3套重复表) |
operation_batch_item_tab (1套统一表) |
target_type/target_id通用指向 |
| 审计字段 | 分散在各自表 | 统一before_value/after_value | 所有批量操作统一审计格式 |
对比维度二:功能对比
| 功能维度 | 优化前(分散) | 优化后(统一) | 提升效果 |
|---|---|---|---|
| 批次跟踪 | ❌ 仅商品上架有batch_code ✅ 批量调价无批次记录 ✅ 批量设库存无批次记录 |
✅ 所有批量操作统一batch_code ✅ 统一查询接口 ✅ 统一历史记录 |
覆盖率从33%提升到100% |
| 进度反馈 | ❌ 仅上架有实时进度 ❌ 其他操作无进度 |
✅ 所有批量操作实时进度 ✅ 统一进度计算(0-100%) ✅ WebSocket实时推送 |
用户体验大幅提升 |
| 结果文件 | ✅ 商品上架:有Excel结果文件 ❌ 批量调价:无结果文件 ❌ 批量设库存:无结果文件 |
✅ 所有批量操作统一生成Excel ✅ 包含before/after对比 ✅ 包含成功/失败明细 |
可追溯性提升,用户满意度提升 |
| 审计日志 | ❌ before/after分散存储 ❌ 部分操作无审计 |
✅ 统一before_value/after_value ✅ 每条明细完整记录 ✅ 支持全局审计查询 |
合规性+问题排查效率提升 |
| 错误处理 | ❌ 错误信息丢失 ❌ 无法定位具体失败行 |
✅ 每条明细记录error_message ✅ Excel结果文件标注失败行 ✅ 支持按错误类型统计 |
问题定位效率提升10倍 |
| 流式处理 | ❌ 仅券码导入使用 ❌ 其他操作同步加载全部数据 |
✅ 所有批量操作统一流式解析 ✅ 分批读取batch_item(每批100条) ✅ 内存占用恒定 |
支持更大文件(百万级) |
对比维度三:代码复用率
| 代码模块 | 优化前 | 优化后 | 复用率提升 |
|---|---|---|---|
| 批次创建逻辑 | 每种操作独立实现 | 统一CreateBatchTask方法 | 0% → 90% |
| 进度更新逻辑 | 每种操作独立实现 | 统一UpdateProgress方法 | 0% → 95% |
| 结果文件生成 | 仅上架有,其他无 | 统一GenerateResultFile方法 | 33% → 100% |
| Worker Pool处理 | 部分操作无并发 | 统一Worker Pool模板 | 30% → 90% |
| 流式解析 | 仅券码导入用 | 统一Stream Reader模板 | 10% → 90% |
| 错误处理 | 各自实现 | 统一Error Recording | 0% → 85% |
整体代码复用率:从 15% 提升到 80%
4.7.6 典型操作时间对比
4.7.3 运营效率优化成果
| 优化点 | 优化前 | 优化后 | 提升 | 支持品类 |
|---|---|---|---|---|
| 批量价格调整 | 手动逐个修改,无进度反馈 | Excel批量 + 异步处理 + 实时进度 | 效率提升100倍 | 全品类 |
| 批量设库存 | 同步处理,大文件OOM | 流式解析 + Worker Pool | 10000条从超时降至5分钟 | 全品类 |
| 券码导入 | API逐条插入,30分钟/万条 | 流式解析 + 批量写入 | 10万条从5小时降至2分钟 | Deal/Giftcard |
| 批量操作追溯 | 无审计记录 | before/after完整对比 | 新增审计能力 | 全品类 |
| 首页配置发布 | 单一Redis Key | 100个Key分散 + CDN | 热Key QPS从6万降至600 | 全品类 |
| 商品搜索 | MySQL LIKE查询 | ES索引 + 缓存 | 查询耗时从2s降至50ms | 全品类 |
| 供应商批量同步 | 单条处理 | 批量处理 + Worker Pool | 1000条从5分钟降至30秒 | Hotel/Movie等 |
| 跨品类批量编辑 | 不支持 | 统一Excel模板 | 新增能力 | 全品类 |
4.7.4 统一批量操作框架核心代码
Worker路由与注册:
1 | // 统一批量操作Worker管理器 |
新增批量操作类型(仅需3步):
1 | // 步骤1: 实现BatchOperationWorker接口 |
统一监控指标:
1 | # Prometheus指标(统一命名规范) |
4.7.5 统一批量操作框架对比
单品操作:
- 单品上架(运营表单):< 3 秒(免审核)
- 单品上架(商家上传):< 5 分钟(人工审核)
- 单品价格调整:实时生效(< 1秒)
- 单品下线操作:实时生效(< 1秒)
批量操作:
- 批量上传(10000 SKU):< 10 分钟(Excel 导入 + 自动审核)
- 批量价格调整(1000 SKU):< 30 秒
- 批量库存设置(10000 SKU):< 5 分钟
- 券码批量导入(100000 券码):< 2 分钟
- 跨品类批量编辑(500商品):< 2 分钟
供应商同步:
- 酒店增量同步(1000房型):< 30 秒(定时Pull)
- 电影票实时同步(单个场次):< 500 毫秒(Push)
4.8 统一批量操作框架实现细节
4.8.1 基础Worker模板(所有批量操作复用)
1 | // BaseBatchOperationWorker 提供统一的批量操作处理能力 |
框架提供的开箱即用能力:
- ✅ 流式处理(避免OOM)
- ✅ Worker Pool并发(性能优化)
- ✅ 进度实时更新(用户体验)
- ✅ 结果文件生成(Excel,含before/after)
- ✅ 错误处理与记录(每条明细)
- ✅ 监控指标(Prometheus)
- ✅ 告警规则(统一配置)
- ✅ 审计日志(before/after完整记录)
4.8.2 统一vs分散架构对比图
1 | ┌────────────────────────────────────────────────────────────────┐ |
4.8.3 代码复用率对比
| 代码模块 | 优化前(分散) | 优化后(统一) | 代码行数对比 |
|---|---|---|---|
| 批次创建 | 每种操作独立实现(重复3次) | 统一CreateBatchTask(1次) | 300行 → 100行 |
| 进度更新 | 仅上架实现(1次),其他无 | 统一UpdateProgress(1次) | 100行 → 50行 |
| 流式解析 | 每种操作独立实现(重复2次) | 统一StreamReader(1次) | 200行 → 80行 |
| Worker Pool | 每种操作独立实现(重复3次) | 统一WorkerPool模板(1次) | 400行 → 150行 |
| 结果文件生成 | 仅上架实现(1次),其他无 | 统一GenerateResult(1次) | 150行 → 100行 |
| 错误记录 | 每种操作独立实现(重复3次) | 统一RecordError(1次) | 120行 → 40行 |
| 监控指标上报 | 分散实现(重复3次) | 统一Metrics(1次) | 180行 → 60行 |
| 审计日志 | 分散实现(重复2次) | 统一AuditLog(1次) | 200行 → 80行 |
总代码量对比:
- 优化前:1650行(平均每种批量操作550行)
- 优化后:660行(框架460行 + 业务逻辑200行)
- 减少代码量60%
新增批量操作对比:
- 优化前:需要实现所有流程(550行,2周)
- 优化后:仅实现业务逻辑(50行,2天)
- 开发效率提升7倍
4.9 统一批量操作用户交互
4.9.1 批量操作进度查询API
1 | // 查询批量操作进度(统一接口) |
4.9.2 前端实时进度展示(WebSocket)
1 | // WebSocket推送批量操作进度 |
前端展示效果:
1 | ┌─────────────────────────────────────────────────────────┐ |
4.9.3 批量操作历史查询
1 | // 查询用户的批量操作历史(统一接口) |
运营后台展示:
1 | ┌──────────────────────────────────────────────────────────────┐ |
五、关键技术方案
5.1 乐观锁 + 版本号(并发安全)
所有状态变更使用乐观锁,防止并发冲突:
1 | func UpdateStatus(taskID int64, fromStatus, toStatus int, action string) error { |
5.2 唯一索引保证幂等
task_code 唯一索引保证同一上架操作不会重复创建:
1 | func CreateTask(req *CreateTaskRequest) (*ListingTask, error) { |
5.3 看门狗机制(Watchdog)
监控超时和卡住的任务,自动重试或告警:
1 | func (w *WatchdogService) Start() { |
5.4 数据校验引擎(策略模式 - 多品类适配)
不同品类注册不同校验规则,通过规则引擎统一执行:
1 | type ValidationEngine struct { |
品类规则实现示例:
1 | // 酒店价格日历校验规则 |
5.5 Worker Pool 并发处理
批量上架使用 Worker Pool 控制并发度:
1 | func PublishBatch(batchID int64) error { |
5.6 分布式事务处理(Saga模式 - 多品类适配)
商品发布流程涉及多表写入(item_tab、sku_tab、属性表、价格表等),需要保证分布式事务一致性。
5.6.1 Saga 模式设计
采用 Saga 编排模式(Orchestration),每个步骤可独立回滚:
1 | type PublishSaga struct { |
5.6.2 具体步骤实现
1 | // 步骤1: 创建商品主体(品类通用) |
5.6.3 Saga 状态持久化
为了支持断点恢复和故障排查,将 Saga 执行状态持久化:
1 | CREATE TABLE listing_saga_log_tab ( |
1 | // 记录 Saga 步骤执行 |
5.6.4 本地消息表方案(可靠事件发布)
对于 Kafka 事件发布,使用本地消息表保证最终一致性:
1 | CREATE TABLE listing_outbox_tab ( |
1 | // 步骤6: 发送事件(本地消息表) |
5.6.5 分布式事务监控
1 | // Prometheus 指标 |
六、Kafka 事件设计
6.1 Topic 设计
| Topic | 触发时机 | 消费者 | 品类 | 消费者数量 |
|---|---|---|---|---|
| 商品上架流程 | ||||
listing.batch.created |
商品上架Excel上传完成 | ExcelParseWorker | 全品类 | 1个Worker |
listing.audit.pending |
提交审核 | AuditWorker | 全品类 | 1个Worker |
listing.publish.ready |
审核通过 | PublishWorker | 全品类 | 1个Worker |
listing.published |
发布成功 | CacheSync/ESSync/Notification | 全品类 | 3个Worker |
listing.batch.parsed |
Excel 解析完成 | BatchAuditWorker | 全品类 | 1个Worker |
listing.batch.audited |
批量审核完成 | BatchPublishWorker | 全品类 | 1个Worker |
| ⭐ 统一批量操作流程(一个Topic,多个消费者按类型过滤) | ||||
operation.batch.created |
任意批量操作创建 | 多个Worker按operation_type过滤消费 | 全品类 | 4+个Worker |
| ↳ operation_type=price_adjust | 批量调价 | PriceUpdateWorker | 全品类 | - |
| ↳ operation_type=inventory_update | 批量设库存 | InventoryUpdateWorker | 全品类 | - |
| ↳ operation_type=voucher_code_import | 券码导入 | VoucherCodeImportWorker | Deal/Giftcard | - |
| ↳ operation_type=item_edit | 批量编辑 | ItemBatchEditWorker | 全品类 | - |
6.2 消息格式
1 | // 商品上架事件 |
七、分库分表与数据归档
7.1 分表策略
当商品量达到千万级时,单表会成为性能瓶颈,需要采用分库分表策略。
7.1.1 分表方案选择
方案一:按月分表(推荐用于批量上架三表)
批量上架的三张核心表(listing_batch_task_tab、listing_batch_item_tab、listing_task_tab)推荐采用按月分表策略,因为:
- 数据增长快:每天批量导入产生大量数据
- 查询热度高:主要查询近期数据(最近 1-3 个月)
- 归档需求强:历史数据需要定期归档到冷存储
分表命名规范:
1 | -- 按月分表,YYYYMM 格式后缀 |
自动建表脚本:
1 | // 每月自动创建下月分表 |
分表路由逻辑:
1 | type ShardingRouter struct { |
跨月批次查询优化:
对于跨月的批次查询,可以通过 batch_code 反向推导创建时间:
1 | // batch_code 格式:BATCH_202602_abc123(包含月份信息) |
分表策略总结:
| 表名 | 是否分表 | 分表策略 | 原因 |
|---|---|---|---|
| 商品上架相关 | |||
listing_batch_task_tab |
✅ | 按月分表 | 批量上传频繁,数据量大 |
listing_batch_item_tab |
✅ | 按月分表 | Excel每行一条记录,数据量最大 |
listing_task_tab |
✅ | 按月分表 | 任务表数据增长快,热数据集中在近期 |
listing_audit_log_tab |
✅ | 按月分表 | 日志表,可按月归档 |
listing_state_history_tab |
✅ | 按月分表 | 历史记录表,可按月归档 |
| ⭐ 统一批量操作相关(新增) | |||
operation_batch_task_tab |
✅ | 按月分表 | 批量操作频繁(调价/设库存等),数据增长快 |
operation_batch_item_tab |
✅ | 按月分表 | 批量明细表,数据量极大(可能百万级) |
| 商品主表 | |||
item_tab |
❌ | 不分表 | 需要全局查询,数据量相对可控 |
方案二:按品类 ID 取模分表(推荐用于活跃数据)
1 | -- 按 category_id 取模分 16 张表 |
方案三:混合分表(推荐)
1 | -- 先按品类分表,再按时间归档 |
7.1.2 分库策略
按业务维度垂直分库:
1 | listing_db_core -- 核心任务表(listing_task_tab, listing_batch_task_tab) |
7.1.3 全局唯一 ID 生成
分表后需要保证 task_code 全局唯一:
1 | // 雪花算法生成 task_code |
7.2 软删除与数据归档
7.2.1 软删除设计
所有核心表增加软删除字段,避免误删和支持数据恢复:
1 | -- 为核心表添加软删除字段 |
7.2.2 基于按月分表的数据归档策略
由于采用了按月分表策略,数据归档变得更加简单和高效,整表归档替代逐行筛选。
归档规则(三级存储):
| 存储级别 | 时间范围 | 存储位置 | 查询频率 | 操作 |
|---|---|---|---|---|
| 热数据 | 最近 3 个月 | 主库(可读写) | 极高 | 保留在线 |
| 温数据 | 3-12 个月 | 只读从库 | 低 | 迁移到从库 |
| 冷数据 | 12 个月以上 | 对象存储(OSS/S3) | 极低 | 导出后删表 |
归档优势(vs 传统按行归档):
✅ 操作简单:整表导出/删除,无需复杂 WHERE 条件
✅ 性能高:不影响在线表查询,无锁表风险
✅ 回滚容易:误删除可快速从 OSS 恢复整表
✅ 成本低:冷数据存储在廉价对象存储
归档服务实现:
1 | type ArchiveService struct { |
归档元数据管理表:
1 | -- 归档日志表(记录所有归档操作) |
定时任务配置:
1 | func StartArchiveJobs(service *ArchiveService) { |
跨分表 + 归档表的查询:
1 | // 按 task_code 查询(可能在活跃表或归档表) |
八、监控与告警
8.1 关键指标
| 指标 | 目标值 | 告警阈值 | 适用品类 |
|---|---|---|---|
| 上架成功率 | > 95% | < 90% | 全品类 |
| 平均上架时长 | < 5 分钟 | > 10 分钟 | 全品类 |
| 批量处理速度 | > 100 条/分钟 | < 50 条/分钟 | 全品类 |
| 审核通过率 | > 90% | < 80% | 需审核品类 |
| Worker 处理延迟 | < 1 分钟 | > 5 分钟 | 全品类 |
| Kafka 消息积压 | < 1000 条 | > 5000 条 | 全品类 |
| 供应商同步延迟 | < 5 分钟 | > 15 分钟 | Hotel/Movie等 |
8.2 Prometheus Metrics
1 | # 上架任务指标(按品类分组) |
8.3 告警规则
| 告警名称 | 条件 | 级别 | 处理 |
|---|---|---|---|
| 商品上架相关 | |||
| 上架失败率高 | listing_fail_rate > 10% 持续5分钟 | P0 | 检查Worker状态、DB连接 |
| 商品批量任务卡住 | listing_batch processing时间 > 30分钟 | P0 | 检查Worker/Kafka状态 |
| 审核队列积压 | audit_queue_size > 1000 | P1 | 增加审核人员 |
| 供应商同步延迟 | sync_lag > 15分钟 | P1 | 检查供应商API可用性 |
| ⭐ 统一批量操作相关(新增) | |||
| 批量操作超时 | operation_batch_task_duration > 600s | P1 | 检查Worker性能、DB慢查询 |
| 批量操作失败率高 | operation_batch_task{status=”failed”} rate > 10% | P0 | 检查数据格式、业务规则 |
| 批量明细处理慢 | operation_batch_item_processing_rate < 10条/秒 | P1 | 增加Worker副本、优化SQL |
| Worker Pool利用率低 | operation_batch_worker_pool_utilization < 30% | P2 | 检查是否有阻塞操作 |
| 批量任务积压 | operation_batch_task{status=”processing”} > 50 | P1 | 增加Worker副本数 |
| 通用告警 | |||
| Saga补偿失败 | saga_compensation_failed > 0 | P0 | 人工介入数据修复 |
| Outbox消息积压 | outbox_pending > 5000 | P1 | 检查Kafka连接 |
九、Worker 详细清单与实际应用
基于系统的事件驱动 + 异步Worker架构,所有耗时操作都通过Worker异步处理。本章详细列举系统中所有Worker及其实际用途。
9.1 商品上架核心Worker(6个)
9.1.1 ExcelParseWorker - Excel文件解析
消费Topic: listing.batch.created
职责:
- 批量导入时解析Excel/CSV文件
- 支持流式解析(避免大文件OOM)
- 逐行校验并创建listing_task
实际用途:
1 | // 运营上传10000行Excel → ExcelParseWorker处理 |
性能指标:
- 处理速度: 1000行/分钟
- 10000行Excel: < 10分钟
- 内存占用: < 200MB(流式解析)
9.1.2 AuditWorker - 商品审核
消费Topic: listing.audit.pending
职责:
- 执行商品审核(自动审核/人工审核路由)
- 根据品类调用不同校验规则
- 更新审核状态和记录审核日志
实际用途:
1 | type AuditWorker struct { |
性能指标:
- 单个任务审核: < 100ms
- 批量1000条: < 2分钟
- 并发处理: 20 goroutines
9.1.3 PublishWorker - 商品发布
消费Topic: listing.publish.ready
职责:
- 执行商品发布(Saga事务)
- 创建item/sku/属性表等多表数据
- 根据品类执行不同发布步骤
实际用途:
1 | type PublishWorker struct { |
性能指标:
- 单个商品发布: < 500ms
- 批量100条: < 30秒
- Saga回滚成功率: > 99.9%
9.1.4 BatchAuditWorker - 批量审核
消费Topic: listing.batch.parsed
职责:
- 批量审核Excel导入的所有商品
- 按品类分组并行处理
- 更新批次进度
实际用途:
1 | type BatchAuditWorker struct { |
性能指标:
- 1000条批量审核: < 2分钟
- 并发处理: 20 goroutines
- 内存占用: < 500MB
9.1.5 BatchPublishWorker - 批量发布
消费Topic: listing.batch.audited
职责:
- 批量发布审核通过的商品
- 分批处理(每批100条)
- 生成结果文件
实际用途:
1 | type BatchPublishWorker struct { |
性能指标:
- 1000条批量发布: < 5分钟
- 分批大小: 100条/批
- 事务隔离: 失败批次不影响其他批次
9.1.6 WatchdogWorker - 任务监控和超时处理
触发方式: 定时任务(每1分钟)
职责:
- 监控超时任务(审核超时、发布超时)
- 监控卡住任务(长时间无进度)
- 自动重试或告警
实际用途:
1 | type WatchdogWorker struct { |
监控指标:
- 超时任务数: < 10
- 卡住任务数: 0
- 自动重试成功率: > 90%
9.2 供应商同步Worker(4个)
9.2.1 SupplierPullWorker - 供应商定时拉取
触发方式: 定时任务(Cron)
职责:
- 定时拉取供应商数据(酒店、电子券)
- 增量同步(基于last_sync_time)
- 批量创建上架任务
实际用途:
1 | type SupplierPullWorker struct { |
适用品类: Hotel, E-voucher, Giftcard
性能指标:
- 1000条酒店同步: < 30秒
- 同步频率: 30分钟
- 失败重试: 指数退避
9.2.2 SupplierPushConsumer - 供应商实时推送
消费Topic: supplier.movie.updates, supplier.hotel.updates
职责:
- 实时接收供应商推送消息(电影票场次)
- 解析并转换数据
- 快速通道上架
实际用途:
1 | type SupplierPushConsumer struct { |
适用品类: Movie(电影票),实时库存更新
性能指标:
- 处理延迟: < 500ms
- 上线速度: 秒级
- 消息吞吐: 1000条/秒
9.2.3 SupplierSyncMonitorWorker - 供应商同步监控
触发方式: 定时任务(每5分钟)
职责:
- 监控供应商同步状态
- 检测同步延迟
- 失败告警
实际用途:
1 | type SupplierSyncMonitorWorker struct { |
9.2.4 SupplierDataCleanWorker - 供应商数据清理
触发方式: 定时任务(每天凌晨2点)
职责:
- 清理供应商过期数据(过期电影场次、已过入住日期的酒店)
- 自动下线过期商品
- 释放库存
实际用途:
1 | type SupplierDataCleanWorker struct { |
9.3 数据同步Worker(5个)
9.3.1 CacheSyncWorker - 缓存同步
消费Topic: listing.published, price.changed, inventory.changed
职责:
- 商品发布成功后同步到Redis
- 价格/库存变更后更新缓存
- 多级缓存更新
实际用途:
1 | type CacheSyncWorker struct { |
性能指标:
- 单条同步: < 50ms
- 批量1000条: < 5秒
9.3.2 ESSyncWorker - Elasticsearch同步
消费Topic: listing.published, listing.updated, listing.offline
职责:
- 商品发布后同步到ES(搜索用)
- 商品信息变更后更新ES索引
- 商品下线后删除ES文档
实际用途:
1 | type ESSyncWorker struct { |
性能指标:
- 单条索引: < 100ms
- 批量索引: 1000条 < 10秒
- 搜索延迟: < 50ms
9.3.3 DataReconciliationWorker - 数据对账
触发方式: 定时任务(每天凌晨3点)
职责:
- MySQL vs Redis库存对账
- MySQL vs ES商品数据对账
- 自动修复数据不一致
实际用途:
1 | type DataReconciliationWorker struct { |
性能指标:
- 每日对账: 100万SKU < 30分钟
- 自动修复率: > 95%
9.3.4 StatisticsWorker - 统计数据生成
触发方式: 定时任务(每小时/每天)
职责:
- 生成运营报表(上架统计、审核统计)
- 品类维度数据统计
- 供应商维度数据统计
实际用途:
1 | type StatisticsWorker struct { |
9.3.5 NotificationWorker - 通知推送
消费Topic: listing.rejected, listing.published, batch.completed
职责:
- 商家上传审核结果通知
- 批量任务完成通知
- 重要事件通知
实际用途:
1 | type NotificationWorker struct { |
9.4 运营管理Worker(4个)
9.4.1 PriceUpdateWorker - 批量价格更新(统一框架)
消费Topic: operation.batch.created (过滤 operation_type=’price_adjust’)
职责:
- 批量价格调整(百分比/固定金额)
- 流式解析Excel(如有文件)或直接处理批量明细
- 乐观锁更新 + before/after审计
- 生成结果文件
实际用途:
1 | type PriceUpdateWorker struct { |
性能指标:
- 1000条价格更新: < 30秒
- 10000条价格更新: < 5分钟
- 并发度: 20
- 成功率: > 98%
9.4.2 InventoryUpdateWorker - 批量库存更新(统一框架)
消费Topic: operation.batch.created (过滤 operation_type=’inventory_update’)
职责:
- 流式解析Excel库存文件
- 批量库存设置(按品类差异化校验)
- MySQL + Redis双写
- 生成结果文件(before/after对比)
实际用途:
1 | type InventoryUpdateWorker struct { |
性能指标:
- 1000条库存更新: < 1分钟
- 10000条库存更新: < 5分钟
- 并发度: 20
- 成功率: > 98%
9.4.3 VoucherCodeImportWorker - 券码导入(统一框架)
消费Topic: operation.batch.created (过滤 operation_type=’voucher_code_import’)
职责:
- 流式解析券码文件(CSV,支持百万级)
- 批量插入券码池(分表存储)
- 更新库存统计
- 生成结果文件
实际用途:
1 | type VoucherCodeImportWorker struct { |
性能指标:
- 10万券码导入: < 2分钟
- 100万券码导入: < 15分钟
- TPS: 5万+
- 内存占用: < 200MB(流式解析)
9.4.4 ItemBatchEditWorker - 批量编辑商品(统一框架)
消费Topic: operation.batch.created (过滤 operation_type=’item_edit’)
职责:
- Excel批量编辑商品(导出 → 编辑 → 导入)
- 支持跨品类批量编辑
- 流式处理 + Worker Pool并发
- 生成结果文件(before/after对比)
实际用途:
1 | type ItemBatchEditWorker struct { |
性能指标:
- 1000条商品编辑: < 2分钟
- 10000条商品编辑: < 10分钟
- 并发度: 20
- 成功率: > 95%
9.4.5 ConfigPublishWorker - 配置发布
消费Topic: config.publish
职责:
- 首页Entrance配置发布
- 热Key分散(100个Key)
- CDN同步
实际用途:
1 | type ConfigPublishWorker struct { |
9.5 事件可靠发布Worker(2个)
9.5.1 OutboxPublisher - 本地消息表发布
触发方式: 定时任务(每5秒)
职责:
- 扫描本地消息表(outbox)
- 发送到Kafka
- 失败重试(指数退避)
实际用途:
1 | type OutboxPublisher struct { |
保证:
- 最终一致性
- At-least-once delivery
- 失败重试: 3次
9.5.2 DeadLetterQueueWorker - 死信队列处理
消费Topic: *.dlq(所有死信队列)
职责:
- 处理消费失败的消息
- 分析失败原因
- 人工介入或自动修复
实际用途:
1 | type DeadLetterQueueWorker struct { |
9.6 数据维护Worker(4个)
9.6.1 DataArchiveWorker - 数据归档
触发方式: 定时任务(每月1号凌晨3点)
职责:
- 归档12个月前的分表数据
- 导出到OSS
- 清理旧表
实际用途:
1 | type DataArchiveWorker struct { |
定时任务: 每月1号凌晨3点
9.6.2 TableShardingWorker - 自动建表
触发方式: 定时任务(每月1号凌晨1点)
职责:
- 自动创建下月分表
- 保证分表提前创建
- 避免月底建表失败
实际用途:
1 | type TableShardingWorker struct { |
定时任务: 每月1号凌晨1点
9.6.3 DeletedTableCleanupWorker - 清理已归档表
触发方式: 定时任务(每天凌晨4点)
职责:
- 清理标记为删除的表(7天后)
- 释放存储空间
实际用途:
1 | type DeletedTableCleanupWorker struct { |
定时任务: 每天凌晨4点
9.6.4 DataCleanupWorker - 软删除数据清理
触发方式: 定时任务(每周日凌晨2点)
职责:
- 清理软删除数据(deleted_at > 30天)
- 物理删除过期数据
实际用途:
1 | type DataCleanupWorker struct { |
9.7 Worker架构总览
9.7.1 完整Worker清单
| # | Worker名称 | 触发方式 | 职责 | 适用品类 | 性能指标 |
|---|---|---|---|---|---|
| 商品上架核心Worker(6个) | |||||
| 1 | ExcelParseWorker | Kafka: listing.batch.created | 商品上架Excel解析 | 全品类 | 1000行/分钟 |
| 2 | AuditWorker | Kafka: listing.audit.pending | 商品审核 | 全品类 | < 100ms/条 |
| 3 | PublishWorker | Kafka: listing.publish.ready | 商品发布(Saga) | 全品类 | < 500ms/条 |
| 4 | BatchAuditWorker | Kafka: listing.batch.parsed | 商品批量审核 | 全品类 | 1000条 < 2分钟 |
| 5 | BatchPublishWorker | Kafka: listing.batch.audited | 商品批量发布 | 全品类 | 1000条 < 5分钟 |
| 6 | WatchdogWorker | Cron(1分钟) | 超时监控 | 全品类 | 实时 |
| ⭐ 统一批量操作Worker(4个) | |||||
| 7 | PriceUpdateWorker | Kafka: operation.batch.created | 批量价格调整 | 全品类 | 10000条 < 5分钟 |
| 8 | InventoryUpdateWorker | Kafka: operation.batch.created | 批量库存设置 | 全品类 | 10000条 < 5分钟 |
| 9 | VoucherCodeImportWorker | Kafka: operation.batch.created | 券码导入 | Deal/Giftcard | 100万 < 15分钟 |
| 10 | ItemBatchEditWorker | Kafka: operation.batch.created | 批量编辑商品 | 全品类 | 1000条 < 2分钟 |
| 供应商同步Worker(4个) | |||||
| 11 | SupplierPullWorker | Cron(30分钟) | 供应商拉取 | Hotel/Deal | 1000条 < 30秒 |
| 12 | SupplierPushConsumer | Kafka: supplier.*.updates | 供应商推送 | Movie | < 500ms |
| 13 | SupplierSyncMonitorWorker | Cron(5分钟) | 同步监控 | 有供应商品类 | 实时 |
| 14 | SupplierDataCleanWorker | Cron(每天2点) | 过期数据清理 | Movie/Hotel | - |
| 数据同步Worker(5个) | |||||
| 15 | CacheSyncWorker | Kafka: *.published/changed | 缓存同步 | 全品类 | < 50ms/条 |
| 16 | ESSyncWorker | Kafka: *.published/updated | ES索引同步 | 全品类 | < 100ms/条 |
| 17 | DataReconciliationWorker | Cron(每天3点) | 数据对账 | 全品类 | 100万 < 30分钟 |
| 18 | StatisticsWorker | Cron(每小时) | 统计报表 | 全品类 | - |
| 19 | NotificationWorker | Kafka: *.rejected/completed | 通知推送 | 全品类 | 实时 |
| 配置管理Worker(1个) | |||||
| 20 | ConfigPublishWorker | Kafka: config.publish | 配置发布 | 全品类 | 实时 |
| 事件发布Worker(2个) | |||||
| 21 | OutboxPublisher | Cron(5秒) | 本地消息表发布 | 全品类 | < 100条/次 |
| 22 | DeadLetterQueueWorker | Kafka: *.dlq | 死信处理 | 全品类 | 实时 |
| 数据维护Worker(4个) | |||||
| 23 | DataArchiveWorker | Cron(每月1号3点) | 数据归档 | 全品类 | 按表 |
| 24 | TableShardingWorker | Cron(每月1号1点) | 自动建表 | 全品类 | 秒级 |
| 25 | DeletedTableCleanupWorker | Cron(每天4点) | 清理已归档表 | 全品类 | - |
| 26 | DataCleanupWorker | Cron(每周日2点) | 软删除清理 | 全品类 | - |
共计:27个Worker类型
⭐ 统一批量框架特点:
operation.batch.created一个Topic支持所有批量操作- 通过
operation_type字段路由到不同Worker - 所有批量操作共享:进度跟踪、结果文件、审计日志
- 代码复用率提升80%
- 新增批量操作类型仅需实现业务逻辑(2天 vs 优化前2周)
统一批量操作Worker(5个):
- PriceUpdateWorker - 批量调价
- InventoryUpdateWorker - 批量设库存
- VoucherCodeImportWorker - 券码导入
- ItemBatchEditWorker - 批量编辑商品
- (未来可轻松扩展)BatchTagWorker、BatchStatusWorker 等
9.7.2 Worker部署拓扑
1 | ┌─────────────────────────────────────────────────────────────┐ |
9.7.3 Kafka Topic与Worker映射
1 | ┌──────────────────────────────────────────────────────────────┐ |
9.7.4 Worker资源配置
| Worker类型 | CPU | 内存 | 副本数 | 说明 |
|---|---|---|---|---|
| 商品上架核心Worker | 2核 | 4GB | 16 | 高并发 |
| ⭐ 统一批量操作Worker | 1核 | 2GB | 11 | 中高并发 |
| 供应商同步Worker | 1核 | 2GB | 6 | 中等 |
| 数据同步Worker | 1核 | 2GB | 7 | 中等 |
| 配置管理Worker | 0.5核 | 1GB | 1 | 低频 |
| 事件发布Worker | 0.5核 | 1GB | 2 | 中频 |
| 数据维护Worker | 0.5核 | 1GB | 7 | 低频 |
总资源需求: CPU: 68核,内存: 132GB
统一批量框架资源说明:
- 优化前:每种批量操作独立部署(3种 × 2副本 = 6副本,12核24GB)
- 优化后:统一框架(5种 × 平均2.2副本 = 11副本,11核22GB)
- 资源节约:1核2GB(统一处理逻辑降低重复部署)
9.8 Worker监控大盘
9.8.1 Worker健康状态
1 | ┌────────────────────────────────────────────────────┐ |
9.9 设计总结
9.9.1 Worker分类
- 商品上架核心Worker(6个): ExcelParse, Audit, Publish, BatchAudit, BatchPublish, Watchdog
- ⭐ 统一批量操作Worker(5个): PriceUpdate, InventoryUpdate, VoucherCodeImport, ItemBatchEdit, (未来可扩展更多)
- 供应商同步Worker(4个): SupplierPull, SupplierPush, SyncMonitor, DataClean
- 数据同步Worker(5个): CacheSync, ESSync, Reconciliation, Statistics, Notification
- 配置管理Worker(1个): ConfigPublish
- 事件发布Worker(2个): OutboxPublisher, DeadLetterQueue
- 数据维护Worker(4个): DataArchive, TableSharding, DeletedTableCleanup, DataCleanup
共计:27个Worker类型
9.9.2 关键特点
- ✅ 品类无关:所有Worker支持多品类(通过category_id路由)
- ✅ 可扩展:新品类接入无需修改Worker代码
- ✅ 高可用:核心Worker多副本部署
- ✅ 可监控:每个Worker都有Prometheus指标
- ✅ 可恢复:超时重试 + 看门狗监控
- ✅ 可追踪:完整的事件链路追踪
- ✅ 可降级:支持降级策略和熔断保护
- ✅ ⭐ 统一批量框架:所有批量操作共享表结构、处理流程、监控指标,代码复用率80%
9.9.3 统一批量操作框架优势
| 优势维度 | 具体收益 |
|---|---|
| 开发效率 | 新批量操作从2周开发降至2天(仅需实现业务逻辑) |
| 代码质量 | 统一框架经过充分测试,减少bug |
| 用户体验 | 所有批量操作统一交互:进度条、结果下载、错误提示 |
| 运维监控 | 统一指标:operation_batch_task_total、operation_batch_duration |
| 审计追溯 | 所有批量操作before/after完整记录 |
| 资源优化 | 流式处理 + Worker Pool统一调优,内存占用降低90% |
十、业界最佳实践参考
10.1 淘宝/天猫
- 强模板约束:不同类目不同发布模板,必填项严格校验。
- 分阶段发布:草稿 → 待审核 → 审核通过 → 定时上架 → 已上线。
- AI 图片审核:AI + 人工双重审核,识别违规图片。
- 定时上架:支持定时自动上架,营销活动同步上线。
10.2 京东
- 三级审核:自动审核 → 算法审核(价格异常检测、重复商品识别) → 人工审核。
- 商品池概念:草稿池 → 待审核池 → 在售池 → 下架池。
- 快速通道:VIP 商家快速审核通道。
- 实时监控:异常自动下架。
10.3 Amazon
- ASIN 去重:自动生成全球唯一商品标识,防止重复上架。
- 商品质量评分:图片/标题/描述完整度评分,引导商家优化。
- Buy Box 算法:多卖家同一商品,算法决定展示归属。
- API 接入:Seller Central 表单 + MWS/SP-API 双通道。
10.4 本设计借鉴点
| 借鉴来源 | 应用方式 |
|---|---|
| 淘宝:强模板 + 定时上架 | 品类校验规则引擎 + 定时发布 |
| 京东:三级审核 + 商品池 | 自动/人工审核 + 状态机管理 |
| Amazon:质量评分 + API 接入 | 数据完整度校验 + 供应商/API 双模式 |
| Shopee:本地化 + 快速上架 | 多国家模板 + 供应商快速通道 |
十一、新品类接入指南:四步零代码接入
核心优势:得益于统一模型 + 策略模式设计,新品类接入只需配置,核心代码无需修改。
11.1 接入检查清单
| 检查项 | 需要确定的内容 | 配置方式 |
|---|---|---|
| 品类基础信息 | 品类ID、名称、父类目、属性字段 | category_tab + category_attribute_tab |
| 数据来源 | 供应商/运营/商家/API | listing_audit_config_tab |
| 审核策略 | 免审核/自动审核/人工审核/快速通道 | listing_audit_config_tab |
| 校验规则 | 必填项、格式、范围、业务规则 | 实现ValidationRule接口 |
| 库存模型 | (ManagementType, UnitType) | inventory_config |
| 价格模型 | 固定价/日历价/动态定价 | sku_tab.price + 动态规则 |
| 供应商对接 | Push/Pull/不需要 | 注册SupplierSyncStrategy |
11.2 完整示例:接入”演唱会门票”品类
Step 1: 创建品类和属性
1 | -- 1. 创建品类(三级类目) |
Step 2: 配置审核策略(多数据来源)
1 | -- 3. 配置审核策略(支持多种数据来源) |
Step 3: 注册校验规则
1 | // 4. 注册演唱会特有校验规则 |
Step 4: 配置供应商对接(可选)
1 | // 5. 如果需要对接供应商,注册同步策略 |
Step 5: 验证接入(完整流程测试)
1 | func TestConcertTicketFlow(t *testing.T) { |
11.3 接入总结
| 步骤 | 工作量 | 是否需要改核心代码 | 预估时间 |
|---|---|---|---|
| 创建品类和属性 | SQL配置 | ❌ 无需 | 30分钟 |
| 配置审核策略 | SQL配置 | ❌ 无需 | 15分钟 |
| 注册校验规则 | Go代码实现ValidationRule接口 | ✅ 需要(业务逻辑) | 2-3天 |
| 配置供应商对接 | Go代码注册+配置 | ✅ 可选(有供应商时) | 2-3天 |
| 编写单元测试 | Go测试代码 | ✅ 需要 | 1天 |
| 核心流程代码 | - | ❌ 零修改 | - |
| Worker代码 | - | ❌ 零修改 | - |
| 状态机代码 | - | ❌ 零修改 | - |
| 数据模型 | - | ❌ 零修改 | - |
时间对比:
- 传统方式(独立开发):3-4周开发 + 2周测试 = 1.5个月
- 统一系统(策略接入):2天配置 + 3天开发校验规则 + 2天测试 = 1周
- 效率提升 6倍
关键优势:
- ✅ 统一状态机、Worker、Kafka事件、数据模型等核心代码完全复用
- ✅ 只需实现品类特有的业务规则(校验、转换、发布步骤)
- ✅ 运营后台自动支持新品类(基于category_id路由)
十二、设计总结
12.1 核心设计决策
| 决策 | 选择 | 原因 | 多品类支持 |
|---|---|---|---|
| 统一 vs 独立流程 | 统一状态机 + 策略模式 | 复用流程,新品类零核心代码修改 | ✅ 支持7+品类 |
| 同步 vs 异步 | API 层同步创建任务,审核/发布异步 Worker | 快速响应 + 后台可靠处理 | ✅ 适用所有品类 |
| 供应商对接 | Push + Pull 双模式 | 适配不同供应商实时性需求 | ✅ Movie用Push, Hotel用Pull |
| 审核策略 | 数据来源驱动(供应商/运营/商家) | 灵活控制审核流程,同一品类不同来源不同策略 | ✅ 适配所有品类 |
| 并发控制 | 乐观锁 + 唯一索引 | 轻量级,无分布式锁开销 | ✅ 品类无关 |
| 故障恢复 | 看门狗 + 自动重试 | 超时/卡住任务自动恢复 | ✅ 品类无关 |
| ⭐ 批量操作 | 统一批量操作框架(operation_batch表) | 所有批量操作统一管理,代码复用80% | ✅ 支持所有批量操作 |
| 批量处理 | Worker Pool + 分批事务 | 控制并发 + 保证一致性 | ✅ 支持跨品类批量 |
| 分布式事务 | Saga + 本地消息表 | 保证最终一致性 | ✅ 品类无关 |
12.2 多品类统一成果
已接入品类:
- ✅ 电子券 (Deal) - 券码制
- ✅ 虚拟服务券 (OPV) - 数量制
- ✅ 酒店 (Hotel) - 时间维度 + 供应商Pull
- ✅ 电影票 (Movie) - 座位制 + 供应商Push
- ✅ 话费充值 (TopUp) - 无限库存
- ✅ 礼品卡 (Giftcard) - 券码制/无限
- ✅ 本地生活套餐 - 组合型
新品类接入效率:
- 传统方式:3-4周开发 + 2周测试 = 1.5个月
- 统一系统:2天配置 + 3天开发校验规则 + 2天测试 = 1周
- 效率提升 6倍
代码复用率:
- 状态机代码:100%复用(所有品类共享)
- Worker代码:100%复用(所有品类共享)
- Kafka事件:100%复用(所有品类共享)
- 数据模型:95%复用(仅item_data JSON不同)
- 运营工具:100%复用(批量编辑、价格调整、库存管理)
- ⭐ 批量操作框架:80%复用(统一表结构、处理流程、监控指标)
- 业务规则:0%复用(品类差异,需各自实现)
12.3 统一 vs 差异化平衡
1 | ┌─────────────────────────────────────────────────────────────────┐ |
12.4 业务规模与性能
| 指标 | 数值 | 说明 | 品类 |
|---|---|---|---|
| 已接入品类数 | 7+ | 电子券/酒店/电影/充值/礼品卡/服务券/套餐 | - |
| 日均上架量 | 50,000+ | 含供应商同步 + 运营批量 + 商家单品 | 全品类 |
| 上架成功率 | > 95% | 全品类平均 | 全品类 |
| 平均上架时长 | < 5分钟 | 人工审核品类 | 商家上传品类 |
| 批量处理速度 | 100-200条/分钟 | Excel批量导入 | 全品类 |
| 供应商同步延迟 | < 5分钟 | Pull模式平均 | Hotel/E-voucher |
| 供应商实时同步 | < 500ms | Push模式 | Movie |
12.5 成本与收益
12.5.1 开发成本节约
| 项目 | 独立开发(7个品类) | 统一系统 | 节约 |
|---|---|---|---|
| 初期开发 | 7 × 2个月 = 14人月 | 4个月(含框架) | 10人月 |
| 新品类接入 | 2个月/品类 | 1周/品类 | 节约87.5% |
| 维护成本 | 7套系统独立维护 | 1套系统统一维护 | 节约85% |
12.5.2 运营效率提升
| 优化点 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 批量价格调整 | 逐个修改 | Excel批量 | 100倍 |
| 券码导入 | 30分钟/万条 | 2分钟/万条 | 15倍 |
| 跨品类操作 | 切换多个系统 | 统一后台 | 体验提升 |
| 首页配置发布 | 热Key问题 | 分散+CDN | QPS提升100倍 |
12.5.3 统一批量操作框架ROI分析
开发成本节约:
| 项目 | 分散实现(每种批量操作) | 统一框架 | 节约 |
|---|---|---|---|
| 初期开发 | 3种批量操作 × 2周 = 6周 | 框架4周 + 业务1周 = 5周 | 节约17% |
| 新增批量操作 | 2周/种 | 2天/种 | 节约86% |
| 维护成本 | 3套代码独立维护 | 1套框架统一维护 | 节约67% |
| Bug修复 | 需要在3处修复 | 仅需修复框架1处 | 效率提升3倍 |
| 功能增强 | 需要在3处实现 | 仅需增强框架1处 | 效率提升3倍 |
运营效率提升:
| 指标 | 统一前 | 统一后 | 收益 |
|---|---|---|---|
| 批量操作可追溯性 | 仅33%操作可追溯 | 100%操作可追溯 | 审计合规 |
| 批量操作进度可见 | 仅33%操作有进度 | 100%操作有进度 | 用户满意度提升 |
| 批量操作结果下载 | 仅33%操作有结果文件 | 100%操作有结果文件 | 问题定位效率提升 |
| 批量操作性能 | 1000条需30秒,大量数据易超时 | 10000条仅需5分钟,稳定 | 支持10倍数据量 |
用户体验提升:
1 | 统一前(不一致体验): |
系统收益:
| 收益维度 | 具体收益 | 量化指标 |
|---|---|---|
| 代码质量 | 框架代码经过充分测试,bug率降低 | 缺陷率从0.5%降至0.1% |
| 系统稳定性 | 统一监控告警,问题发现更快 | MTTR从2小时降至30分钟 |
| 扩展性 | 新增批量操作成本降低 | 从2周降至2天(7倍提升) |
| 维护成本 | 一处修改,所有批量操作受益 | 维护成本降低67% |
| 运维效率 | 统一监控指标,统一告警规则 | 运维效率提升50% |
附录:相关文档
系列导航
本系列全部文章索引,详见(一)全景概览与领域划分。