Heroku部署过程究竟如何运作?

rip*_*234 7 deployment heroku

当我将我的服务的新版本部署到Heroku时,究竟发生了什么?

假设我现在有N个web dynos在线,其中M个当前正在处理请求.

  • 在新版本开始上线之前,是否所有这些都关闭了?当前正在服务的任何待处理请求会发生什么?
  • 有停机时间吗?(假设我只有没有任何迁移的无状态服务)
  • 是否有用于执行自定义迁移的挂钩(例如迁移数据库表)?
  • 我是否可以启动运行新版本的N台服务器,让它们开始为请求提供服务,并且只在它们不为任何请求提供服务时才将之前的N台服务器关闭?
  • 答案取决于堆栈/语言吗?(Aspen/Bamboo/Cedar,Ruby/Node.js/Java/...)

我没有关于此的任何官方文档,只是相反的帖子(有些人说热迁移是不可能的,而有些人则说没有停机时间).是否有关于部署过程和上述问题的官方详细信息?

Dav*_*lar 17

以下是Heroku部署期间发生的事情(截至2011年10月20日当前*)[1]:

  • Heroku收到你的git推
  • 新版本是从最新版本的应用程序编译并存储的
  • [这些大致同时发生]
    • 发出dyno网格信号以终止[2]您应用的所有正在运行的进程
    • 发出dyno网格信号,为您的应用启动新流程
    • 发出dyno网格信号以统一应用程序的所有空闲进程
    • HTTP路由器发出信号,开始将HTTP流量路由到运行新版本的Web dynos

一般情况是,为了尽量减少任何可能的停机时间,您应该尽量缩短应用程序的启动时间.

通过遵循谨慎的迁移实践,可以推送新代码,然后在应用程序运行时进行迁移.以下是Rails的示例:http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

要在重新启动期间最大限度地减少连接丢失,请使用适当响应SIGTERM的webserve,方法是开始正常关闭(完成现有连接,不要使用新连接).较新版本的thin将正确处理SIGTERM.

  1. 该主题是内部讨论的主题,将来可能会发生变化.
  2. 如果仍然在运行,SIGTERM会在10秒之后跟随SIGKILL

  • 谢谢你的详细信息.你是Heroku员工吗?或者如果没有,您在哪里找到详细信息?此外,知道哪些支持的Web服务器提供了如您所描述的优雅关闭,这将是有趣的...也许这适合另一个问题. (2认同)