Heroku 部署流程到底是如何运作的?

发布于 2024-12-11 09:46:52 字数 642 浏览 0 评论 0原文

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

假设我现在有 N 个在线网络测功机,其中 M 个当前正在处理请求。

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

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

When I deploy a new version of my service to Heroku, what happens exactly?

Suppose I have N web dynos online right now, M of them currently servicing requests.

  • Do all of them shut down before the new version starts coming online? What happens to any pending requests currently being serviced?
  • Is there downtime? (let's assume I just have a stateless service without any migrations)
  • Is there a hook for doing custom migrations (e.g. migrate database tables)?
  • Can I bring up N servers running the new version, have them start servicing requests, and bring the previous N servers down only once they're not servicing any requests?
  • Does the answer depend on the stack/language? (Aspen/Bamboo/Cedar, Ruby/Node.js/Java/...)

I didn't any official documentation about this, just contrary posts (some saying hot migrations are not possible, while others say there is no downtime). Are there any official details about the deployment process and the questions above?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

任性一次 2024-12-18 09:46:52

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

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

一般要点是,为了最大限度地减少任何可能的停机时间,您应该最大限度地减少应用程序的启动时间。

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

要最大程度地减少重新启动期间丢失的连接,请使用通过启动一个适当响应 SIGTERM 的网络服务器正常关闭(完成现有连接,不接受新连接)。较新版本的 thin 将正确处理 SIGTERM。

  1. 这个主题是内部讨论较多的话题,可能会
    未来的改变。
  2. SIGTERM 10 秒后紧接着 SIGKILL 如果
    仍在运行

Here is what happens during a Heroku deploy (current as of 10/20/2011*)[1]:

  • Heroku receives your git push
  • A new release is compiled from the latest version of your app and stored
  • [These happen roughly simultaneously]
    • The dyno grid is signalled to terminate[2] all running processes for your app
    • The dyno grid is signalled to start new processes for your app
    • The dyno grid is signalled to unidle all idle processes of your app
    • The HTTP router is signalled to begin routing HTTP traffic to the web dynos running the new release

The general takeaway is that to minimize any possible downtime you should minimize the boot time of your app.

By following careful migration practices, it is possible to push new code and then migrate while the app is running.
Here's an example for Rails: http://pedro.herokuapp.com/past/2011/7/13/rails_migrations_with_no_downtime/

To minimize dropped connections during a restart, use a webserve that responds appropriately to SIGTERM by beginning a graceful shutdown (finish existing connections, dont take new ones). Newer versions of thin will handle SIGTERM correctly.

  1. This subject is the topic of much discussion internally and may
    change in the future.
  2. SIGTERM followed 10s later by SIGKILL if
    still running
撩起发的微风 2024-12-18 09:46:52

我可以回答“是否有一个用于执行自定义迁移(例如迁移数据库表)的钩子?”这个问题的一部分。我通过编写一个 shell 脚本来处理运行迁移,该脚本在发出“git push heroku”后立即执行“heroku rake db:migrate”。我不知道是否还有更“钩子”的方法可以做到这一点。

I can answer "Is there a hook for doing custom migrations (e.g. migrate database tables)?" part of this question. I've handled running migrations by writing a shell script that does a "heroku rake db:migrate" immediately after I issue "git push heroku". I don't know if there is a more "hook" - y way to do that.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文