Docker部署下NestJS项目2无法连接RabbitMQ问题求助
Docker部署NestJS项目连接RabbitMQ问题排查:ea-receiver连接失败(ECONNREFUSED)
我通过Docker部署两个NestJS项目连接RabbitMQ服务,其中project-1(容器名ea-worker)可正常连接,但project-2(容器名ea-receiver)始终连接失败,报错connect ECONNREFUSED。已尝试直接使用RabbitMQ URL(amqp://rabbit:rabbit@rabbitmq:5672)和IP地址配置,但问题依旧。以下是相关信息,恳请帮忙排查。
容器名称
- ea-worker(project-1)
- ea-receiver(project-2)
- ea-mongodb
- ea-rabbitmq
报错日志
2023-10-13 11:27:11 [5:27:11 AM] Found 0 errors. Watching for file changes. 2023-10-13 11:27:11 2023-10-13 11:27:11 [Nest] 31 - 10/13/2023, 5:27:11 AM LOG [NestFactory] Starting Nest application... 2023-10-13 11:27:11 [Nest] 31 - 10/13/2023, 5:27:11 AM LOG [InstanceLoader] RabbitmqModule dependencies initialized +7ms 2023-10-13 11:27:11 [Nest] 31 - 10/13/2023, 5:27:11 AM LOG [InstanceLoader] ClientsModule dependencies initialized +0ms 2023-10-13 11:27:11 [Nest] 31 - 10/13/2023, 5:27:11 AM LOG [InstanceLoader] AppModule dependencies initialized +0ms 2023-10-13 11:27:11 Error connecting to RabbitMQ (attempt 1): { 2023-10-13 11:27:11 err: Error: connect ECONNREFUSED 172.21.0.4:5672 2023-10-13 11:27:11 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16) { 2023-10-13 11:27:11 errno: -111, 2023-10-13 11:27:11 code: 'ECONNREFUSED', 2023-10-13 11:27:11 syscall: 'connect', 2023-10-13 11:27:11 address: '172.21.0.4', 2023-10-13 11:27:11 port: 5672 2023-10-13 11:27:11 }, 2023-10-13 11:27:11 url: 'amqp://rabbit:rabbit@rabbitmq:5672' 2023-10-13 11:27:11 }
docker-compose.yml配置
version: '3' services: app: container_name: ea-worker build: context: ./project-1 dockerfile: Dockerfile ports: - "6000:6000" depends_on: - mongo - rabbitmq networks: - my_network volumes: - .:/app environment: RABBITMQ_URL: "amqp://rabbit:rabbit@rabbitmq:5672" MONGO_USERNAME: root MONGO_PASSWORD: root MONGO_HOST: mongo MONGO_PORT: 27017 MONGO_DB: my_db MONGO_URL: "mongodb://root:root@localhost:27017/my_db" receiver: container_name: ea-receiver build: context: ./project-2 dockerfile: Dockerfile ports: - "8000:7000" depends_on: - rabbitmq environment: RABBITMQ_URL: "amqp://rabbit:rabbit@rabbitmq:5672" networks: - my_network volumes: - .:/app mongo: container_name: ea-mongodb image: "mongo:7.0.2" ports: - "27017:27017" environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root networks: - my_network volumes: - ./mongo_data:/data/db rabbitmq: container_name: ea-rabbitmq image: "rabbitmq:3.11.10-management" ports: - "5672:5672" - "15672:15672" environment: RABBITMQ_DEFAULT_USER: rabbit RABBITMQ_DEFAULT_PASS: rabbit networks: - my_network volumes: - ./rabbitmq_data:/var/lib/rabbitmq networks: my_network: driver: bridge
project-2的RabbitMQ连接代码
RabbitmqModule
import { Module } from '@nestjs/common'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { RabbitmqService } from './rabbitmq.service'; @Module({ imports: [ ClientsModule.register([ { name: 'RABBITMQ_SERVICE', transport: Transport.RMQ, options: { urls: [process.env.RABBITMQ_URL], queue: 'my_queue', queueOptions: { durable: true, }, }, }, ]), ], providers: [RabbitmqService], }) export class RabbitmqModule {}
RabbitmqService
import { Injectable, OnModuleInit } from '@nestjs/common'; import { ClientProxyFactory, Transport } from '@nestjs/microservices'; import { ClientProxy } from '@nestjs/microservices'; import * as retry from 'retry'; @Injectable() export class RabbitmqService implements OnModuleInit { private readonly client: ClientProxy; constructor() { this.client = ClientProxyFactory.create({ transport: Transport.RMQ, options: { urls: [process.env.RABBITMQ_URL], queue: 'my_queue', queueOptions: { durable: false, }, }, }); } async onModuleInit() { await this.connectWithRetry(); } private async connectWithRetry() { const operation = retry.operation({ retries: 10, // Adjust the number of retries as needed factor: 2, minTimeout: 1000, // Adjust the timeout as needed }); operation.attempt(async (currentAttempt) => { try { await this.client.connect(); console.log('Connected to RabbitMQ'); } catch (error) { console.error(`Error connecting to RabbitMQ (attempt ${currentAttempt}):`, error); if (operation.retry(error)) { return; } console.error('Max retries reached. Exiting...'); process.exit(1); } }); } async handleMessage(message: any): Promise<any> { try { console.log(`Received message: ${JSON.stringify(message)}`); // Process the message as needed return 'Message processed successfully'; } catch (error) { console.error(`Error processing message: ${error.message}`); // Handle the error accordingly throw error; } } }
内容的提问来源于stack exchange,提问作者Mohsin
相关产品推荐
相关产品推荐

