【问题标题】:Rails delayed job and docker: adding more workersRails 延迟工作和码头工人:增加更多工人
【发布时间】:2017-01-21 14:51:41
【问题描述】:

我使用 Docker 运行我的 rails 应用程序。延迟作业由单个工作人员处理,该工作人员在名为 worker 的单独容器中运行,工作人员在其中使用命令 bundle exec rake jobs:work 运行。

我有几种类型的作业,我想移动到一个单独的队列并为此创建一个单独的工作人员。或者至少有两个工人来处理任务。

我尝试使用env QUEUE=default_queue bundle exec rake job:work && env QUEUE=another_queue bundle exec rake job:work 运行我的工作容器,但这没有任何意义。它不会失败,会启动但不会处理作业。

有没有办法在一个容器中拥有单独的工人?它是正确的吗?还是应该为我想要制作的每个工人创建单独的容器?

提前谢谢!

【问题讨论】:

    标签: ruby-on-rails docker delayed-job


    【解决方案1】:

    运行命令command1 && command2 导致命令2 仅在命令1 完成时执行。 rake jobs:work 永远不会终止,即使它已经执行完队列中的所有作业,所以第二个命令永远不会执行。

    单个“&”可能是您要查找的内容:command1 & command2。 这将在它们自己的进程中独立运行命令。

    您应该在生产环境中使用delayed_job 脚本,最好将不同队列的工作人员放入不同的容器中,以防其中一个队列包含占用大量资源的作业。

    这将为 default_queue 启动一个延迟的作业工作者:
    bundle exec script/delayed_job --queue=default_queue start
    对于 Rails 4,它是:bundle exec bin/delayed_job --queue=default_queue start
    查看有关该主题的答案:https://stackoverflow.com/a/6814591/6006050

    您还可以使用 -n 选项在不同的进程中启动多个工作程序。这将在不同的进程中启动 3 个工作人员,所有工作都从 default_queue 中挑选:
    bundle exec script/delayed_job --queue=default_queue -n 3 start

    rake jobs:work 和延迟作业脚本之间的区别:
    似乎唯一的区别是rake jobs:work 开始在前台处理作业,而delayed_job 脚本创建一个在后台处理作业的守护进程。您可以使用更适合您的用例的那个。
    检查这个 github 问题:https://github.com/collectiveidea/delayed_job/issues/659

    【讨论】:

    • 感谢您的回答,我会尽快尝试。至于我不是 Rails 的成熟用户,请您说(或提供链接)运行rake jobs:workscript/delayed_job .. 有什么区别?另外,在我的项目中没有script 文件夹。我不是自己从头做的,我只是支持这个项目,所以我不知道为什么会这样......
    • 编辑了我的答案以添加 rake jobs:work 和 delay_job 脚本之间的区别。还补充说,对于 rails 4,它应该是 bin/delayed_job 而不是 script/delayed_job
    • 非常感谢!现在我看到了这一切。而且.. 我是对的:如果rake 在前台运行它,我们不能像bin/d_j 那样使用-n 运行几个工作?我的意思是不使用 完全 -n 而是类似于。
    • 不,我认为rake jobs:work 没有任何选项可以自动创建多个工作人员。你可以做rake jobs:work & rake jobs:work & rake jobs:work。一个更好的解决方案可能是做bin/delayed_job -n 3 run。使用“run”而不是“start”会导致它在前台运行。
    • 再次感谢您。现在我对这一切更有信心了,但我仍然觉得我必须更仔细地阅读文档:)
    【解决方案2】:

    其实我只是在docker上扩展delayed_jobs时遇到了这个问题

    有关使用任意参数启动延迟作业并侦听 SIGTERM 并在容器关闭时平滑关闭已启动作业的脚本,请参见此要点。这样您就可以根据需要执行任意数量的进程和队列。

    https://gist.github.com/jklimke/3fea1e5e7dd7cd8003de7500508364df

    #!/bin/bash
    
    # Variable DELAYED_JOB_ARGS contains the arguments for delayed jobs for, e.g. defining queues and worker pools.
    
    # function that is called when the docker container should stop. It stops the delayed job processes
    _term() {
      echo "Caught SIGTERM signal! Stopping delayed jobs !"
      # unbind traps
      trap - SIGTERM
      trap - TERM
      trap - SIGINT
      trap - INT
      # end delayed jobs 
      bundle exec "./bin/delayed_job ${DELAYED_JOB_ARGS} stop"
    
      exit
    }
    
    # register handler for selected signals
    trap _term SIGTERM
    trap _term TERM
    trap _term INT
    trap _term SIGINT
    
    echo "Starting delayed jobs ... with ARGs \"${DELAYED_JOB_ARGS}\""
    
    # restart delayed jobs on script execution
    bundle exec "./bin/delayed_job ${DELAYED_JOB_ARGS} restart"
    
    echo "Finished starting delayed jobs... Waiting for SIGTERM / CTRL C"
    
    # sleep forever until exit
    while true; do sleep 86400; done
    

    【讨论】:

      猜你喜欢
      • 2014-04-03
      • 1970-01-01
      • 2014-09-21
      • 2011-08-05
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多