- 淘宝总体架构演进与单元化设计
- LAMP 单体 早期 Linux+Apache+MySQL+PHP。痛点:代码耦合严重,单点故障,数据库成为瓶颈。
- SOA 服务化 引入 WebLogic/ESB。痛点:ESB 成为中心瓶颈,重量级中间件难以横向扩展。
- 分布式微服务 发起“去 IOE”运动。自研 HSF、TDDL、Diamond,全面转向 Java 轻量级微服务,实现水平扩展。
- 中台化战略 沉淀业务中台(交易、会员、营销)与数据中台(OneData),实现“大中台,小前台”,支持快速创新。
- 云原生与单元化 全面上阿里云。实施 异地多活 和 单元化 (Cell-based) 架构,实现极致弹性与容灾。
- 前端多端架构与工程化体系
- Rax 框架 兼容 React 语法,通过 Driver 机制适配不同端。Web 端渲染 DOM,Native 端通过 Weex 渲染原生组件,小程序端渲染 AXML。
- 动态化 DinamicX 自研动态化框架。将 UI 描述文件(XML/JSON)和逻辑脚本下发到客户端动态渲染,绕过应用商店审核,实现分钟级发版。
- 小程序双线程 逻辑层(JSCore)与渲染层(WebView)分离,通过 JSBridge 通信。保证安全性的同时,通过预加载和缓存机制优化首屏体验。
- JS 沙箱隔离: 使用 Proxy 或快照机制,防止子应用全局变量污染。
- CSS 隔离: 通过 Shadow DOM 或 BEM 命名空间前缀(如
.taobao-header_)防止样式冲突。 - 公共依赖加载: 提取 React/Vue 等公共库,通过 CDN 预加载,减少子应用重复打包体积。
- 后端微服务治理与中间件底层原理
- 网络层 基于 Netty 实现 NIO 异步通信,采用自定义协议或 HTTP/2 (Triple 协议)。
- 序列化 默认使用 Hessian2,追求极致性能时切换为 Protobuf 或 Fury(新一代高性能序列化)。
- 负载均衡 支持 Random、RoundRobin、LeastActive(最少活跃调用数)以及 P2C (Power of Two Choices) 算法。
- 高并发处理、多级缓存与一致性保障
- Cache Aside 先更新数据库,再删除缓存。配合重试机制保证删除成功。
- 延迟双删 先删缓存 -> 更新数据库 -> 休眠N毫秒 -> 再删缓存。解决读写并发导致的脏数据。
- Binlog 异步订阅 (终极方案): 使用 Canal 监听 MySQL Binlog,解析后发送 MQ,由专门的消费者异步更新/删除缓存。实现业务代码零侵入,保证最终一致性。
- 分布式数据库、大数据与实时计算
- 路由策略 通常按
buyer_id % 库数分库,按buyer_id % 表数分表。保证同一买家的订单在同一物理库,方便事务处理。 - 分布式 ID 采用 Snowflake(雪花算法)变种,结合 Redis 或 Leaf 号段模式,保证全局唯一且趋势递增,有利于 B+ 树索引。
- 离线计算 MaxCompute (ODPS):处理 EB 级离线数据,支撑 T+1 报表与离线模型训练。
- 实时计算 (Flink/Blink): 阿里深度定制 Flink。实现毫秒级延迟的实时数仓,用于双11大屏、实时风控、个性化推荐。支持状态后端 (RocksDB) 和 Checkpoint 机制保证 Exactly-Once。
- 数据湖 基于 Hudi/Iceberg 构建湖仓一体架构,实现批流一体,简化数据开发链路。
- 搜索引擎与个性化推荐系统架构
- 架构设计 采用 QRS (Query Result Searcher) 和 Searcher 两层架构。QRS 负责解析查询、分发请求、合并结果;Searcher 负责倒排索引查询和打分。
- 索引构建 支持全量构建和增量构建(基于 Swift 消息队列)。增量数据秒级生效,保证新上架商品能被立刻搜到。
- 召回与排序 支持多路召回(文本、向量、图)。排序阶段引入深度学习模型(如 DIN, DIEN),实现 CTR(点击率)和 CVR(转化率)的精准预估。
- 召回 (Match): 从亿级商品中快速筛选出几千个候选集。采用协同过滤、双塔模型、图神经网络 (GraphSAGE) 等多路召回。
- 粗排 (Pre-ranking): 使用轻量级模型(如双塔或浅层 DNN)对几千个商品进行快速打分,筛选出几百个。
- 精排 (Ranking): 使用复杂的深度模型(如多目标优化 MMoE),综合考虑点击、收藏、加购、购买等多个目标,进行精准打分。
- 重排 (Re-ranking): 考虑业务规则(如打散同类目、广告插入、新品扶持),调整最终展示顺序。
- 核心教程:商品中心模型与价格引擎
- 核心教程:交易状态机与分布式事务
- 支付系统收到银行回调,执行本地事务更新支付单状态。
- 支付系统发送一条“半消息”到 RocketMQ。
- 支付系统向 MQ 发送 Commit 确认。
- 订单系统消费该消息,更新订单状态为“已支付”。
- 若订单系统消费失败,RocketMQ 会进行重试;若多次重试仍失败,进入死信队列,由人工或定时任务补偿。
- 高并发实战教程:秒杀系统防超卖设计
- 前端拦截 按钮点击后置灰、动态生成验证码、请求 URL 动态化(防止脚本提前抓包请求)。
- 网关拦截 基于 IP/用户 ID 的限流(令牌桶算法)、黑名单过滤、风控拦截(识别机器刷单)。
- 服务层拦截 内存标记: 当 Redis 中库存扣完后,在 JVM 内存中设置一个 boolean 标记。后续请求直接判断内存标记返回“售罄”,不再请求 Redis,保护缓存。
- 安全风控、反作弊与数据安全
- 设备指纹 采集设备硬件信息、网络环境、传感器数据,生成唯一设备 ID。识别模拟器、多开、改机工具。
- 生物探针 采集用户滑动屏幕的轨迹、按压力度、打字频率。区分真人与机器脚本。
- 复杂事件处理 (CEP): 基于 Flink CEP,定义规则(如:同一设备 1 分钟内登录 5 个不同账号 -> 触发盗号风险)。实现流式实时计算。
- 业务中台战略与领域驱动设计 (DDD)
- 用户中心 统一账号体系、会员等级、积分资产。
- 交易中心 统一购物车、下单、支付、履约链路。
- 营销中心 统一优惠券、满减、秒杀、红包玩法。
- 战略设计: 划分限界上下文 (Bounded Context)。例如,“商品”在“交易上下文”中只关心价格和库存,在“搜索上下文”中只关心标题和属性。不同上下文通过 API 或事件通信。
- 战术设计: 在代码层面,严格区分领域层(Domain)、应用层(Application)、基础设施层(Infrastructure)。领域层不依赖任何框架,保证核心业务逻辑的纯粹性和可测试性。
- COLA 架构 阿里开源的 COLA (Clean Object-oriented and Layered Architecture) 框架,提供了标准的 DDD 工程脚手架,规范了包结构和依赖方向。
- 可观测性、混沌工程与 DevOps 体系
- Metrics (指标) 使用 Prometheus + Grafana 监控 CPU、内存、QPS、RT、错误率。结合 AIOps 算法进行异常检测和告警收敛,防止“告警风暴”。
- Traces (链路追踪) 鹰眼 (EagleEye) / SkyWalking。在 HTTP Header 或 RPC Context 中传递 TraceId 和 SpanId。当请求超时,一键查看调用拓扑图,精准定位慢 SQL 或超时节点。
- Logs (日志) 统一日志规范(JSON 格式),包含 TraceId。使用 SLS (日志服务) 进行集中采集、索引和查询。实现“通过 TraceId 串联所有相关日志”。
- 随机 Kill 掉某个微服务节点,验证流量是否自动切换。
- 注入网络延迟或丢包,验证熔断降级策略是否生效。
- 模拟数据库主库宕机,验证主从切换和 RTO 指标。
🚀 架构演进的五个核心阶段
淘宝的架构演进是伴随业务量指数级增长而被迫进行的“换引擎”过程:
🏢 单元化架构 (Unitization) 深度解析
单元化是应对双11海量并发的终极武器。其核心思想是将系统按“维度”(通常是买家ID)进行逻辑切片,形成一个个封闭的“单元”。
💡 核心原则:封闭与路由
一个用户的请求,从接入层、应用层到数据层,必须全部路由到同一个物理单元(Cell)内处理。单元之间尽量不跨单元调用,从而将分布式事务降级为单机/单库事务。
路由规则设计
通常采用 buyer_id % 单元数量 的方式将用户分配至不同单元。对于卖家维度或商品维度,通过数据同步工具(如 DTS)将数据冗余到各个单元,或者通过全局索引服务进行跨单元查询。
🔄 异地多活与容灾
采用“多地多中心”部署(如杭州、上海、深圳、张北)。通过 GSLB(全局负载均衡)进行流量调度。当某机房发生故障时,通过修改路由规则,将流量秒级切换至其他机房,实现 RPO=0(数据零丢失),RTO 分钟级。
📱 跨端渲染与多端统一
淘宝需要覆盖 Web、iOS、Android、小程序、车机、IoT 等数十个端。核心策略是“一套核心逻辑,多端差异化渲染”。
🏗️ 巨石应用拆分:微前端
面对淘宝极其复杂的后台和商家端,采用微前端架构(如 icestark / qiankun):
⚡ 极致性能优化与监控
SSR 与流式渲染: 核心页面采用 Node.js (Midway/Egg) 进行 SSR。结合 React 18 的 Streaming SSR,实现首屏骨架屏秒出,后续内容流式填充。
前端监控 (ARMS): 建立从 JS 异常、API 成功率、白屏检测到性能指标(FCP, LCP, CLS)的全链路监控。通过 SourceMap 还原线上报错堆栈。
🔗 RPC 框架:Dubbo / HSF
阿里自研的 HSF(High-Speed Service Framework)及开源的 Dubbo 是微服务通信的基石。
底层通信原理
🛡️ 流量防护:Sentinel
Sentinel 是双11保命的核心组件,提供流量控制、熔断降级、系统负载保护。
// 伪代码:定义限流规则
List
<FlowRule> rules =
new
ArrayList<>(); FlowRule rule =
new
FlowRule(); rule.setResource(
"createOrder"
);
// 资源名
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 基于 QPS 限流
rule.setCount(
2000
);
// 阈值
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
// 匀速排队(漏桶算法)
rules.add(rule); FlowRuleManager.loadRules(rules);
🔄 服务网格 (Service Mesh)
为了解决多语言支持和业务代码侵入问题,淘宝正在向 Service Mesh 演进(如 SofaMesh)。将限流、熔断、路由等治理能力下沉到 Sidecar(边车)代理中,业务容器只需关注业务逻辑,实现真正的语言无关和基础设施化。
🗄️ 多级缓存架构设计
为了应对“读多写少”的极致场景,设计了严密的漏斗型缓存体系:
| 层级 | 技术选型 | 特点与场景 | 容量 |
|---|---|---|---|
| L1 客户端 | LocalStorage / 内存 | 零网络延迟,用于配置、字典数据 | MB 级 |
| L2 边缘/CDN | CDN 节点 / Edge Routine | 静态资源与部分动态接口边缘计算 | TB 级 |
| L3 接入层 | Nginx / 网关本地缓存 | 拦截重复请求,保护后端 | GB 级 |
| L4 分布式 | Tair (兼容 Redis) | 核心热点数据,支持持久化与多数据结构 | PB 级 |
🔄 缓存一致性挑战与解决方案
当数据库更新时,如何保证缓存不出现脏数据?
⚠️ 缓存三大经典问题
穿透:
查询不存在的数据。解法:布隆过滤器拦截 / 缓存空值。
击穿:
热点 Key 过期,并发请求打到 DB。解法:互斥锁 (Redisson) / 逻辑过期。
雪崩:
大量 Key 同时过期。解法:过期时间加随机值 / 多级缓存兜底。
🐳 核心数据库:OceanBase 与 PolarDB
OceanBase: 阿里自研的分布式关系型数据库。原生基于 Paxos 协议实现多副本强一致,采用 LSM-Tree 存储引擎,支持极高的写入吞吐。在双11核心交易链路全面替换 Oracle,实现金融级高可用。
PolarDB 云原生数据库,计算与存储分离。存储层采用分布式共享存储,实现秒级弹性扩容和按量计费。
🔀 分库分表中间件:ShardingSphere / TDDL
对于 MySQL 集群,采用分库分表。核心在于 路由规则 和 分布式 ID。
📊 大数据与实时数仓
🔍 淘宝搜索引擎 (Havenask)
淘宝搜索是典型的“高并发、低延迟、海量数据”场景。底层采用阿里自研的 Havenask (原 HA3) 搜索引擎。
🎯 个性化推荐系统链路
推荐系统(猜你喜欢)是淘宝流量分发的核心。其标准链路包含四个阶段:
📦 SPU 与 SKU 领域模型设计
商品中心是电商的基石。核心在于理清 SPU(标准产品单位)和 SKU(库存量单位)的关系,并处理极其复杂的类目属性。
属性存储方案:EAV vs JSON
早期采用 EAV(Entity-Attribute-Value)模型,将属性拆分为三张表(商品表、属性名表、属性值表)。优点是扩展性极强,缺点是查询时需要大量 Join,性能差。
现代架构(如淘宝)转向 JSON 扩展字段。将非核心搜索属性存储在 MySQL 的 JSON 字段或 ES 中,核心搜索属性同步至 ES。兼顾了灵活性与查询性能。
💰 价格计算引擎设计
淘宝的价格计算极其复杂(涉及原价、折扣、满减、优惠券、跨店津贴、红包、会员价等)。不能硬编码,必须设计为 规则引擎。
// 价格计算引擎伪代码 (责任链模式)
public class
PriceCalculator
{
private
List<PriceRule> rules;
// 规则链
public
PriceResult
calculate
(OrderContext ctx) { PriceResult result =
new
PriceResult(ctx.getOriginalPrice());
for
(PriceRule rule : rules) {
if
(rule.isMatch(ctx)) { result = rule.apply(result, ctx);
// 扣减或打折
} }
return
result; } }
通过配置中心(如 Nacos/Diamond)动态下发规则,运营人员可以在不发版的情况下调整营销玩法。
🔄 订单状态机与分库分表
状态机引擎: 订单流转(创建、待支付、已支付、发货、完成、退款)极其复杂。采用自研状态机引擎(如 COLA StateMachine)管理状态流转,确保状态变更的合法性(如:不能从“已退款”流转到“已发货”)。
订单分片策略
订单表按 buyer_id 进行分库分表。为什么不用 order_id?因为买家查询“我的订单”是最高频场景,按买家分片可以保证一个买家的订单在同一个物理库,避免跨库分页查询。
💳 支付系统与分布式事务
支付是电商最核心的链路,对数据一致性要求极高。
🚨 核心挑战:分布式事务
订单系统(MySQL)、积分系统(MySQL)、支付系统(独立库)分布在不同的微服务中。如何保证“支付成功 -> 订单状态更新 -> 积分增加”的最终一致性?
解决方案:可靠消息最终一致性
📝 T+1 自动化对账
每日凌晨,大数据平台拉取内部订单流水与第三方支付渠道(支付宝/微信)的账单文件。通过 Flink 进行逐笔比对。发现“长款”(我方无,渠道有)或“短款”(我方有,渠道无)时,自动生成差错工单,触发自动退款或补单逻辑。
⚡ 秒杀流量特征与多级拦截
秒杀场景具有“瞬时并发极高(可达百万QPS)、读多写少、库存极少”的特点。核心原则是 “尽量将请求拦截在上游”。
🔒 防超卖核心逻辑:Redis + Lua
超卖是秒杀的致命错误。必须保证“查询库存”和“扣减库存”的原子性。
-- Redis Lua 脚本:保证原子性扣减库存
local
stock =
tonumber
(redis.call(
'get'
, KEYS[
1
]))
if
(stock ==
nil
)
then
return
-1
-- 库存未初始化
end
if
(stock <=
0
)
then
return
-2
-- 库存不足
end
redis.call(
'decr'
, KEYS[
1
])
return
stock -
1
-- 返回剩余库存
📦 异步下单与 MQ 削峰
Redis 扣减成功后,不直接写数据库。而是将订单信息封装成消息,发送到 RocketMQ。后台消费者按照数据库能承受的速率(如 2000 TPS)平滑消费消息,创建订单。实现完美的 削峰填谷。
🛡️ 实时风控引擎 (CEP)
淘宝每天面临数亿次黑灰产攻击(羊毛党、刷单、盗号、恶意爬虫)。风控系统必须具备毫秒级决策能力。
🔐 数据安全与隐私保护
数据脱敏: 在应用层或数据库中间件层,对手机号、身份证、银行卡等敏感信息进行动态脱敏(如 138****1234)。不同权限的员工看到不同级别的脱敏数据。
隐私计算 引入联邦学习和多方安全计算 (MPC)。在不泄露原始数据的前提下,与外部合作伙伴(如银行、物流)进行联合建模,实现“数据可用不可见”。
🏢 业务中台的核心价值
中台不是单纯的技术架构,而是组织架构与业务架构的结合。其核心是将各业务线(淘宝、天猫、闲鱼、聚划算)中 共性的、核心的业务能力 沉淀为共享服务。
🧩 领域驱动设计 (DDD) 落地实践
中台建设极易陷入“大泥球”架构。淘宝全面引入 DDD 进行微服务拆分和代码设计:
👁️ 可观测性 (Observability) 三大支柱
在微服务架构下,系统黑盒化严重。必须建立全方位的可观测性体系:
🐒 混沌工程 (Chaos Engineering)
“不要等故障发生才验证高可用”。引入“Monkey King”等混沌工程平台,在生产或预发环境主动注入故障:
🚀 DevOps 与持续交付
基于云效 (Apsara DevOps) 构建自动化流水线。实现代码提交 -> 静态扫描 (Sonar) -> 单元测试 -> 构建镜像 -> 部署预发 -> 自动化回归测试 -> 灰度发布 -> 全量上线的全链路自动化。采用 金丝雀发布,先切 1% 流量,观察监控无异常后逐步放大。