【问题标题】:How to spin up Heroku One-Off Dynos from within my app?如何从我的应用程序中启动 Heroku One-Off Dynos?
【发布时间】:2017-08-16 12:14:34
【问题描述】:

我的 Heroku Rails 应用程序中的 Sidekiq 后台作业遭受巨大的持续内存泄漏(900mb 或更高)。在这些任务运行后,这些内存泄漏留在我的 Worker Dynos 中,导致它们在我的 Worker dyno 中触发许多 R14 甚至 R15 错误,除非我或 Heroku 重新启动我的 Worker dyno(例如 24 小时后)。

一个有效减少这些内存泄漏影响的解决方案是将我们的 rake 任务转移到 Heroku 调度程序,在那里我们可以受益于 Heroku 使用它们自己的单独内存和进程来运行 One-Off dynos 来完成每个任务在再次减速之前为我们工作。对于计划任务,这给了我们很大的喘息空间来隔离这些内存泄漏的影响,因为每个任务都不会影响其他任务。

但是,我们的许多内存密集型后台作业无法移动到 Heroku 调度程序,因为它们是由于人们在我们的应用程序中执行的操作而触发的。

如何将应用触发的后台作业移至 Heroku One-Off Dynos?

【问题讨论】:

    标签: ruby-on-rails heroku memory-leaks background-process heroku-toolbelt


    【解决方案1】:

    IHMO 最好的方法是使用Heroku API。这种方法有很多优点:

    • 无论是否启动 dyno,您都会收到 api 响应
    • 您可以选择测功机大小,因此它可以与您的主应用程序不同,并且可以动态设置。当您根据任务大小启动不同大小的测功机时,我可以想象一个用例
    • 您可以传递额外的 ENV 变量,因此您可以将其视为参数
    • 您可以设置生存时间

    这是来自文档的示例请求(缺少身份验证令牌):

    curl -n -X POST https://api.heroku.com/apps/$APP_ID_OR_NAME/dynos \
      -d '{
        "attach": true,
        "command": "bash",
        "env": {
          "COLUMNS": "80",
          "LINES": "24"
        },
        "force_no_tty": null,
        "size": "standard-1X",
        "type": "run",
        "time_to_live": 1800
      }' \
    -H "Content-Type: application/json" \
    -H "Accept: application/vnd.heroku+json; version=3"
    

    一个可能的缺点是您需要通过 ENV 变量将身份验证令牌传递给您的应用程序,但我认为没有其他方法。使用不同的解决方案,您仍然需要传递身份验证令牌。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 2012-11-10
      • 2014-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多