我有一個(gè)使用RabbitMQ的微服務(wù)應(yīng)用程序。如何僅在RabbitMQ啟動并運(yùn)行之后才能從應(yīng)用程序后端容器運(yùn)行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
我已經(jīng)將后端的'depends_on'給了rabbitmq。但我觀察到的是,rabbitmq容器啟動過程已經(jīng)啟動。但是后端容器并不等待rabbitmq容器完全啟動。我的消費(fèi)者正在與后端一起運(yùn)行。因此使用者無法連接到amqp服務(wù)器,因?yàn)榇藭r(shí)它沒有運(yùn)行。因此,我添加了一個(gè)sleep參數(shù)。這樣就有時(shí)間讓拉比提出來。
這種方法很不一致。我肯定這不是實(shí)現(xiàn)這一目標(biāo)的正確方法。
在nodejs代碼中,如果rabbitmq容器不可訪問,您可以添加一個(gè)特性來終止進(jìn)程并退出1。
在docker-compose文件中,您可以添加
restart: on-failure
,所以,如果rabbitmq容器還沒有啟動,nodejs應(yīng)用程序?qū)o法啟動并重新啟動,直到rabbitmq容器就緒。將rabbitmq連接建立作為nodejs應(yīng)用程序執(zhí)行的第一個(gè)操作之一是值得的—因此,如果沒有rabbitmq,就不會啟動任何操作。