跳至主要內容

中台架构:业务、数据、技术中台的实践与反思

郑天祺大约 7 分钟架构设计中台架构技术中台

前言

互联网大厂经常提起"中台战略":

  • 阿里:打造"大中台、小前台"架构
  • 字节:建设业务中台赋能多条产品线
  • 腾讯:建立数据中台支撑决策

但什么是中台?为什么要建设中台?中台容易踩的坑有哪些?

本文从实践出发,深入讲解三类中台的架构设计与常见陷阱。


一、中台的本质

1.1 问题:前台业务爆炸式增长

初期(单一产品):
┌─────────────┐
│  前台应用1  │
│ (购物App)   │
└─────────────┘
       │
    ┌──▼───┐
    │ 后台  │
    │(单体) │
    └──────┘

后期(多条产品线):
┌──────────┐┌──────────┐┌──────────┐┌──────────┐
│App 1 购物 ││App 2 直播││App 3 外卖││App 4 旅游│
│(iOS/And) ││(iOS/Web) ││(iOS/And) ││(iOS/Web) │
└────┬─────┘└────┬─────┘└────┬─────┘└────┬─────┘
     │           │           │           │
     └───────────┼───────────┼───────────┘
                 │           │
          ┌──────▼───────────▼─────┐
          │  后台(变成巨人)      │
          │  ├─ 用户系统          │
          │  ├─ 订单系统          │
          │  ├─ 支付系统          │
          │  ├─ 库存系统          │
          │  ├─ 推荐系统          │
          │  ├─ ...(50+个模块)  │
          │  └─ 复杂度爆炸!      │
          └──────────────────────┘

问题:
  ├─ 每个App都要对接50+个后端模块
  ├─ 修改一个模块要测试所有App(回归成本高)
  ├─ 新App开发周期长(集成工作量大)
  ├─ 技术债快速积累
  └─ 人员膨胀但效率下降

1.2 中台的解决方案

中台思想:从后台的混乱中提取通用能力

┌──────────┐┌──────────┐┌──────────┐┌──────────┐
│App 1     ││App 2     ││App 3     ││App 4     │
└────┬─────┘└────┬─────┘└────┬─────┘└────┬─────┘
     │           │           │           │
     └───────────┼───────────┼───────────┘
                 │
          ┌──────▼──────────────┐
          │   中台API网关       │
          │ (统一入口、认证、限流)
          └──────┬──────────────┘
                 │
   ┌─────────────┼─────────────┐
   │             │             │
┌──▼────────┐┌──▼────────┐┌──▼──────┐
│业务中台   ││数据中台   ││技术中台 │
│├─用户服务 ││├─数据仓库 ││├─日志  │
│├─订单服务 ││├─BI分析  ││├─监控  │
│├─支付服务 ││├─推荐引擎││├─消息队列
│└─库存服务 ││└─数据资产││└─配置中心
└──────────┘└───────────┘└─────────┘

优势:
  ├─ 各App只需对接中台,不需关心底层细节
  ├─ 中台统一维护,各App无需重复开发
  ├─ 中台升级自动惠及所有App(无需改App)
  ├─ 新App快速集成(只需调中台API)
  └─ 技术债相对隔离

二、业务中台

2.1 定义与目标

业务中台:提供高度抽象、复用度高的业务能力

不同App可能都需要:
  ├─ 用户系统(注册、登录、会员、等级)
  ├─ 订单系统(下单、支付、履约、评价)
  ├─ 营销系统(优惠券、积分、推荐)
  └─ 库存系统(库存查询、扣减、预留)

这些能力 → 中台化 → 所有App共享

2.2 架构设计

┌─────────────────────────────┐
│  前台(各个应用)           │
│  购物App  直播App  外卖App  │
└──────────────┬──────────────┘
               │ HTTP/gRPC
        ┌──────▼──────────┐
        │  BFF层          │
        │ (Backend for    │
        │  Frontend)      │
        │ ├─聚合           │
        │ ├─格式转换       │
        │ └─权限检查       │
        └──────┬──────────┘
               │
        ┌──────▼──────────────┐
        │  业务中台服务       │
        │  ├─ User Service   │
        │  ├─ Order Service  │
        │  ├─ Marketing      │
        │  └─ Inventory      │
        └──────┬──────────────┘
               │
        ┌──────▼──────────────┐
        │  基础能力          │
        │  ├─认证授权        │
        │  ├─配置中心        │
        │  ├─消息队列        │
        │  └─缓存            │
        └────────────────────┘

2.3 案例:订单中台

# 订单中台提供的通用API

class OrderService:
    """订单中台服务"""
    
    async def create_order(self, request: CreateOrderRequest) -> Order:
        """
        创建订单(支持多种业务场景)
        
        request: {
            "business_type": "shopping|takeout|travel",  # 业务线
            "user_id": "u123",
            "items": [...],
            "total_price": 100,
            "delivery_address": "...",  # 仅外卖需要
            "travel_date": "2024-06-20",  # 仅旅游需要
        }
        """
        # 中台在这里处理所有通用逻辑
        ├─ 检查库存(统一的库存系统)
        ├─ 调用支付服务(统一的支付平台)
        ├─ 记录订单日志(统一的审计系统)
        └─ 发送通知(统一的消息服务)
        
        # 各App不需要重复实现这些
    
    async def pay_order(self, order_id: str) -> PaymentResult:
        """支付订单"""
        pass
    
    async def confirm_delivery(self, order_id: str) -> None:
        """确认收货"""
        pass
    
    async def get_order_history(self, user_id: str) -> List[Order]:
        """获取订单历史"""
        pass

# 购物App使用中台订单服务
class ShoppingController:
    def __init__(self, order_service: OrderService):
        self.order_service = order_service
    
    @app.post("/order/create")
    async def create_order(self, request: dict):
        # 购物App调用中台API
        order = await self.order_service.create_order(
            CreateOrderRequest(
                business_type="shopping",
                user_id=request['user_id'],
                items=request['items'],
                total_price=request['total_price']
            )
        )
        return {"order_id": order.id, "status": order.status}

# 外卖App使用同一个中台订单服务
class TakeoutController:
    def __init__(self, order_service: OrderService):
        self.order_service = order_service
    
    @app.post("/order/create")
    async def create_order(self, request: dict):
        # 外卖App调用同一个中台API(仅多传delivery_address)
        order = await self.order_service.create_order(
            CreateOrderRequest(
                business_type="takeout",
                user_id=request['user_id'],
                items=request['items'],
                total_price=request['total_price'],
                delivery_address=request['delivery_address']
            )
        )
        return {"order_id": order.id, "status": order.status}

三、数据中台

3.1 定义与目标

数据中台:统一采集、加工、管理数据,为各个应用提供数据服务

传统方式:
  购物App → 自己建数据仓库
  直播App → 自己建数据仓库
  外卖App → 自己建数据仓库
  
  问题:数据重复、口径不一致、数据孤岛

数据中台方式:
  所有App → 上报到统一的数据中台
         ↓
      数据湖(原始数据)
         ↓
      数据仓库(加工)
         ↓
      数据应用
         ├─ BI分析
         ├─ 实时大屏
         ├─ 推荐引擎
         └─ 风险控制

3.2 架构

┌─────────────────┐
│  各个应用       │
│ 上报业务事件    │
└────────┬────────┘
         │
    ┌────▼────────┐
    │ 消息队列    │
    │ (Kafka)     │
    └────┬────────┘
         │
    ┌────▼──────────────┐
    │ 数据湖             │
    │ (HDFS/S3/HBase)   │
    │ 原始数据存储       │
    └────┬──────────────┘
         │
    ┌────▼──────────────┐
    │ 数据加工           │
    │ (Spark/Flink)      │
    │ ├─ 清洗            │
    │ ├─ 去重            │
    │ ├─ 聚合            │
    │ └─ 特征工程        │
    └────┬──────────────┘
         │
    ┌────▼──────────────┐
    │ 数据仓库           │
    │ (MySQL/Presto)     │
    │ 标准化数据         │
    └────┬──────────────┘
         │
    ┌────┴─────┬─────────┬──────┐
    ▼          ▼         ▼      ▼
   BI       实时大屏  推荐      风控
  分析      报表      引擎      模型

3.3 数据指标体系

# 数据中台定义的标准指标

class MetricsDefinition:
    """
    统一的数据指标定义,所有App都用同一套口径
    """
    
    # DAU (Daily Active Users)
    DAU = """
    SELECT COUNT(DISTINCT user_id) FROM events
    WHERE event_date = DATE(NOW()) - 1 AND event_type IN ('view', 'click', 'order')
    """
    
    # 转化率 (User to Order)
    conversion_rate = """
    SELECT COUNT(DISTINCT order_user) / COUNT(DISTINCT view_user)
    FROM (
        SELECT DISTINCT user_id as view_user FROM events WHERE event_type = 'view'
        UNION
        SELECT DISTINCT user_id as order_user FROM events WHERE event_type = 'order'
    ) t
    """
    
    # ARPU (Average Revenue Per User)
    ARPU = """
    SELECT SUM(amount) / COUNT(DISTINCT user_id)
    FROM orders WHERE order_date = DATE(NOW()) - 1
    """
    
    # LTV (Lifetime Value)
    LTV = """
    SELECT user_id, SUM(amount)
    FROM orders WHERE user_id = %s
    GROUP BY user_id
    """

# 所有App都遵循这套指标体系
# 无需各自定义,数据口径统一

四、技术中台

4.1 定义与目标

技术中台:提供可复用的基础技术能力,降低各应用的技术复杂度

各个应用都需要:
  ├─ 日志收集、存储、查询
  ├─ 监控告警、性能分析
  ├─ 分布式追踪(链路追踪)
  ├─ 配置管理
  ├─ 消息队列
  ├─ 缓存、限流、熔断
  ├─ 灰度发布、A/B测试
  └─ 容器化、自动扩容

这些 → 中台化 → 所有App共享

4.2 常见技术中台组件

┌──────────────────────────────┐
│     技术中台                 │
├──────────────────────────────┤
│ 可观测性                      │
│  ├─ 日志:ELK Stack          │
│  ├─ 监控:Prometheus+Grafana │
│  └─ 链路:Jaeger/SkyWalking  │
│                              │
│ 流量管理                      │
│  ├─ API网关:Kong/Envoy     │
│  ├─ 限流:算法服务          │
│  └─ 路由:Istio              │
│                              │
│ 数据流                        │
│  ├─ MQ:Kafka/RocketMQ       │
│  ├─ CDC:Debezium            │
│  └─ 流处理:Flink            │
│                              │
│ 稳定性保障                    │
│  ├─ 熔断降级:sentinel       │
│  ├─ 灰度发布:蓝绿部署       │
│  ├─ 容灾演练:混沌工程       │
│  └─ 自动扩容:K8s HPA        │
│                              │
│ 开发运维                      │
│  ├─ CI/CD:Jenkins/GitLab    │
│  ├─ 版本管理:Harbor/Artifactory
│  ├─ 配置中心:Nacos/Apollo   │
│  └─ 服务网格:Istio          │
└──────────────────────────────┘

五、中台建设的常见陷阱

5.1 陷阱1:为了中台而中台

问题:
  公司只有2-3个App,但搭建了庞大的中台
  ├─ 增加了架构复杂度
  ├─ 维护成本高
  └─ 得不到投资回报

警示:
  中台适用于 > 5个相关业务线的场景
  否则过度工程(Over-Engineering)

5.2 陷阱2:中台过度集中

问题:
  所有App都依赖中台
  中台故障 → 所有App故障

解决:
  ├─ 中台高可用设计
  ├─ App降级预案(无中台可继续工作)
  └─ 灰度策略(新功能先在部分App上线)

5.3 陷阱3:中台API设计不合理

问题:
  为了通用性,API参数过多,逻辑复杂
  
  OrderService.create_order(
    business_type, user_id, items, total_price,
    delivery_address, delivery_time,
    travel_date, travel_duration,
    ...(20+个参数)
  )

解决:
  ├─ 基于业务场景的API
  ├─ 参数分离(通用+定制)
  └─ 版本管理(v1/v2/v3)

5.4 陷阱4:忽视前台创新

问题:
  过度投入中台,忽视前台需求
  ├─ 各App功能受限
  ├─ 产品竞争力下降
  └─ 用户体验受影响

平衡:
  ├─ 中台 60% 投入
  ├─ 前台 40% 投入
  └─ 定期回顾,调整比例

六、中台成熟度模型

L0: 无中台
    ├─ 各App各自为战
    ├─ 重复开发多
    └─ 技术债快速积累

L1: 初级中台(存在但不完整)
    ├─ 用户、订单中台存在
    ├─ 其他模块仍散落各处
    └─ 集成成本仍较高

L2: 正式中台(较为完整)
    ├─ 业务中台完整
    ├─ 数据中台初具规模
    ├─ 技术中台覆盖基础服务
    └─ 大多数App通过中台开发

L3: 高级中台(智能化)
    ├─ 中台自动化运维
    ├─ 数据智能应用(推荐、预测)
    ├─ 一键App发布
    └─ 新App从0-1在1个月内

L4: 超级中台(生态化)
    ├─ 开放API给第三方开发者
    ├─ 形成开发者生态
    ├─ 中台成为核心竞争力
    └─ 支持千级应用

总结

维度业务中台数据中台技术中台
目标复用业务能力统一数据资产降低技术复杂度
核心微服务数据仓库基础设施
投入
见效快(3-6月)慢(6-12月)中(3-6月)
风险过度集中数据延迟性能瓶颈

何时建中台

  • ✓ 多条产品线、相似需求
  • ✓ 业务快速增长、人力受限
  • ✓ 技术债务多、重复开发高
  • ✗ 业务线少于3个
  • ✗ 创业初期(先活着,再优化)

黄金法则

  1. 按需而建:先有需求,再建中台
  2. 循序渐进:从业务中台开始,逐步完善
  3. 持续进化:中台不是一成不变的,要随业务演进
  4. 监控ROI:定期评估中台的投入产出比
上次编辑于:
贡献者: zhengtianqi