Skip to content

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 组件
  • 消息发送逻辑:
    1. 检查接收者是否在本地 → 直接投递
    2. 否则 → 通过 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 在线1111$50
10K2-32-33 (1主2从)1 (主) + 1 (从)$200-500
100K5-105-103-61 (主) + 2 (从)$1000-2000
1M20-5020-506-121 (主) + 3 (从) + 分库分表$5000-10000

下一步工作 ​

立即可做 ​

  1. [添加 MessageRouter 组件]
  2. [改造 Chat 服务支持分布式]
  3. [创建 HAProxy 负载均衡配置]
  4. [创建 Kubernetes 部署文件]

短期优化 ​

  1. [Social/Voice 服务改造]
  2. [添加服务健康检查和自动故障转移]
  3. [实现连接迁移(实例重启时保持连接)]
  4. [添加监控指标(Prometheus)]

长期规划 ​

  1. [Redis Cluster 支持(自动分片)]
  2. [MySQL 分库分表方案]
  3. [多机房部署(跨地域容灾)]
  4. [服务网格(Istio/Linkerd)]
  5. [自动化扩缩容策略]

文件清单 ​

文件说明
docs/SCALABILITY.md扩展性设计文档
docs/SCALABILITY_CHAT_IMPLEMENTATION.mdChat 服务改造实现
libs/network/message_router.h/cc消息路由器组件
deploy/haproxy.cfgHAProxy 负载均衡配置
deploy/k8s/gateway-deployment.yamlGateway K8s 部署
deploy/k8s/chat-deployment.yamlChat K8s 部署
deploy/k8s/redis-cluster.yamlRedis 集群部署
deploy/deploy-cluster.sh集群部署脚本