
采用“客户端-服务器”架构结合“最终一致性”策略,区分PC(实时同步,强一致性)与移动端(异步同步,最终一致性),通过版本号检测冲突、本地缓存适配移动端网络,保障数据一致性与可用性。
核心是“客户端-服务器”数据同步模式,结合“强一致性”(PC端,实时同步)与“最终一致性”(移动端,异步同步)。
类比:就像“记账”,PC端实时记账(立即同步账本),移动端断网时先记本地账本(待同步),联网后汇总记账,确保最终账本一致。
| 策略/模式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| PC端实时同步(强一致性) | 客户端修改后立即发送请求,服务器立即响应 | 网络延迟低,数据实时同步 | 需要实时性高的场景(如角色状态、战斗数据) | 依赖稳定网络,移动端不适用 |
| 移动端异步同步(最终一致性) | 客户端修改后本地缓存,联网后批量提交 | 网络友好,允许延迟 | 游戏存档、角色属性、道具等非实时数据 | 需要冲突解决机制,离线体验保障 |
| 乐观锁(版本号) | 用数据版本号检测冲突,无锁竞争 | 适用于高并发读场景,冲突概率低 | 数据修改频率低或冲突概率低 | 冲突时需重试逻辑,用户交互 |
| 本地缓存(断网处理) | 移动端断网时本地存储修改 | 保障离线体验 | 网络不稳定环境 | 需要同步机制,避免数据丢失,同步时可能冲突 |
数据同步流程(PC端,实时同步):
// 1. 获取服务器数据版本
version = 服务器获取用户数据版本()
// 2. 客户端修改数据(如等级+1,金币+100)
user_data = {level: user.level+1, gold: user.gold+100}
// 3. 发送带版本号的更新请求
response = 服务器更新数据(user_data, version)
if response.status == 200: // 更新成功
user.version = response.new_version
else if response.status == 409: // 冲突(版本不匹配)
// 重新获取数据并合并(最后写入者胜)
user_data = 服务器获取用户数据()
user = 合并数据(user_data, 本地修改数据)
重新发送请求
数据同步流程(移动端,异步同步+断网处理):
// 1. 获取服务器数据版本
version = 服务器获取用户数据版本()
// 2. 客户端修改数据(如等级+1,金币+100)
user_data = {level: user.level+1, gold: user.gold+100}
// 3. 发送带版本号的更新请求
if 网络连接正常:
response = 服务器更新数据(user_data, version)
if response.status == 200:
user.version = response.new_version
else if response.status == 409:
// 冲突,本地缓存并标记
本地数据库保存修改(user_data, "待同步")
else:
// 网络断开,本地保存
本地数据库保存修改(user_data, "待同步")
// 联网后,批量同步待同步数据
批量发送所有待同步数据到服务器
“面试官您好,针对跨平台数据同步,我会采用‘客户端-服务器’架构结合‘最终一致性’策略,区分PC与移动端特性。PC端因网络稳定,采用实时同步(强一致性),移动端因网络波动,采用异步同步(最终一致性)。数据同步流程是:客户端修改数据时,先从服务器获取版本号,修改后发送带版本号的请求,服务器验证版本后更新。冲突解决用乐观锁(版本号),若冲突则返回错误,客户端重新获取数据合并(如最后写入者胜)。对于移动端网络不稳定,采用本地缓存(如SQLite),断网时本地修改并标记,联网后批量同步。核心是平衡一致性与可用性,PC端保证实时性,移动端优先保证离线体验,服务器负责最终一致性。”