如何在不放下应用的情况下推送到Heroku

Chr*_*ini 6 ruby-on-rails heroku ruby-on-rails-3

只是想知道每个人如何在Heroku上将更新推送到他们的生产服务器,而不会让应用程序停机几秒钟?

推送到Heroku(特别是使用像Unicorn这样的东西)需要一段时间才能加载Web应用程序.特别是当有最终用户试图访问该网站时.他们最终得到503页.加载Unicorn进程需要30秒到一分钟.

Mic*_*ono 6

你需要做两件事才能做到这一点,这并非易事.

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现在提供测试版功能.要在推送之前执行以下操作:

heroku labs:enable -a APP_NAME preboot

这将在推送期间更改应用程序的行为.它将推升一个将热身两分钟的并行实例.推送几乎两分钟后,所有流量都将路由到新的应用程序.如上所述,请注意迁移,因为它们仍然是一个问题.