skip to content
ChrisLi-Tech

多地域分布式架构设计与实践

/ 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
📈 行为日志/埋点数据浏览、做题、点击、切换等非结构化行为数据