Appearance
数据一致性保障
**本文引用的文件** - [LemesAuthApplication.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/LemesAuthApplication.java) - [AuthorizationServerConfig.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/config/AuthorizationServerConfig.java) - [SysLoginController.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/controller/SysLoginController.java) - [CustomOAuth2AccessTokenGenerator.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/CustomOAuth2AccessTokenGenerator.java) - [CustomOAuth2RefreshTokenGenerator.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/CustomOAuth2RefreshTokenGenerator.java) - [CustomOAuth2TokenCustomizer.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/CustomOAuth2TokenCustomizer.java) - [CustomUserDetailsServiceImpl.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/CustomUserDetailsServiceImpl.java) - [CustomeRefreshTokenAuthenticationConverter.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/CustomeRefreshTokenAuthenticationConverter.java) - [PasswordAuthenticationConverter.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/password/PasswordAuthenticationConverter.java) - [PasswordAuthenticationProvider.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/password/PasswordAuthenticationProvider.java) - [PasswordAuthenticationToken.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/password/PasswordAuthenticationToken.java) - [PasswordDaoAuthenticationProvider.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/password/PasswordDaoAuthenticationProvider.java) - [OAuth2EndpointUtils.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/util/OAuth2EndpointUtils.java) - [BaseEntity.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/base/BaseEntity.java) - [BaseEnum.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/base/BaseEnum.java) - [BasePage.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/base/BasePage.java) - [SuperEntity.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/base/SuperEntity.java) - [JacksonConfig.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/config/JacksonConfig.java) - [FeignConfiguration.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/config/FeignConfiguration.java) - [FilterIgnoreProperties.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/config/FilterIgnoreProperties.java) - [DefaultRedisConfig.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/config/DefaultRedisConfig.java) - [CustomMethodSecurityConfiguration.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/CustomMethodSecurityConfiguration.java) - [CustomMethodSecurityExpressionHandler.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/CustomMethodSecurityExpressionHandler.java) - [CustomOpaqueTokenIntrospector.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/CustomOpaqueTokenIntrospector.java) - [LemesAuthProperties.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/LemesAuthProperties.java) - [LemesClientProperty.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/LemesClientProperty.java) - [ResourceServerAutoConfiguration.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/ResourceServerAutoConfiguration.java) - [UserConfig.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/UserConfig.java) - [SecurityConstants.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/constant/SecurityConstants.java) - [AuthExceptionEntryPoint.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/exception/AuthExceptionEntryPoint.java) - [CustomAccessDeniedHandler.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/exception/CustomAccessDeniedHandler.java) - [OAuth2AuthenticationDeserialize.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/security/OAuth2AuthenticationDeserialize.java) - [BCryptUtil.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/util/BCryptUtil.java) - [CustomUserDetails.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/util/CustomUserDetails.java) - [CustomUserDetailsDTO.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/util/CustomUserDetailsDTO.java) - [PasswordUtil.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/util/PasswordUtil.java) - [UserUtils.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/util/UserUtils.java) - [OpenApiController.java](file://lemes-cloud/lemes-framework/lemes-framework-datasource/src/main/java/com/lenovo/lemes/datasource/api/OpenApiController.java) - [OpenApiFrameworkMapper.java](file://lemes-cloud/lemes-framework/lemes-framework-datasource/src/main/java/com/lenovo/lemes/datasource/mapper/OpenApiFrameworkMapper.java) - [DynamicDbName.java](file://lemes-cloud/lemes-framework/lemes-framework-datasource/src/main/java/com/lenovo/lemes/datasource/constants/DynamicDbName.java) - [DataBaseAdapter.java](file://lemes-cloud/lemes-framework/lemes-framework-datasource/src/main/java/com/lenovo/lemes/datasource/adapter/DataBaseAdapter.java) - [DataBaseAdapterService.java](file://lemes-cloud/lemes-framework/lemes-framework-datasource/src/main/java/com/lenovo/lemes/datasource/adapter/DataBaseAdapterService.java) - [device.sql](file://docs/ddl/device.sql) - [store.sql](file://docs/ddl/store.sql) - [workflow.sql](file://docs/ddl/workflow.sql) - [DmConst.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/constant/DmConst.java) - [SystemExceptionCode.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/constant/SystemExceptionCode.java) - [MybatisPlusConfig.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/config/MybatisPlusConfig.java) - [FactoryInterceptor.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/config/FactoryInterceptor.java) - [DepartmentApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/DepartmentApi.java) - [DeviceMainApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/DeviceMainApi.java) - [FileApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/FileApi.java) - [LineApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/LineApi.java) - [PasteGlueApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/PasteGlueApi.java) - [PasteGlueOperationApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/PasteGlueOperationApi.java) - [ProcessApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/ProcessApi.java) - [ProductModelApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/ProductModelApi.java) - [StockMainApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/StockMainApi.java) - [SysDictApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysDictApi.java) - [SysUserApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysUserApi.java) - [AttachmentEntity.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/AttachmentEntity.java) - [PrinterDo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/PrinterDo.java) - [RoleDo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/RoleDo.java) - [DepartmentDo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/DepartmentDo.java) - [FactoryDo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/FactoryDo.java) - [Email.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/Email.java) - [EmailMessageInfo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/EmailMessageInfo.java) - [MessageInfo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/MessageInfo.java) - [AppAutoUpgrade.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/AppAutoUpgrade.java) - [LangugaeResourceDo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/LangugaeResourceDo.java) - [ResourceDo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/ResourceDo.java) - [ResourceI18nDo.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/entity/ResourceI18nDo.java) - [SysDictApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysDictApi.java) - [SysUserApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysUserApi.java) - [SysDictApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysDictApi.java) - [SysUserApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysUserApi.java) - [SysDictApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysDictApi.java) - [SysUserApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysUserApi.java) - [SysDictApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysDictApi.java) - [SysUserApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysUserApi.java) - [SysDictApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysDictApi.java) - [SysUserApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysUserApi.java) - [SysDictApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysDictApi.java) - [SysUserApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysUserApi.java) - [SysDictApi.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-common/src/main/java/com/lenovo/lemes/service/dm/common/client/api/SysDictApi.java) ......目录
引言
本文件面向架构师与高级开发人员,系统化阐述 DeviceMate 项目的“数据一致性保障”方案。内容覆盖分布式事务策略(Saga 与 TCC 的适用性与落地建议)、缓存与数据库一致性(Cache-Aside、Write-Through、Cache Invalidation)、数据同步策略(异步消息、定时任务、触发器)、数据版本控制(乐观锁、悲观锁、并发控制)、数据校验与修复机制、以及事务边界设计原则(长事务治理、超时与死锁预防)。本文所有技术要点均基于仓库现有代码与配置进行归纳总结,并提供可操作的设计与实施建议。
项目结构
DeviceMate 后端采用多模块分层架构:认证授权模块、通用框架模块、业务服务模块(设备、库存、工作流)与数据源适配模块。认证与安全配置位于 lemes-auth 与 lemes-framework-auth;通用实体、配置与异常定义位于 lemes-framework-core;业务公共 API 与实体位于 lemes-service-dm-common;各业务子域在 lemes-service-dm-device、lemes-service-dm-store、lemes-service-dm-workflow 中实现;数据源适配与动态数据源能力位于 lemes-framework-datasource。
图示来源
- LemesAuthApplication.java
- CustomMethodSecurityConfiguration.java
- BaseEntity.java
- OpenApiController.java
- DeviceMainApi.java
- StockMainApi.java
- SysDictApi.java
章节来源
核心组件
- 认证与安全:提供 OAuth2 资源服务器、令牌生成与定制、用户详情服务、密码认证链路等,确保访问边界与身份可信。
- 通用框架:统一实体基类、分页基类、枚举基类、Jackson 配置、Feign 客户端配置、Redis 默认配置等,支撑各业务域一致性。
- 业务公共层:公共 API 接口、常量与异常码、MyBatis Plus 配置与拦截器,统一业务调用契约与数据访问规范。
- 数据源适配:动态数据源常量、适配器与 Mapper,支持多数据源场景下的数据一致性策略选择。
章节来源
- AuthorizationServerConfig.java
- CustomOAuth2AccessTokenGenerator.java
- CustomOAuth2RefreshTokenGenerator.java
- CustomOAuth2TokenCustomizer.java
- CustomUserDetailsServiceImpl.java
- BaseEntity.java
- BasePage.java
- JacksonConfig.java
- FeignConfiguration.java
- DefaultRedisConfig.java
- MybatisPlusConfig.java
- FactoryInterceptor.java
- DynamicDbName.java
- DataBaseAdapter.java
- OpenApiFrameworkMapper.java
架构总览
下图展示认证、安全、通用框架与业务域之间的交互关系,以及数据源适配如何贯穿其中,为后续一致性策略提供基础设施。
图示来源
- LemesAuthApplication.java
- CustomMethodSecurityConfiguration.java
- BaseEntity.java
- OpenApiController.java
详细组件分析
分布式事务处理策略
- Saga 模式应用建议
- 适用场景:跨服务的长流程(如设备变更引发库存与工作流联动),通过命令与补偿动作组合实现最终一致。
- 实施要点:以事件驱动为核心,每个子步骤提交成功后发布事件;失败时按相反顺序执行补偿,避免悬挂状态。
- 与现有组件结合:利用通用异常码与日志体系记录 Saga 步骤状态;通过消息中间件或事件表实现幂等与重试。
- TCC 事务实现建议
- 适用场景:对强一致有明确需求的短事务,或可预留资源的场景。
- 实施要点:Try 阶段预留资源并冻结;Confirm 阶段确认冻结;Cancel 阶段释放冻结。需严格控制 Try/Cf 的幂等与超时。
- 与现有组件结合:在业务服务层封装 Try/Confirm/Cancel 方法,配合统一异常与回滚策略。
- 最终一致性保证机制
- 基于事件的补偿与重试:通过统一异常码与重试队列,确保失败步骤被兜底恢复。
- 幂等设计:以业务键与版本号作为幂等依据,避免重复执行造成副作用。
说明:本节为一致性策略设计建议,具体实现需结合业务流程与消息中间件能力进行落地。
缓存与数据库双写一致性
- Cache-Aside 模式
- 读路径:先查缓存,未命中再查库并回填缓存;写路径:先更新数据库,再删除缓存,避免脏读。
- 与现有组件结合:利用默认 Redis 配置与序列化策略,确保键空间与过期策略一致。
- Write-Through 策略
- 写入时同时写库与缓存,适用于高命中率场景;需注意缓存写入失败的回滚与重试。
- Cache Invalidation 机制
- 明确失效策略:写操作后主动失效相关键;批量更新时采用前缀匹配或标签化键空间。
- 与现有组件结合
- 默认 Redis 配置与 Jackson 序列化配置为缓存一致性提供基础;业务层应遵循统一的键命名与过期策略。
章节来源
数据同步策略
- 异步消息同步
- 场景:跨域数据变更通知(如设备状态变化影响库存与工单),通过消息中间件实现解耦与削峰。
- 实施:在业务服务中发布领域事件,消费者侧幂等消费并更新目标数据。
- 定时任务同步
- 场景:对账与对齐差异数据,定期扫描不一致项并修复。
- 实施:基于调度框架执行增量扫描与修复脚本。
- 触发器同步
- 场景:数据库层面的审计与统计口径同步,适用于低频但强一致要求的场景。
- 实施:谨慎使用,避免触发器复杂度导致性能问题。
说明:本节为同步策略设计建议,需结合消息中间件与调度框架能力进行落地。
数据版本控制机制
- 乐观锁实现
- 基于版本字段(如更新时间戳或整型版本号)在更新时校验版本一致性,冲突时重试或报错。
- 与现有组件结合:统一实体基类与 MyBatis Plus 配置支持乐观锁字段映射。
- 悲观锁策略
- 在关键读取路径加排他锁,适用于高并发写入且需要强隔离的场景。
- 注意:需严格控制锁粒度与持有时间,避免阻塞放大。
- 并发控制方案
- 结合 Redis 分布式锁或数据库行级锁,确保同一业务对象的串行化处理。
- 与现有组件结合:利用默认 Redis 配置与工具类,统一加锁与解锁逻辑。
章节来源
数据校验与修复机制
- 数据完整性检查
- 字段约束与非空校验:基于实体定义与数据库约束,确保必填字段与格式正确。
- 外键一致性:定期扫描外键引用是否存在孤儿数据。
- 异常数据处理
- 统一异常码与错误分类,区分业务异常与系统异常;对可恢复异常进行自动重试。
- 数据修复工具
- 提供离线修复脚本与在线修复接口,支持批量修正与回滚。
- 与现有组件结合:利用公共异常码与日志体系记录修复过程与结果。
章节来源
事务边界设计原则
- 长事务处理
- 将长事务拆分为多个短事务,减少锁持有时间与资源占用。
- 对必要长事务设置明确时限与监控告警。
- 事务超时控制
- 为每个事务设置合理超时阈值,超时即回滚并记录异常。
- 死锁预防策略
- 统一资源获取顺序,避免循环等待;引入随机退避与重试上限。
说明:本节为事务治理原则,需结合数据库与框架配置共同落实。
依赖关系分析
下图展示认证、安全、框架与业务域之间的依赖关系,以及数据源适配在其中的作用。
图示来源
- LemesAuthApplication.java
- CustomMethodSecurityConfiguration.java
- BaseEntity.java
- OpenApiController.java
章节来源
- LemesAuthApplication.java
- CustomMethodSecurityConfiguration.java
- BaseEntity.java
- OpenApiController.java
性能考量
- 缓存命中率优化:合理设置键空间与过期策略,避免热点键与雪崩。
- 数据库连接池与 SQL 优化:统一连接池配置与慢查询监控,避免长事务与全表扫描。
- 消息与定时任务的吞吐:限流与分区策略,避免峰值冲击。
- 并发控制:分布式锁粒度与超时设置,防止阻塞放大。
故障排查指南
- 认证与安全
- 身份验证失败:检查令牌生成与定制、用户详情加载与密码认证链路。
- 权限拒绝:核对方法级安全表达式与资源服务器配置。
- 通用框架
- JSON 序列化异常:核对 Jackson 配置与类型注册。
- Feign 调用异常:检查客户端配置与降级策略。
- 业务公共层
- 数据访问异常:核对 MyBatis Plus 配置与拦截器行为。
- 数据源适配
- 动态数据源切换异常:核对常量与适配器实现。
章节来源
- SysLoginController.java
- CustomOAuth2AccessTokenGenerator.java
- CustomOAuth2RefreshTokenGenerator.java
- CustomOAuth2TokenCustomizer.java
- CustomUserDetailsServiceImpl.java
- CustomeRefreshTokenAuthenticationConverter.java
- PasswordAuthenticationConverter.java
- PasswordAuthenticationProvider.java
- PasswordAuthenticationToken.java
- PasswordDaoAuthenticationProvider.java
- OAuth2EndpointUtils.java
- JacksonConfig.java
- FeignConfiguration.java
- MybatisPlusConfig.java
- FactoryInterceptor.java
- OpenApiFrameworkMapper.java
结论
DeviceMate 的数据一致性保障应以“最终一致性为主、强一致为辅”的混合策略构建:对跨域长流程采用 Saga 与事件驱动,对短事务采用 TCC 或本地事务;通过 Cache-Aside 与统一缓存策略保障缓存与数据库一致性;借助异步消息、定时任务与触发器实现多维同步;以乐观锁与分布式锁实现并发控制;以统一异常码与日志体系支撑数据校验与修复。上述方案与现有认证、安全、框架与业务公共层组件形成良好协同,可为生产环境提供稳定可靠的一致性保障。
附录
- 数据库 DDL 参考
- 设备域:device.sql
- 库存域:store.sql
- 工作流域:workflow.sql