Docker+RabbitMQ+NestJS微服务出现406 PRECONDITION_FAILED错误如何解决
解决方案
- 首先修正
compose.yml的缩进错误:你当前配置里api_consumer下的env_file、restart、depends_on配置项缩进和api_consumer同级,不属于该服务的配置,导致api_consumer启动时没有加载环境变量、没有配置重启策略,大概率启动失败没有注册消费者。修正为所有api_consumer的配置项缩进与build同级即可。 - 调整api_consumer的启动逻辑:你当前代码中会先加载AWS配置,加载完成后才执行
app.listen()注册RabbitMQ消费者。如果AWS配置加载耗时过长、甚至加载失败,消费者就不会上线。可以将app.listen()提到AWS配置加载逻辑之前,先完成微服务注册,再执行其他初始化逻辑。 - 给RabbitMQ服务增加健康检查,确保业务服务启动前RabbitMQ已经完全就绪:
在rabbitmq服务配置中新增如下内容:
healthcheck: test: ["CMD", "rabbitmqctl", "status"] interval: 5s timeout: 10s retries: 5
同时将两个业务服务的depends_on修改为:
depends_on: rabbitmq: condition: service_healthy
- 临时注释掉RabbitMQ的本地配置挂载:你本地的
rabbitmq.conf可能存在错误配置,比如禁用了direct reply-to、或者设置了消费者相关限制,先移除- ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf配置项,用RabbitMQ默认配置启动测试。 - 手动清理RabbitMQ残留数据:执行
docker volume ls找到RabbitMQ对应的存储卷,执行docker volume rm <对应卷名>手动删除,再重启所有服务,确保RabbitMQ是完全干净的初始状态。 - 测试阶段可以先注释掉AWS配置加载相关代码,排除第三方服务加载失败导致消费者未注册的问题。
内容的提问来源于stack exchange,提问作者Georgius17
相关产品推荐
相关产品推荐

