2016年到2018年是小红书发展史上的关键转折期。这三年间,小红书从一个小众的海外购物分享社区,迅速成长为拥有数千万用户的生活方式平台。月活跃用户从2016年初的不到500万增长到2018年底的超过5000万,增长超过10倍。这种爆发式增长给技术团队带来了前所未有的挑战。
用户增长曲线 (2016-2018)
│
5000万├ ╱╱
│ ╱╱╱╱╱
3000万├ ╱╱╱╱
│ ╱╱╱╱╱
1500万├ ╱╱╱╱╱
│ ╱╱╱╱╱
500万├ ╱╱╱╱╱
│╱╱╱╱
└────────────────────────────────
2016Q1 2016Q3 2017Q1 2017Q3 2018Q1 2018Q3
| 指标 | 2016年初 | 2018年底 | 增长倍数 |
|---|---|---|---|
| MAU | ~500万 | 5000万+ | 10x |
| DAU | ~100万 | 1500万+ | 15x |
| 日均笔记发布 | 5万 | 100万+ | 20x |
| 日均交易订单 | 1万 | 50万+ | 50x |
| 图片存储量 | 10TB | 500TB+ | 50x |
| 技术团队规模 | 50人 | 300人+ | 6x |
这一时期的技术架构经历了三个主要阶段:
2016年春节期间,小红书App因明星入驻和综艺节目推广迎来第一波用户增长高峰。原有的单体架构很快暴露出严重的性能问题:
系统压力分布图 (2016年3月某高峰时段)
┌──────────────────────────────────────────┐
│ 请求入口 (QPS: 5000) │
└────────────┬─────────────────────────────┘
│
┌────────▼────────┐
│ Nginx集群 │ CPU: 40%
│ (4台机器) │
└────────┬────────┘
│
┌────────▼────────┐
│ Python应用层 │ CPU: 95% ← 瓶颈!
│ (8台机器) │ 响应时间: 800ms
└────────┬────────┘
│
┌────────▼────────┐
│ MySQL主库 │ CPU: 85% ← 瓶颈!
│ (1主2从) │ 慢查询: 200+/分钟
└─────────────────┘
主要性能瓶颈包括:
面对数据库压力,技术团队采取了多管齐下的优化策略:
分库分表架构
┌─────────────┐
│ 应用层 │
└──────┬──────┘
│
┌───────────┼───────────┐
│ │ │
分片路由层 分片路由层 分片路由层
│ │ │
┌─────────┼─────────┬─┼─┬─────────┼─────────┐
│ │ │ │ │ │ │
用户库0 用户库1 内容库0 内容库1 订单库0 订单库1
userId%2=0 userId%2=1 hash hash orderId orderId
分片 分片 范围分片 范围分片
核心设计思路:
MySQL读写分离架构
┌──────────────┐
│ 写请求 │
└──────┬───────┘
│
┌──────▼───────┐
│ 主库 │
│ (Master) │
└──┬────────┬──┘
│ │
┌──────────┘ └──────────┐
│ │
┌──────▼───────┐ ┌──────▼───────┐
│ 从库1 │ │ 从库2 │
│ (Slave) │ │ (Slave) │
└──────┬───────┘ └──────┬───────┘
│ │
┌──────▼───────┐ ┌──────▼───────┐
│ 读请求 │ │ 读请求 │
└──────────────┘ └──────────────┘
实施效果:
多级缓存体系
┌─────────────────────────────────────────┐
│ CDN缓存层 │ 命中率: 60%
│ (静态资源、图片) │ TTL: 7天
└────────────────┬────────────────────────┘
│ MISS
┌────────────────▼────────────────────────┐
│ 本地缓存层 │ 命中率: 30%
│ (Guava Cache/Caffeine) │ TTL: 1分钟
└────────────────┬────────────────────────┘
│ MISS
┌────────────────▼────────────────────────┐
│ 分布式缓存层 │ 命中率: 80%
│ (Redis Cluster) │ TTL: 1小时
└────────────────┬────────────────────────┘
│ MISS
┌────────────────▼────────────────────────┐
│ 数据库层 │
│ (MySQL/TiDB) │
└─────────────────────────────────────────┘
随着图片和视频内容的快速增长,CDN建设成为重中之重:
CDN节点分布 (2018年底)
┌──────────────────────────────────────┐
│ 源站集群 │
│ (北京、上海) │
└──────┬───────────────┬───────────────┘
│ │
┌──────▼─────┐ ┌─────▼──────┐
│ 一级节点 │ │ 一级节点 │
│ (8个) │ │ (8个) │
└──────┬─────┘ └─────┬──────┘
│ │
┌──────▼─────────────▼──────┐
│ 二级节点 │
│ (30+个) │
│ 覆盖主要城市 │
└────────────────────────────┘
CDN优化措施:
2016年中,技术团队开始了艰难的微服务化改造。第一步是确定服务拆分的边界和优先级。
服务拆分决策矩阵
高 │ 用户服务 │ 内容服务
业 ───┼───────────┼───────────
务 │ 社交服务 │ 搜索服务
重 │ │
要 中 ├───────────┼───────────
性 │ 数据服务 │ 推荐服务
───┼───────────┼───────────
低 │ 工具服务 │ 管理后台
└───────────┴───────────
低 中 高
技术复杂度
拆分优先级判定标准:
2016年底的服务架构
┌─────────────────────────────────────────────┐
│ API Gateway │
└──────┬──────┬──────┬──────┬──────┬─────────┘
│ │ │ │ │
┌───▼──┐┌──▼───┐┌─▼────┐┌▼─────┐┌▼──────┐
│用户 ││内容 ││社交 ││搜索 ││交易 │
│服务 ││服务 ││服务 ││服务 ││服务 │
└──┬───┘└──┬───┘└──┬───┘└─┬────┘└─┬─────┘
│ │ │ │ │
┌──▼───────▼───────▼──────▼───────▼──────┐
│ 基础服务层 │
│ (消息、存储、缓存、队列等) │
└─────────────────────────────────────────┘
用户服务 (User Service)
内容服务 (Content Service)
社交服务 (Social Service)
2016年底,团队面临RPC框架的选择:
| 框架 | 优点 | 缺点 | 评估结果 |
|---|---|---|---|
| Dubbo | 成熟稳定、社区活跃 | 只支持Java、升级困难 | 备选 |
| gRPC | 跨语言、性能好 | 生态不完善、学习成本高 | 备选 |
| Thrift | 跨语言、Facebook背书 | 文档少、社区不活跃 | 否决 |
| 自研 | 完全可控、贴合业务 | 开发成本高、需要时间沉淀 | 采用 |
最终决定自研RPC框架”RED-RPC”,主要考虑:
RED-RPC 架构图
┌──────────────────────────────────────┐
│ 服务消费者 │
├──────────────────────────────────────┤
│ RED-RPC Client │
│ ┌──────────┬──────────┬──────────┐ │
│ │ 负载均衡 │ 熔断降级 │ 监控上报 │ │
│ └──────────┴──────────┴──────────┘ │
└───────────────┬──────────────────────┘
│ TCP/HTTP2
┌───────────▼──────────────┐
│ 服务注册中心 │
│ (Consul/Etcd) │
└───────────┬──────────────┘
│
┌───────────────▼──────────────────────┐
│ RED-RPC Server │
│ ┌──────────┬──────────┬──────────┐ │
│ │ 协议编解码│ 线程模型 │ 限流控制 │ │
│ └──────────┴──────────┴──────────┘ │
├──────────────────────────────────────┤
│ 服务提供者 │
└──────────────────────────────────────┘
核心特性:
服务注册发现流程
┌─────────────┐
│ 服务提供者 │
└──────┬──────┘
│ 1.注册
▼
┌─────────────┐ 3.订阅变更
│ Consul │◄────────────────┐
└──────┬──────┘ │
│ 2.发现 │
▼ │
┌─────────────┐ ┌──────┴──────┐
│ 服务消费者 │ │ 健康检查 │
└─────────────┘ └─────────────┘
实现细节:
熔断器状态机
┌─────────┐
│ 关闭 │◄──────────┐
└────┬────┘ │
│ │
失败率>阈值 │
│ 成功率恢复
▼ │
┌─────────┐ ┌─────┴────┐
│ 打开 │────▶│ 半开 │
└─────────┘ └──────────┘
熔断中 尝试恢复
降级策略配置示例:
service:
user-service:
timeout: 3000ms
circuit-breaker:
threshold: 50% # 错误率阈值
window: 10s # 统计窗口
cooldown: 30s # 熔断恢复时间
fallback:
type: cache # 降级策略:缓存/默认值/异常
API网关功能架构
┌────────────────────────────────────────┐
│ 客户端请求 │
└──────────────┬─────────────────────────┘
▼
┌────────────────────────────────────────┐
│ 负载均衡层(Nginx) │
└──────────────┬─────────────────────────┘
▼
┌────────────────────────────────────────┐
│ API Gateway │
│ ┌────────────────────────────────┐ │
│ │ 请求接入层 │ │
│ │ (协议转换、参数校验) │ │
│ └──────────────┬─────────────────┘ │
│ ▼ │
│ ┌────────────────────────────────┐ │
│ │ 安全控制层 │ │
│ │ (认证、授权、限流、防刷) │ │
│ └──────────────┬─────────────────┘ │
│ ▼ │
│ ┌────────────────────────────────┐ │
│ │ 路由转发层 │ │
│ │ (动态路由、负载均衡) │ │
│ └──────────────┬─────────────────┘ │
└─────────────────┼──────────────────────┘
▼
┌─────────┴─────────┐
│ 后端服务集群 │
└───────────────────┘
采用多维度限流策略:
限流策略层次
┌──────────────────────────────┐
│ 全局限流 │ 100万QPS
├──────────────────────────────┤
│ IP限流 │ 1000QPS/IP
├──────────────────────────────┤
│ 用户限流 │ 100QPS/用户
├──────────────────────────────┤
│ 接口限流 │ 按接口配置
└──────────────────────────────┘
防刷规则引擎:
规则示例:
- 规则1:同一IP 1分钟内请求超过1000次
- 规则2:同一用户1分钟内发布笔记超过10篇
- 规则3:同一设备1小时内注册账号超过3个
- 规则4:请求特征异常(无User-Agent、固定Header等)
随着数据量的快速增长,原有的MySQL主从架构已经无法满足需求。技术团队开始构建分布式存储体系。
分布式存储架构 (2018年)
┌─────────────────────────────────────────┐
│ 应用层 │
└────────────────┬────────────────────────┘
│
┌────────────────▼────────────────────────┐
│ 数据访问层 (DAL) │
│ (分片路由、读写分离、缓存) │
└──┬──────┬──────┬──────┬──────┬─────────┘
│ │ │ │ │
┌──▼──┐┌──▼──┐┌──▼──┐┌──▼──┐┌──▼──┐
│MySQL││TiDB ││HBase││Redis││ES │
│集群 ││集群 ││集群 ││集群 ││集群 │
└─────┘└─────┘└─────┘└─────┘└─────┘
关系型 NewSQL 列族 缓存 搜索
2017年引入TiDB解决分布式事务和弹性扩容问题:
TiDB集群架构
┌─────────────────────────────────┐
│ 应用层 │
└──────────┬──────────────────────┘
│
┌──────▼──────┐
│ TiDB Server│ (无状态SQL层)
│ Cluster │ 3个节点
└──────┬──────┘
│
┌──────▼──────┐
│ PD │ (元数据管理)
│ Cluster │ 3个节点
└──────┬──────┘
│
┌──────▼──────┐
│ TiKV │ (分布式KV存储)
│ Cluster │ 6个节点
└─────────────┘
TiDB应用场景:
用于存储海量非结构化数据:
HBase数据模型设计
Row Key设计:
用户行为:userId_timestamp_actionType
内容数据:contentId_version
列族设计:
info: 基础信息
meta: 元数据
content: 内容正文
stats: 统计数据
Kafka集群拓扑 (2018年)
┌────────────────────────────────────┐
│ 生产者集群 │
│ (应用服务、日志采集、数据同步) │
└──────────┬─────────────────────────┘
│
┌──────▼──────────────────┐
│ Kafka Broker集群 │
│ 12个节点,3个副本 │
│ 100+ Topics │
│ 1000+ Partitions │
└──────┬──────────────────┘
│
┌──────────┼──────────────────────────┐
│ │ │
▼ ▼ ▼
实时计算 数据仓库 搜索索引
(Flink) (Hive/Spark) (ES)
核心Topic设计:
| Topic | 用途 | 日均消息量 | 保留时间 |
|---|---|---|---|
| user_action | 用户行为 | 10亿+ | 7天 |
| content_publish | 内容发布 | 100万+ | 30天 |
| order_event | 订单事件 | 50万+ | 90天 |
| system_log | 系统日志 | 50亿+ | 3天 |
消息处理链路监控
Producer → Kafka → Consumer
│ │ │
▼ ▼ ▼
发送成功率 积压监控 消费成功率
99.99% <1万条 99.95%
关键优化措施:
分布式任务调度系统
┌────────────────────────────────┐
│ 调度中心 (Master) │
│ (任务管理、调度决策) │
└──────────┬─────────────────────┘
│
┌──────▼──────┐
│ ZooKeeper │ (协调服务)
└──────┬──────┘
│
┌──────────┼──────────────────┐
│ │ │
▼ ▼ ▼
执行器1 执行器2 ... 执行器N
(Worker) (Worker) (Worker)
任务类型分类:
日终批处理工作流
┌─────────────┐
│ 数据抽取 │ 00:00
└──────┬──────┘
│
┌──────▼──────┐
│ 数据清洗 │ 00:30
└──────┬──────┘
│
┌──────────┼──────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼───┐
│用户画像│ │内容分析│ │商品统计│ 01:00
└───┬───┘ └───┬───┘ └───┬───┘
│ │ │
└──────────┼──────────┘
│
┌──────▼──────┐
│ 推荐模型训练 │ 02:00
└──────┬──────┘
│
┌──────▼──────┐
│ 结果推送 │ 03:00
└─────────────┘
三层监控架构
┌─────────────────────────────────┐
│ 业务监控 │
│ (交易量、转化率、用户活跃度) │
├─────────────────────────────────┤
│ 应用监控 │
│ (接口性能、错误率、调用链) │
├─────────────────────────────────┤
│ 基础监控 │
│ (CPU、内存、网络、磁盘) │
└─────────────────────────────────┘
监控技术栈:
请求追踪示例
TraceID: abc123
┌────────────┐
│ 客户端 │ SpanID: 1
└─────┬──────┘
│ 10ms
┌─────▼──────┐
│ API网关 │ SpanID: 2
└─────┬──────┘
│ 2ms
┌─────▼──────┐
│ 用户服务 │ SpanID: 3
└──┬─────┬───┘
│ 5ms │ 8ms
┌──▼──┐ ┌▼────┐
│Redis│ │MySQL│ SpanID: 4,5
└─────┘ └─────┘
Total: 25ms
压测体系
┌─────────────────────────────┐
│ 压测控制台 │
└──────────┬──────────────────┘
│
┌──────▼──────┐
│ 压测引擎 │ (JMeter集群)
└──────┬──────┘
│
┌──────▼──────┐
│ 流量网关 │ (标记压测流量)
└──────┬──────┘
│
┌──────▼──────┐
│ 业务系统 │ (影子库隔离)
└─────────────┘
压测指标要求:
| 指标 | 2016年初 | 2018年底 | 提升 |
|---|---|---|---|
| 系统可用性 | 99.5% | 99.95% | 10x |
| 平均响应时间 | 500ms | 100ms | 5x |
| 峰值QPS | 1万 | 100万 | 100x |
| 发布频率 | 周级 | 日级 | 7x |
| 故障恢复时间 | 小时级 | 分钟级 | 60x |
2016-2018年是小红书技术架构的关键转型期。通过微服务化改造、分布式基础设施建设,技术团队成功支撑了业务的爆发式增长。这一时期积累的经验和建立的技术体系,为后续的规模化发展奠定了坚实基础。
下一章我们将探讨2019-2021年小红书如何在技术上实现从”能用”到”好用”的跨越,包括大规模微服务治理、实时计算平台建设以及AI技术的深度应用。