
1) 【一句话结论】采用“实时推送(WebSocket)+增量更新+本地缓存+离线同步+乐观锁冲突处理”的混合机制,通过WebSocket实现库存变化秒级推送,移动端本地缓存保证断网可用,网络恢复后后台同步并处理冲突,确保数据实时同步且最终一致。
2) 【原理/概念讲解】核心是通过“实时双向通信+本地缓存+离线同步”结合,实现数据一致性。
UPDATE inventory SET quantity = ?, version = version + 1 WHERE id = ? AND version = ?),触发WebSocket广播变化数据(JSON格式,含变更字段和版本号),移动端接收后直接更新本地缓存并刷新UI,保证低延迟。POST /api/inventory/sync接口上传。3) 【对比与适用场景】
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 实时推送(WebSocket) | 后端主动向客户端推送数据变化 | 低延迟(毫秒级),客户端无需轮询 | 高频数据更新(如库存秒级变化、质检状态实时变更) | 需持续网络连接,管理长连接成本高,网络切换时需重连 |
| 定期轮询(Polling) | 客户端定时向服务器请求数据 | 高延迟(秒级),需频繁请求 | 数据更新频率低(如每日质检报告、月度报表) | 可能漏掉实时变化,网络压力大,服务器负载高 |
4) 【示例】
UPDATE inventory
SET quantity = ?, status = ?, version = version + 1
WHERE id = ? AND version = ?
更新成功则调用WebSocket广播变更数据。func connectWebSocket() {
let url = URL(string: "wss://api.9377.com/inventory")!
let ws = WebSocket(url: url)
ws.delegate = self
ws.connect()
}
extension ViewController: WebSocketDelegate {
func didReceive(event: WebSocket.Event) {
if case .data(let data) = event {
let json = try? JSONSerialization.jsonObject(with: data, options: [])
if let change = json as? [String: Any],
let action = change["action"] as? String,
action == "update" {
if let changeData = change["data"] as? [String: Any],
let id = changeData["id"] as? Int,
let newQty = changeData["quantity"] as? Int,
let newStatus = changeData["status"] as? String,
let version = changeData["version"] as? Int {
if let localVersion = localInventoryVersion[id] {
if localVersion == version {
updateLocalInventory(id: id, quantity: newQty, status: newStatus)
refreshUI()
} else {
showConflictAlert(id: id, currentVersion: localVersion, remoteVersion: version)
}
}
}
}
}
}
}
POST /api/inventory/sync
Content-Type: application/json
{
"changes": [
{"id": 1001, "action": "update", "quantity": 60, "status": "质检通过", "version": 2},
{"id": 1002, "action": "create", "quantity": 30, "status": "待质检", "version": 1}
]
}
后端验证版本号后更新数据库,若本地数据更新则回滚,若后端数据更新则更新本地数据并标记冲突。5) 【面试口播版答案】面试官您好,针对B端APP的库存与质检报告实时同步需求,我会设计一个“实时推送+增量更新+本地缓存+离线同步+冲突处理”的混合机制。首先,通过WebSocket实现后端库存变化秒级推送,当库存数据更新时,后端立即将变化数据(如“库存ID=1001,数量从50增加到60”)推送到移动端,移动端接收后直接更新本地缓存并刷新UI,保证实时性。其次,采用增量更新策略,只同步变化字段,减少数据传输量。同时,支持离线模式,当网络断开时,移动端会将变化数据暂存到本地,网络恢复后通过后台同步接口上传,确保数据最终一致。冲突处理上,后端采用乐观锁(版本号字段),更新时检查版本号是否匹配,不一致则拒绝并提示冲突,客户端需重新获取最新数据后重试。这样既保证了实时同步,又处理了网络延迟或断网情况,满足B端客户对供应链数据的及时性需求。
6) 【追问清单】
version整数字段,每次更新时版本号自增,更新时检查当前版本号是否与本地一致,不一致则拒绝更新,保证数据一致性。7) 【常见坑/雷区】