Chirp 分布式扩展总结
状态说明:本文是扩展性设计总结,包含容量估算和演进计划。当前默认支持路径、实验性能力和未完成边界请以 整体架构 与 能力矩阵 为准。
架构扩展能力分析
| 组件 | 单机限制 | 扩展方案 | 扩展类型 |
|---|---|---|---|
| Gateway | ~50K 连接 | ✅ 已支持 Redis 分布式会话 | 水平扩展 |
| Auth | ~20K QPS | ✅ 无状态设计 | 水平扩展 |
| Chat | 本地状态瓶颈 | ⚠️ 已有实验性分布式实现,默认路径仍需收敛 | 水平扩展 |
| Social | 本地状态瓶颈 | ⚠️ 需改造(消息路由器) | 水平扩展 |
| Voice | 本地状态瓶颈 | ⚠️ 需改造(消息路由器) | 水平扩展 |
| Redis | 单点故障 | Redis Cluster / 主从 | 水平扩展 |
| MySQL | 单点写入 | 主从复制 / 分库分表 | 垂直+水平 |
目标分布式架构
┌─────────────────────────────────────────────────┐
│ 客户端层 │
│ Game Clients (TCP) │ Web/Mobile (WebSocket) │
└─────────────────────┬───────────────────────────┘
│
┌─────────────────────┴───────────────────────────┐
│ 负载均衡层 (HAProxy/LVS) │
│ TCP:5000 WebSocket:5001 │ Multi-Protocol │
└─────────────────────┬───────────────────────────┘
│
┌─────────────────────────────────────┼─────────────────────────────────────────────┐
│ │ │
│ ┌──────────────────────────────────▼──────────────────────────────────────────┐ │
│ │ Gateway 层 (无状态) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │ GW Node1 │ │ GW Node2 │ │ GW Node3 │ │ GW NodeN │ ... 可无限扩展 │ │
│ │ │ :5000/01 │ │ :5000/01 │ │ :5000/01 │ │ :5000/01 │ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
│ └───────┼────────────┼────────────┼────────────┼────────────────────────────┘ │
│ │ │ │ │ │
│ ┌───────┴────────────┴────────────┴────────────┴────────────────────────────┐ │
│ │ 服务发现 (Redis) │ │
│ │ service:gateway:gw_1 -> 192.168.1.10:5000 │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────┼─────────────────────────────────────────────┐
│ │ │
│ ┌──────────────────────────────────▼──────────────────────────────────────────┐ │
│ │ 业务服务层 (Chat/Social/Voice) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
│ │ │Chat Node1│ │Chat Node2│ │Chat Node3│ │Chat NodeN│ ... 水平扩展 │ │
│ │ │ :7000/01 │ │ :7000/01 │ │ :7000/01 │ │ :7000/01 │ │ │
│ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
│ │ │ │ │ │ │ │
│ │ ┌────▼────────────▼────────────▼────────────▼────┐ │ │
│ │ │ MessageRouter (Redis Pub/Sub) │ │ │
│ │ │ chirp:chat:user:{id} chirp:social:user:{id} │ │ │
│ │ │ chirp:chat:group:{id} chirp:kick:instance{} │ │ │
│ │ └──────────────────────┬───────────────────────────┘ │ │
│ └─────────────────────────┼──────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────▼──────────────────────────────────────────────────┐ │
│ │ 分布式状态管理 │ │
│ │ ┌────────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ 本地会话: local_sessions[user_id] = weak_ptr<Session> │ │ │
│ │ │ 消息路由: router->SendChatMessage(user_id, msg, local_send_fn) │ │ │
│ │ │ → 先尝试本地投递,失败则通过 Redis 转发 │ │ │
│ │ └────────────────────────────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────┼─────────────────────────────────────────────┐
│ │ │
│ ┌──────────────────────────────────▼──────────────────────────────────────────┐ │
│ │ 数据层 │ │
│ │ │ │
│ │ ┌─────────────────────┐ ┌─────────────────────────────────────────────┐ │ │
│ │ │ Redis Cluster │ │ MySQL 主从复制 │ │ │
│ │ │ ┌───┐ ┌───┐ ┌───┐ │ │ ┌─────────┐ ┌─────────────┐ │ │ │
│ │ │ M │◄─┤ S │◄─┤ S │ │ │ │ Primary │──│ Replica 1 │ │ │ │
│ │ │ │ └───┘ └───┘ │ │ │ :3306 │ │ :3306 │ │ │ │
│ │ │ │ (16379) │ │ └─────────┘ └─────────────┘ │ │ │
│ │ │ │ │ │ ┌─────────────┐ │ │ │
│ │ │ │ ...│ │ │ Replica 2 │ │ │ │
│ │ │ │ (6379) │ │ └─────────────┘ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ ┌───┐ ┌───┐ │ │ 功能: 持久化存储、历史消息、离线数据 │ │ │
│ │ │ └───┤ S │◄─┤ S │ │ │ │ │ │
│ │ │ └───┘ └───┘ │ │ │ │ │
│ │ └─────────────────────┘ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ │ Redis 用途: 会话管理、Pub/Sub、在线状态、离线消息缓存 │ │
│ └────────────────────────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────────────────┘关键设计决策
1. Gateway 层 - 完全无状态
- [通过 Redis 共享会话状态]
- [每个实例有唯一
instance_id] - [Redis Pub/Sub 跨实例踢人]
- [可水平扩展至 N 个实例]
2. 业务服务层 - 本地状态 + 消息路由
- 本地维护
user_id -> Session映射(热数据) - 新增
MessageRouter组件 - 消息发送逻辑:
- 检查接收者是否在本地 → 直接投递
- 否则 → 通过 Redis Pub/Sub 转发到其他实例
- 接收者登录时订阅自己的 Redis 频道
3. 负载均衡策略
- Gateway: 使用
least_conn算法(适合长连接) - Session Affinity: 同一客户端保持连接到同一实例(减少 Redis 查询)
- Health Check: 主动检测实例健康状态
4. 数据一致性
- Redis: 使用 Pub/Sub 实现最终一致性
- MySQL: 写主库,读从库
- 离线消息: Redis 缓存 + MySQL 持久化
扩容步骤
新增 Gateway 实例
bash
# 方式1:Docker Compose 扩展
docker compose -f docker-compose.cluster.yml up -d --scale gateway=5
# 方式2:Kubernetes HPA(自动)
kubectl autoscale deployment chirp-gateway --min=3 --max=20 --cpu-percent=70
# 方式3:手动添加实例
./deploy-cluster.sh scale gateway 5新增 Chat 实例
bash
# Docker Compose
docker compose -f docker-compose.cluster.yml up -d --scale chat=5
# Kubernetes
kubectl scale deployment chirp-chat --replicas=5容量规划参考
| 在线用户 | Gateway 实例 | Chat 实例 | Redis 节点 | MySQL 节点 | 预估成本/月 |
|---|---|---|---|---|---|
| 1K 在线 | 1 | 1 | 1 | 1 | $50 |
| 10K | 2-3 | 2-3 | 3 (1主2从) | 1 (主) + 1 (从) | $200-500 |
| 100K | 5-10 | 5-10 | 3-6 | 1 (主) + 2 (从) | $1000-2000 |
| 1M | 20-50 | 20-50 | 6-12 | 1 (主) + 3 (从) + 分库分表 | $5000-10000 |
下一步工作
立即可做
- [添加
MessageRouter组件] - [改造 Chat 服务支持分布式]
- [创建 HAProxy 负载均衡配置]
- [创建 Kubernetes 部署文件]
短期优化
- [Social/Voice 服务改造]
- [添加服务健康检查和自动故障转移]
- [实现连接迁移(实例重启时保持连接)]
- [添加监控指标(Prometheus)]
长期规划
- [Redis Cluster 支持(自动分片)]
- [MySQL 分库分表方案]
- [多机房部署(跨地域容灾)]
- [服务网格(Istio/Linkerd)]
- [自动化扩缩容策略]
文件清单
| 文件 | 说明 |
|---|---|
docs/SCALABILITY.md | 扩展性设计文档 |
docs/SCALABILITY_CHAT_IMPLEMENTATION.md | Chat 服务改造实现 |
libs/network/message_router.h/cc | 消息路由器组件 |
deploy/haproxy.cfg | HAProxy 负载均衡配置 |
deploy/k8s/gateway-deployment.yaml | Gateway K8s 部署 |
deploy/k8s/chat-deployment.yaml | Chat K8s 部署 |
deploy/k8s/redis-cluster.yaml | Redis 集群部署 |
deploy/deploy-cluster.sh | 集群部署脚本 |