S2B2C 电商平台架构实践:支撑百万级用户的技术选型与演进
S2B2C(Supply to Business to Consumer)是一种典型的 ToB 电商模式。本文将分享我负责的鲸旦电商平台的技术架构实践,如何从 0 到 1 构建并支撑百万级用户规模。
业务模式理解
S2B2C 的核心是 供应链赋能小B,小B服务C端用户:
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 供应商S │ → │ 小B商家 │ → │ C端用户 │
│ (平台) │ │ (分销商) │ │ (消费者) │
└─────────┘ └─────────┘ └─────────┘
│ │ │
供货管理 店铺运营 购买消费
统一结算 分销获利 售后服务
技术挑战
- 多租户架构:每个小B都是独立店铺
- 分润结算:复杂的多级分销结算
- 库存同步:供应商库存与小B库存联动
- 流量高峰:大促期间的并发压力
系统架构
整体技术栈
| 层级 | 技术选型 |
|---|---|
| 前端 | UniApp(多端统一) |
| 网关 | Spring Cloud Gateway |
| 服务 | Spring Cloud + Nacos |
| 存储 | MySQL + Redis + ES |
| 消息 | RabbitMQ |
| 部署 | Docker + Jenkins |
核心服务拆分
┌────────────────────────────────────────────────┐
│ API Gateway │
└───────────────────────┬────────────────────────┘
│
┌─────────┬───────────┼───────────┬─────────┐
▼ ▼ ▼ ▼ ▼
┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐
│用户 │ │商品 │ │订单 │ │支付 │ │结算 │
│服务 │ │服务 │ │服务 │ │服务 │ │服务 │
└──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘
│ │ │ │ │
└────────┴──────────┴──────────┴─────────┘
│
┌────────┴────────┐
▼ ▼
┌────────┐ ┌────────┐
│ MySQL │ │ Redis │
│ 集群 │ │ 集群 │
└────────┘ └────────┘
核心设计方案
1. 多租户店铺隔离
采用 共享数据库 + 租户ID隔离 方案:
// 租户上下文
public class TenantContext {
private static final ThreadLocal<Long> TENANT_ID = new ThreadLocal<>();
public static void setTenantId(Long tenantId) {
TENANT_ID.set(tenantId);
}
public static Long getTenantId() {
return TENANT_ID.get();
}
}
// MyBatis 拦截器自动注入租户条件
@Intercepts({@Signature(type = Executor.class, method = "query", ...)})
public class TenantInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) {
// 自动添加 tenant_id 条件
appendTenantCondition(invocation);
return invocation.proceed();
}
}
2. 分润结算系统
分销场景下的分润计算:
商品售价 100 元
├── 平台服务费: 5% → 5 元
├── 供应商成本: 60% → 60 元
├── 一级分销: 20% → 20 元
└── 二级分销: 15% → 15 元
关键设计:
- 实时预览:下单时展示预计收益
- 延迟结算:确认收货后 T+7 结算
- 对账机制:每日自动对账 + 异常告警
3. 库存同步方案
供应商库存与小B展示库存的同步:
┌──────────────┐ ┌──────────────┐
│ 供应商库存 │ ←→ │ 平台库存 │
│ (实际库存) │ │ (可分配库存) │
└──────────────┘ └───────┬──────┘
│
┌───────────────────┼───────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ 店铺A库存 │ │ 店铺B库存 │ │ 店铺C库存 │
│ (展示库存)│ │ (展示库存)│ │ (展示库存)│
└──────────┘ └──────────┘ └──────────┘
采用 预占 + 异步扣减 策略:
- 下单时预占库存(Redis 原子操作)
- 支付成功后异步扣减实际库存
- 超时未支付自动释放预占
4. 高并发应对
大促场景下的技术保障:
| 策略 | 实现方式 |
|---|---|
| 热点缓存 | Redis 集群 + 本地缓存二级架构 |
| 限流降级 | Sentinel 流控 + 熔断 |
| 异步削峰 | 下单消息队列削峰 |
| 读写分离 | MySQL 主从 + 读库路由 |
多端统一开发
使用 UniApp 实现一套代码多端运行:
UniApp 代码
│
├── 编译 → 微信小程序
├── 编译 → H5 网页
├── 编译 → App(iOS/Android)
└── 编译 → 支付宝小程序
优势:
- 开发效率提升 60%+
- UI 一致性保证
- 维护成本降低
运营数据
平台上线后的核心指标:
| 指标 | 数据 |
|---|---|
| 入驻商家 | 2000+ |
| 注册用户 | 100万+ |
| 日均订单 | 3万+ |
| 峰值 QPS | 5000+ |
| 系统可用性 | 99.95% |
经验总结
- 业务理解优先:S2B2C 的核心是赋能小B,技术要服务于这个目标
- 分步演进:先跑通业务闭环,再优化性能和架构
- 数据驱动:用数据指导技术决策,而非凭感觉
- 标准化能力:把通用能力沉淀为平台能力,降低边际成本
电商平台的技术挑战不仅在于高并发,更在于复杂业务逻辑的正确实现和持续演进能力。