如何在我的应用程序中启动Heroku One-Off Dynos?

时间:2017-03-23 18:48:29

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

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

一个有助于减少这些内存泄漏影响的解决方案是将我们的rake任务转移到Heroku调度程序,在那里我们可以从Heroku利用他们自己独立的内存和进程来完成每个dino在再次旋转之前为我们工作。对于计划任务,这给我们提供了很大的喘息空间来隔离这些内存泄漏的影响,因为每个内存泄漏都不会影响其他人。

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

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

1 个答案:

答案 0 :(得分:1)

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

  • 如果dyno启动或不启动,你会得到api响应
  • 你可以选择dyno大小,所以它可以与你的主应用程序不同,它可以动态设置。我可以设想一个用例,当你根据你的任务大小启动不同大小的dyno时
  • 您可以传递其他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变量将身份验证令牌传递给您的应用程序,但我认为没有其他方法。使用不同的解决方案,您仍然必须通过身份验证令牌。