如何在event sourcing+CQRS的微服务架构中插入static data?
微服务+CQRS+Event Sourcing架构下PostgreSQL静态数据插入方案
静态数据虽然变更频率极低,但在微服务+CQRS架构下仍要遵守服务边界规则,不能跨服务直接操作数据库,以下是三种适配你当前技术栈的落地方案:
方案1:事件溯源原生适配方案(优先推荐)
- 把静态数据的初始化/更新操作也封装成标准的领域事件,比如
StaticDataInitialized、StaticDataUpdated - 在对应服务的启动流程中增加校验逻辑:启动时先检查对应读模型的静态数据是否存在,不存在就触发初始化事件,走正常的事件落库、读模型更新流程,和普通业务数据的处理逻辑完全一致
- 优势:完全适配现有架构,不需要额外引入工具,天然保证所有服务的静态数据同步逻辑统一,也支持后续静态数据的少量变更需求
- PostgreSQL适配实操:可以用
SELECT EXISTS查询对应静态数据表的标识记录做校验,不需要额外依赖
方案2:迁移阶段兼容脚本方案(适合存量静态数据快速迁移)
- 针对每个服务独立编写专属的静态数据插入脚本,脚本只操作对应服务自己的读模型库,不跨服务写库
- 脚本执行时机放在服务首次部署前、或者数据库迁移任务(比如用
Flyway、Liquibase这类数据库版本管理工具)的执行流程中 - 注意事项:如果静态数据需要跨服务同步,脚本执行完成后要手动触发一次对应的静态数据变更事件,通知其他依赖的服务更新自身读模型
- PostgreSQL适配实操:脚本里可以加
ON CONFLICT DO NOTHING逻辑,避免重复插入报错,适合多次执行的场景
方案3:静态数据配置中心方案(适合全局通用、完全不变的静态数据)
- 把全局公用的静态数据(比如国家编码、币种枚举这类完全不会变的数据)抽成统一的配置,服务启动时加载到内存或者写入自身读模型
- 如果有变更需求走配置中心的更新流程,同时触发变更事件通知所有依赖服务同步
- 优势:减少多服务重复存储相同静态数据的冗余,降低后续维护成本
注意:如果是服务私有的静态数据不要走这个方案,避免破坏服务的边界独立性
内容的提问来源于stack exchange,提问作者Sheida
相关产品推荐
相关产品推荐

