代码之家  ›  专栏  ›  技术社区  ›  Jérôme Boé

在heroku上随机按下并行停止

  •  1
  • Jérôme Boé  · 技术社区  · 10 年前

    我想向我的所有用户发送一个推送活动(大约500k),但heroku dyno在执行过程中会随机停止(我使用的是一次性dyno,没有出现例外)。 我在用宝石 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_size in_threads 价值观

    这个 push 函数不需要数据库访问,但可能 find_in_batch 函数因连接太多而被拒绝?

    我使用 performance-l dyno,14GB RAM

    2 回复  |  直到 10 年前
        1
  •  0
  •   nakhli    10 年前

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

        2
  •  0
  •   Jérôme Boé    10 年前

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

    内存_pgpin: 19 240 73 998

    内存_pgpout: 222 12 784

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