跳到主要内容

数据同步机制

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论

引言

本文围绕黑名单模块与其他模块之间的数据同步机制展开,系统性阐述实时同步与异步同步策略、多源数据一致性保障、事务处理与补偿机制、缓存同步与失效策略,并提供监控指标、性能优化与故障恢复建议。目标是帮助读者全面理解跨模块数据流转与一致性保障的设计与实现。

项目结构

黑名单模块位于独立的服务中,通过本地缓存与Redis缓存协同,结合规则引擎与设备/任务模块的交互,形成完整的数据同步闭环。框架层提供统一的Redis与本地缓存工具,支撑黑名单数据的高效读写与一致性维护。

Mermaid Diagram Code:

graph TB
subgraph "黑名单模块"
BLApp["BlacklistServerApplication<br/>应用入口"]
BLService["AppBlacklistedServiceImpl<br/>业务逻辑"]
BLRedisDAO["AppBlacklistedRedisDAO<br/>Redis缓存DAO"]
BLConst["LocalCacheConstants<br/>缓存键常量"]
end
subgraph "框架层"
RedisUtils["RedisUtils<br/>Redis工具"]
RedisClient["RedisClient<br/>Redis客户端"]
LocalCacheUtils["LocalCacheUtils<br/>本地缓存工具"]
RedisCacheUtils["RedisCacheUtils<br/>Redis缓存工具"]
end
subgraph "其他模块"
TaskService["TaskService/TaskServiceImpl<br/>任务模块"]
DomainService["DomainServiceImpl<br/>域服务"]
DeviceCache["DeviceCacheUtils<br/>设备缓存"]
BPMTrigger["BpmSyncHttpRequestTrigger<br/>BPM触发器"]
RuleEvent["LocalCacheClearEventListener<br/>规则本地缓存事件监听"]
end
BLApp --> BLService
BLService --> BLRedisDAO
BLRedisDAO --> RedisClient
BLRedisDAO --> LocalCacheUtils
BLService --> TaskService
BLService --> DeviceCache
BLService --> BPMTrigger
BLService --> RuleEvent
RedisClient --> RedisUtils
LocalCacheUtils --> RedisCacheUtils

图表来源

章节来源

核心组件

  • 黑名单业务服务:负责黑名单主表与子表(渠道、MAC、区域、设备)的增删改查、审批状态流转、导入导出等。
  • Redis缓存DAO:封装黑名单数据与设备维度(MAC/渠道/区域)的缓存读写、批量更新与延迟双删策略。
  • 本地缓存工具:提供基于Spring Cache的本地缓存读写与批量清理。
  • Redis工具:提供批量删除、Lua脚本执行、分布式锁等能力,支撑高并发场景下的缓存一致性。
  • 任务模块:与黑名单联动,涉及规则绑定、任务删除、导出任务等,触发黑名单缓存清理。
  • 设备缓存工具:为黑名单查询提供设备上下文信息,支持规则引擎决策。
  • BPM触发器与规则事件监听:通过MQ异步通知实现跨模块事务解耦与补偿。

章节来源

架构总览

黑名单模块通过“数据库 + Redis本地缓存”的双层存储,结合延迟双删与Lua原子操作,确保在高并发场景下的一致性与性能。与任务模块、设备模块、规则引擎通过同步与异步方式协作,实现多源数据一致性与最终一致。

Mermaid Diagram Code:

sequenceDiagram
participant Client as "客户端"
participant BLService as "黑名单业务服务"
participant RedisDAO as "Redis缓存DAO"
participant LocalCache as "本地缓存"
participant DB as "数据库"
participant Task as "任务模块"
participant Rule as "规则引擎"
Client->>BLService : 更新黑名单
BLService->>DB : 事务性写入
DB-->>BLService : 提交成功
BLService->>RedisDAO : 延迟双删(黑名单主信息)
RedisDAO->>RedisDAO : Lua原子更新(设备维度缓存)
RedisDAO->>LocalCache : 清理本地缓存
BLService-->>Client : 返回结果
Note over BLService,Task : 任务删除/规则解绑触发缓存清理
BLService->>Task : 解绑规则/删除任务
Task-->>BLService : 结果回调
BLService->>RedisDAO : 清理相关设备维度缓存

图表来源

详细组件分析

组件A:黑名单业务服务(AppBlacklistedServiceImpl)

  • 事务性写入:创建/更新/删除黑名单均使用声明式事务,确保数据库层面的原子性。
  • 审批状态管理:通过BPM草稿与状态字段控制“未生效/已生效/更新/删除”等状态,避免脏读。
  • 子表同步:渠道、MAC、区域、设备等子表的增删改均触发Redis缓存清理或原子更新。
  • 导入与批量处理:MAC导入采用分批写入与计时统计,提升大文件导入的可观测性与稳定性。
  • 缓存穿透防护:Redis读取时使用分布式锁与空值缓存,防止热点击穿。

Mermaid Diagram Code:

flowchart TD
Start(["开始"]) --> TxBegin["开启事务"]
TxBegin --> Operate{"操作类型"}
Operate --> |创建| Insert["写入主表与子表"]
Operate --> |更新| Update["计算差异并更新"]
Operate --> |删除| Delete["标记删除或物理删除"]
Insert --> BPM["更新BPM状态"]
Update --> BPM
Delete --> BPM
BPM --> RedisClean["Redis缓存清理/原子更新"]
RedisClean --> Commit["提交事务"]
Commit --> End(["结束"])

图表来源

章节来源

组件B:Redis缓存DAO(AppBlacklistedRedisDAO)

  • 延迟双删:在写入后先删除缓存,短暂休眠后再二次删除,降低脏读概率。
  • 原子更新:通过Lua脚本对集合类缓存进行原子增删,保证设备维度(MAC/渠道/区域)的包名集合一致性。
  • 本地缓存联动:清理Redis的同时同步清理本地缓存,避免本地缓存不一致。
  • 设备维度缓存:针对MAC、渠道、区域分别维护独立的集合缓存,便于快速匹配与广播清理。

Mermaid Diagram Code:

classDiagram
class AppBlacklistedRedisDAO {
+removeBlacklisted(id)
+removeBlacklisted(ids)
+saveDeviceVoToRedis(addKeys, removeKeys, id)
+saveDeviceVoMacScopeOnRedis(vo)
+saveDeviceVoChannelScopeOnRedis(vo, id)
+saveDeviceVoRegionScopeOnRedis(vo, id)
+deleteChannel(channelId)
+deleteRegion(regionId)
+getAppBlacklistedRedisDOById(id)
}

图表来源

章节来源

组件C:本地缓存与Redis工具

  • 本地缓存:通过Spring Cache管理本地缓存,提供按键与批量清理能力,降低Redis压力。
  • Redis工具:提供批量删除、Lua脚本执行、分布式锁等,支撑高并发与一致性。
  • Redis缓存工具:统一的缓存清理接口,便于在各业务场景中标准化清理。

Mermaid Diagram Code:

classDiagram
class LocalCacheUtils {
+getCache(name, key)
+setCache(name, key, value)
+clearCache(name, key)
+clearCaches(name, keys)
+clearCache(name)
}
class RedisCacheUtils {
+clearCache(name, key)
+clearCaches(name, keys)
}
class RedisUtils {
+delMultiKeyCacheMapValue(keys, hKey)
+delMultiKeyCacheMapValue2(keys, hKey)
}

图表来源

章节来源

组件D:与任务模块的同步

  • 任务删除:当任务被删除或规则解绑时,黑名单模块清理相关设备维度缓存,确保查询结果正确。
  • 事务边界:任务模块的删除操作与黑名单缓存清理分别在各自事务内执行,通过异步通知与幂等处理保证最终一致。

Mermaid Diagram Code:

sequenceDiagram
participant Task as "任务服务"
participant BL as "黑名单服务"
participant Redis as "Redis缓存"
Task->>Task : 删除任务/解绑规则
Task-->>BL : 触发清理缓存
BL->>Redis : 清理设备维度缓存
Redis-->>BL : 清理完成
BL-->>Task : 返回清理结果

图表来源

章节来源

组件E:与设备模块的集成

  • 设备上下文:黑名单查询时,若无客户端信息,则通过设备缓存工具获取设备上下文,用于规则引擎决策。
  • 缓存一致性:设备信息变更时,需同步清理黑名单相关缓存,避免使用过期上下文。

章节来源

组件F:与规则引擎的异步同步

  • BPM异步通知:工作流状态变化通过MQ异步通知业务模块,业务侧采用本地消息表记录消息发送与处理状态,异常时人工重试。
  • 本地缓存清理:规则引擎侧提供本地缓存清理事件监听,跨模块触发缓存失效,确保一致性。

Mermaid Diagram Code:

sequenceDiagram
participant BPM as "工作流"
participant MQ as "消息队列"
participant Rule as "规则引擎"
participant BL as "黑名单服务"
BPM->>MQ : 发送状态变更消息
MQ-->>Rule : 推送消息
Rule->>Rule : 处理消息/记录状态
Rule-->>BL : 触发本地缓存清理事件
BL->>BL : 清理相关缓存

图表来源

章节来源

依赖关系分析

  • 黑名单服务依赖RedisDAO进行缓存读写与清理;RedisDAO依赖RedisClient与本地缓存工具实现原子更新与一致性。
  • 任务模块与黑名单模块通过规则解绑与任务删除触发缓存清理,形成弱耦合的同步链路。
  • 规则引擎与BPM通过MQ异步通知实现跨模块事务解耦,配合本地消息表与事件监听实现最终一致。

Mermaid Diagram Code:

graph TB
BLService["黑名单业务服务"] --> BLRedisDAO["Redis缓存DAO"]
BLRedisDAO --> RedisClient["Redis客户端"]
BLRedisDAO --> LocalCacheUtils["本地缓存工具"]
BLService --> TaskService["任务服务"]
BLService --> DeviceCache["设备缓存工具"]
BLService --> BPMTrigger["BPM触发器"]
BLService --> RuleEvent["规则事件监听"]

图表来源

章节来源

性能考虑

  • 批量导入:MAC导入采用分批写入与计时统计,减少单次事务时间与内存占用。
  • 原子更新:通过Lua脚本对集合类缓存进行原子增删,避免多次往返网络与竞态条件。
  • 延迟双删:在写入后短暂休眠再二次删除,平衡一致性与性能。
  • 本地缓存:热点数据优先命中本地缓存,降低Redis压力;同时通过统一清理接口保证一致性。
  • Redis批量删除:提供批量删除与Lua脚本执行,减少网络开销与锁竞争。

章节来源

故障排查指南

  • 缓存穿透:若Redis中出现空值缓存,检查分布式锁是否释放、空值缓存是否正确写入。
  • 缓存不一致:确认延迟双删是否执行、Lua原子更新是否成功、本地缓存是否同步清理。
  • 事务冲突:查看黑名单主表与子表的事务边界,确保异常回滚路径正确。
  • 异步通知:若BPM状态变更未触发缓存清理,检查MQ消息是否到达、事件监听是否注册、本地消息表状态是否正确。
  • 任务联动:任务删除后黑名单仍显示旧数据,检查任务服务是否调用黑名单清理接口。

章节来源

结论

黑名单模块通过“数据库 + Redis + 本地缓存”的三层协同,结合延迟双删、Lua原子更新与异步通知机制,在高并发场景下实现了跨模块数据同步与一致性保障。与任务模块、设备模块、规则引擎的联动,形成了以最终一致为目标的稳健数据同步体系。建议在生产环境中持续监控缓存命中率、事务冲突率与MQ消息积压,并定期评估批量导入与清理策略的性能表现。

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答