2

我的Heroku Rails应用程序遭受巨大的持久性内存泄漏(900mb或更高)的伤害,我有Sidekiq后台作业。这些内存泄漏在这些任务运行后会保留在我的Worker Dynos中,除非我或Heroku重新启动我的工人dyno(例如24小时后),否则会导致它们在我的Worker dyno中触发许多R14甚至R15错误。如何从我的应用程序中启动Heroku One-Off Dynos?

减少这些内存泄漏影响的一个解决方案是将我们的rake任务移动到Heroku调度程序,在Heroku调度程序中我们可以从Heroku中获益,使用他们自己单独的内存和要执行的过程来旋转一次性dynos每一份工作都需要我们再次下调。对于计划的任务,这给了我们很大的喘息空间来隔离这些内存泄漏的影响,因为每个内存泄漏都不会影响其他人。

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

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

回答

0

我不确定这是否会起作用,但这里是我的想法如何做到这一点。 首先,我有类似的问题。在我的项目中,我必须发送大量电子邮件,内存峰值从70%上升到130%,并保持在那里,直到我重新启动。

所以这是主意。 我会从调用bash脚本轨内调用rake任务:

task :run_dyno do 
    sh "heroku run:detached rake my_task:do_the_job" 
    # run a shell command from inside my rake task 
end 

task :do_the_job do 
    # my email sending logic 
end 

在我控制我所说的第一个rake任务,然后在一次性测功机上运行的第二个任务。当然,我将不得不首先对此进行测试,但如果你愿意的话,你也可以尝试一下。

1

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

  • 您将获得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变量你的应用程序,但没有其他办法,我想。使用不同的解决方案,您仍然必须通过身份验证令牌。

相关问题