Docker环境下Spring Boot CQRS项目MySQL数据同步异常求助
问题排查方案
1. 事件总线连通性检查
CQRS架构中,account-cmd执行完操作后需将事件发布到消息中间件,account-query监听事件同步数据到MySQL,这是核心链路:
- 进入消息中间件容器(从仓库推测是Kafka),执行命令检查主题是否存在:
kafka-topics.sh --list --bootstrap-server localhost:9092,确认是否有账户相关事件主题 - 查看
account-cmd服务日志,确认是否有事件发布成功的记录;若有Kafka连接超时、主题不存在等报错,针对性修复配置 - 查看
account-query服务日志,确认是否有订阅主题成功及事件消费记录;若无消费记录,排查消费者配置(如groupId、主题名称是否匹配)
2. Docker网络与组件连通性验证
确保所有服务处于同一Docker网络,且组件间能正常通信:
- 检查
docker-compose.yml,确认account-cmd、account-query、MySQL、消息中间件都挂载到同一个自定义网络 - 在
account-query容器内测试MySQL连通性:mysql -h [mysql服务名] -u [用户名] -p [密码],替换为配置中的实际参数,确认能正常连接并执行查询 - 在
account-cmd容器内测试消息中间件连通性:nc -zv [kafka服务名] 9092,确认端口可正常访问
3. MySQL初始化与权限检查
- 进入MySQL容器,检查目标数据库、表是否存在:
USE [数据库名]; SHOW TABLES;,若使用自动建表,确认account-query的JPA配置已开启spring.jpa.hibernate.ddl-auto=update - 检查数据库用户权限:确保
account-query使用的用户拥有目标数据库的增删改查权限,执行:GRANT ALL PRIVILEGES ON [数据库名].* TO '[用户名]'@'%'; FLUSH PRIVILEGES; - 核对
account-query的配置文件,确认MySQL连接URL、用户名、密码完全正确,例如:spring.datasource.url=jdbc:mysql://mysql:3306/account_db?useSSL=false&serverTimezone=UTC
4. 事件处理逻辑排查
- 检查
account-query中@EventHandler注解的方法,确认监听的事件类型与account-cmd发布的事件类完全匹配,同时验证序列化/反序列化配置(如Jackson注解)是否兼容 - 查看事件处理器内的日志输出,确认是否执行到数据插入逻辑,是否存在捕获异常但未打印日志的静默失败情况
- 确认
account-cmd发布的事件包含完整的账户数据(如账户ID、余额等),避免因字段缺失导致MySQL插入失败
5. Docker Compose配置补全
- 为
account-query添加服务依赖配置,确保MySQL和消息中间件启动完成后再启动该服务:
account-query: depends_on: - mysql - kafka
- 核对所有服务的环境变量,确认MySQL连接参数、Kafka地址等关键配置已正确传递
- 检查端口映射、容器名称配置,避免出现端口冲突或服务名称不匹配的问题
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

