只是想知道每个人如何在 Heroku 上将更新推送到他们的生产服务器,而不会使应用程序停机几秒钟?
推送到 Heroku(尤其是使用 Unicorn 之类的东西)需要一段时间才能加载 Web 应用程序。特别是当有最终用户试图访问该站点时。它们最终有 503 页。加载 Unicorn 进程最多需要 30 秒到一分钟。
只是想知道每个人如何在 Heroku 上将更新推送到他们的生产服务器,而不会使应用程序停机几秒钟?
推送到 Heroku(尤其是使用 Unicorn 之类的东西)需要一段时间才能加载 Web 应用程序。特别是当有最终用户试图访问该站点时。它们最终有 503 页。加载 Unicorn 进程最多需要 30 秒到一分钟。
要完成此任务,您需要做两件事,而且这不是微不足道的。
1) 迁移需要向后兼容(即,在应用程序运行时运行)。请参阅这篇文章:http: //pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/
2) 使用两个 heroku 应用程序进行部署。我向 Heroku 开了一张关于这个主题的票,这是他们的回复:
我们目前正在研究一种解决方案,以提供零停机时间部署,但没有关于何时可用的 ETA。
同时,可能的解决方法是部署到两个单独的应用程序。您可以将新代码推送到第二个应用程序,启动它,然后将域名移动到第二个应用程序。清洗并在下一次部署时重复。这不太理想,但可能会在过渡期间为您提供所需的结果。
如果你这样做,你会希望尽可能地自动化,因为有很多方法可以把它搞砸。这是关于该主题的文章: http: //casperfabricius.com/site/2009/09/20/manage-and-rollback-heroku-deployments-capistrano-style/
这两个解决方案都必须完成,因为数据库迁移必须在代码的两个(实时和待实时)版本中工作。一旦你有这个工作,那么你就可以解决第二个问题,即应用程序本身似乎没有出现故障。一旦开始推送,没有支持的方式来旋转和旋转单个测功机。
更新: Heroku 现在提供了一个 beta 功能。要在推送之前使用,请执行以下操作:
heroku labs:enable -a APP_NAME preboot
这将改变应用程序在推送期间的行为。它将启动一个预热两分钟的并行实例。推送后几乎整整两分钟,所有流量都将路由到新应用程序。正如我上面提到的,小心迁移,因为它们仍然是一个问题。