{T}

异地容灾与多活架构 学习笔记(第 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 │
│(北京)│ │(上海)│
└──┬──┘ └──┬──┘
   │       │
   └───┬───┘
       │
       ↓
┌──────────────┐
│  共享数据库   │  ← 单点依赖
│  (主从架构)   │
└──────────────┘

特点:
- 应用层多活
- 数据库共享(可能成为瓶颈)
- 部署相对简单
- 成本较低