在 heroku 上随机推送并行停止

Push parallelization stop randomly on heroku

我想向我的所有用户(大约 500k)发送一个推送活动,但是 heroku dyno 在执行过程中随机停止(我使用的是一次性 dyno,没有引发异常)。 我正在使用 gem Parallel :

User.where(some_stuff).find_in_batches(batch_size: 1000) do |group|
  Parallel.each(group, in_threads: 8) do |u|
    u.push('hi') # pushing the message via GCM or APN
  end
end

在我测试的所有情况下,进程在批处理结束时停止,但在使用 batch_sizein_threads 值时我找不到模式。

push 函数不需要数据库访问权限,但也许 find_in_batch 函数因为连接太多而被拒绝?

我使用 performance-l dyno 和 14GB RAM

您不应在应用程序服务器进程中进行长时间的 运行 操作。应用程序服务器将 thread/process 附加到传入请求,并将清除您在请求处理结束时生成的任何线程。你应该在后台做长时间的 运行 操作。看看 sidekik 或 resque。

当激活 Heroku log-runtime-metrics 时,我可以看到 memory_pgpinmemory_pgpout 在执行过程中变化很大:

memory_pgpin : 19 24073 998

memory_pgpout : 22212 784

我想这是我的 postgres 计划的问题,但如果您有进一步的解释,请不要犹豫 post 一个答案。