如何 运行 RabbitMQ 消费者使用 Docker - NodeJS

How to run RabbitMQ consumer using Docker - NodeJS

我有一个使用 RabbitMQ 的微服务应用程序。只有在 RabbitMQ 启动并 运行ning 之后,我如何才能从应用程序后端容器中 运行 RabbitMQ 消费者。我的撰写文件如下。

certichain_backend:
    depends_on:
      - rabbitmq

    working_dir: /app/backend/src 
    command: sh sleep 20 & nohup node /app/backend/src/services/amqp_consumer.js && npm run start;

rabbitmq:
     image: "rabbitmq:3-management"
     hostname: "rabbitmq"
     restart: always
     expose:
       - 15672
       - 5672
     labels:
       NAME: "rabbitmq"
     volumes:
       - ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
                

我已经将后端 'depends_on' 交给了 rabbitmq。但我观察到的是,rabbitmq 容器启动过程已启动。但是后端容器并没有等待 rabbitmq 容器完全启动。我的消费者 运行 与后端一起使用。因此消费者无法连接到 amqp 服务器,因为此时它不是 运行ning。因此我添加了一个睡眠参数。以便在 rabbitmq 启动时有一些时间。

这个方法很不一致。我确定这不是实现此目标的正确方法。

在您的 nodejs 代码中,如果无法访问 rabbitmq 容器,您可以添加功能以使用出口 1 终止进程。

rabbitmq.connect('rabbitmq://guest:guest@rabbitmq',{})
  .then(function(connection){
     console.log('Rabbitmq connection established');
     // other code here
   })
   .catch(function(errror) {
     console.error('%s while dialing rabbitmq', error.message);
     process.exit(1);
   });

并且在docker-compose文件中你可以添加restart: on-failure,这样,如果rabbitmq容器还没有启动,nodejs应用程序将无法启动并重新启动,直到rabbitmq容器就绪。

值得将 rabbitmq 连接建立作为 nodejs 应用程序执行的第一个操作之一 - 因此,如果没有 rabbitmq,则不会启动。