多地域分布式架构设计与实践
/ 5 min read
Table of Contents
#分布式方案
分布式方案:全球多地域+中心凭据服务器
-
用户首次访问时,由中心服务器进行用户管理/创建,使用GEOIP分配用户最近的业务节点。同时参考用户选区信息进行节点分配。
-
用户进入业务节点,由业务节点处理用户在使用期间产生的所有数据。
-
检测到地区变动:节点之间进行数据拉取。短期内可以使用cdn对抗延迟,防止产生资源浪费。
-
条件策略用户 IP 首次检测到地域变化(如 CN → US)不立刻迁移,加入地域变更候选队列,记录时间和 IP1 小时内 IP 稳定在新地域(如一直是 US)认为是真实地域变更,正式切换节点并拉取数据IP 在 1 小时内跳变(US → CN → US)判定为不稳定或使用代理,不切换每日只允许最多一次地域切换防止频繁切换带来重复开销,保护主数据库
xxx.cn
eu.api.xxx.cn
hk.api.xxx.cn
sg.api.xxx.cn
#伪代码实现地域切换
from datetime import datetime, timedelta
# 假设的用户记录user = { "id": "user_123", "current_region": "CN", # 当前绑定业务节点 "last_seen_ip": "1.1.1.1", "last_detected_region": "CN", "region_change_timer": None, # 开始计时的时间戳 "region_change_count_today": 0,}
# 模拟函数:根据 IP 识别地域(真实环境用 IP 地理库,可接入ipinfo.io api)def ip_to_region(ip): if ip.startswith("8.8."): return "US" if ip.startswith("1.1."): return "CN" return "SG"
# 中心调度逻辑入口def handle_request(ip, user): now = datetime.now() detected_region = ip_to_region(ip)
# 如果地域没变,不做事 if detected_region == user["current_region"]: user["region_change_timer"] = None # 重置观察计时 return f"[OK] 用户保持在当前区域 {user['current_region']}"
# 地域变化:准备延迟观察 if user["region_change_timer"] is None: user["last_detected_region"] = detected_region user["region_change_timer"] = now return f"[WAIT] 检测到地域变化 → {detected_region},进入观察期"
# 判断是否达成 1 小时观察期 if now - user["region_change_timer"] >= timedelta(hours=1): if detected_region == user["last_detected_region"]: if user["region_change_count_today"] < 1: # 真正迁移 user["current_region"] = detected_region user["region_change_timer"] = None user["region_change_count_today"] += 1 return f"[SWITCH] 地域切换为 {detected_region}" else: return "[BLOCKED] 今天已切换过地域" else: # IP 不稳定,观察失败 user["region_change_timer"] = None return "[CANCEL] 地域不稳定,取消切换"
return f"[OBSERVING] 等待地域确认中(当前观察 {now - user['region_change_timer']})"#中心/地域服务器
| 部署位置 | 是否推荐 | 理由 |
|---|---|---|
| 🇸🇬 新加坡 | ✅ 强烈推荐 | 中立、高速、互通性强、法务环境好 |
| 🇭🇰 香港 | ✅ 辅助推荐 | 作为连接中国大陆的边缘节点 |
| 🇩🇪 德国 | ✅ 只读/冷备 | 适合 GDPR 要求的数据冷备副本 |
| 🇨🇳 中国 | ❌ 限制多 | 境外未备案域名解析被阻断、法律限制、代理绕墙问题等 |
| 🇺🇸 美国 | ❌ 不推荐 | 网络严重受限,中国/亚太互通差 |
- 注:静态资源存储在s3存储,不参与地域变动。
#分布式方案中的用户社区
用户社区由中心服务器运行,保证数据统一稳定。涉及到用户数据的部分由中心服务器查表,信息部分由中心服务器路由到地域服务器查表。
| 功能模块 | 核心职责 | 推荐数据库类型 |
|---|---|---|
| 🧑 用户系统 | 登录、注册、权限、区域、偏好设置 | ✅ 关系型数据库(MySQL/PostgreSQL) |
| 🌍 地域管理 | 当前区域、候选区域、迁移计时器、节点映射 | ✅ 关系型数据库 + Redis 缓存 |
| 📄 试卷查询/题库 | 题目、分类、标签、知识点、难度,结构化字段 | ✅ 关系型数据库 |
| 🧩 试卷组合/生成 | 自定义试卷结构、临时组合逻辑、用户存档 | ✅ 可用 MongoDB 或 Redis |
| 🤖 AI 辅助 | 交互历史、回答记录、提示参数、生成配置 | ✅ MongoDB 最适合 |
| 💬 社交大厅 | 帖子、评论、点赞、聊天记录、用户动态 | ✅ MongoDB + Redis |
| 📈 行为日志/埋点数据 | 浏览、做题、点击、切换等非结构化行为数据 |