异地容灾与多活架构 学习笔记(第 4 部分)
数据冲突处理:
javascript
// 数据冲突检测与解决
class ConflictResolver {
constructor() {
this.strategy = 'last-write-wins' // 最后写入胜出
}
// 检测冲突
detectConflict(localData, remoteData) {
if (localData.version === remoteData.version) {
return localData.timestamp !== remoteData.timestamp
}
return false
}
// 解决冲突
resolveConflict(localData, remoteData) {
switch (this.strategy) {
case 'last-write-wins':
// 最后写入胜出
return localData.timestamp > remoteData.timestamp
? localData
: remoteData
case 'first-write-wins':
// 最先写入胜出
return localData.timestamp < remoteData.timestamp
? localData
: remoteData
case 'merge':
// 合并策略
return this.merge(localData, remoteData)
case 'manual':
// 人工介入
return this.requireManualIntervention(localData, remoteData)
default:
throw new Error('未知的冲突解决策略')
}
}
// 合并数据
merge(localData, remoteData) {
return {
...localData,
...remoteData,
merged: true,
mergedAt: Date.now()
}
}
// 需要人工介入
requireManualIntervention(localData, remoteData) {
// 将冲突数据写入待处理队列
this.writeToConflictQueue(localData, remoteData)
// 发送告警
this.sendAlert({
type: 'data_conflict',
localData,
remoteData,
timestamp: Date.now()
})
// 临时使用某个版本
return localData
}
}1.2.6 应用双活
定义:应用层面的冗余,通过负载均衡自动路由,但数据库可能是共享的
code
应用双活架构:
用户请求
↓
┌──────────────┐
│ 负载均衡器 │
└──────┬───────┘
│
┌───┴───┐
│ │
↓ ↓
┌─────┐ ┌─────┐
│应用A │ │应用B │
│(北京)│ │(上海)│
└──┬──┘ └──┬──┘
│ │
└───┬───┘
│
↓
┌──────────────┐
│ 共享数据库 │ ← 单点依赖
│ (主从架构) │
└──────────────┘
特点:
- 应用层多活
- 数据库共享(可能成为瓶颈)
- 部署相对简单
- 成本较低