【问题标题】:How to prevent an application from starting before its dependencies are available [duplicate]如何防止应用程序在其依赖项可用之前启动[重复]
【发布时间】:2021-02-11 03:55:25
【问题描述】:

我的 Dockerfile 使用以下命令启动应用程序

CMD ["/home/app/start-app.sh"]

start-app.sh 包含以下内容,它会等待 RabbitMQ 服务器可用。对于使用 docker-compose、k8s 运行的应用程序是否有更好的方法来实现这一点

while ! nc -z "$RABBITMQ_HOSTNAME" "$SPRING_RABBITMQ_PORT"; do sleep 10; done

【问题讨论】:

    标签: docker rabbitmq


    【解决方案1】:

    我猜不是。即使 docker compose 提供了depends_on,它也只是按照依赖顺序启动容器。它不能确保特定服务可用。 docker documentation 用这种方式解释我不能做得更好:

    等待数据库(例如)准备就绪的问题实际上只是分布式系统的一个更大问题的一个子集。在生产中,您的数据库可能随时变得不可用或移动主机。您的应用程序需要能够适应这些类型的故障

    要处理此问题,请将您的应用程序设计为在发生故障后尝试重新建立与数据库的连接。如果应用程序重试连接,它最终可以连接到数据库。

    如果您必须等待其他服务准备好,您已经完成了所需的操作。但就像他们说的那样,最好开发可以处理其他服务停机的应用程序,因为停机随时可能发生。这就是 netflix 开发chaos monkey 的原因。现在有人可能会争辩说,处理这些可能的状态会使应用程序的开发变得更加困难。没错,但这只是分发的复杂性。人们可以忽略它:“这永远不会发生”,我保证它会或接受它会发生并做正确的事情。也许这个决定取决于风险和它发生在您的公司时会产生的损害。

    服务或微服务为我们提供了很多解耦和灵活性,但它们来自我们应该牢记的海岸。

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 2020-05-10
      • 2018-10-06
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多