Rails延迟了工作和码头工人:增加了更多工人

时间:2017-01-21 14:51:42

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

我使用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运行我的工作容器,但这没有任何意义。它不会失败,启动但不处理作业。

有没有办法让一个容器中有单独的工人?这是对的吗?或者我应该为每个我想做的工人创建单独的容器吗?

提前Thanx!

2 个答案:

答案 0 :(得分:5)

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

单个"&"可能就是你要找的东西: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选项在单独的进程中启动多个worker。这将在单独的进程中启动3个工作程序,所有工作都从default_queue中选择作业:
bundle exec script/delayed_job --queue=default_queue -n 3 start

rake jobs:work与delayed_job脚本之间的差异:
似乎唯一的区别是rake jobs:work开始在前台处理作业,而delayed_job脚本创建一个守护程序,用于在后台处理作业。您可以使用更适合您的用例的任何一种 检查此github问题:https://github.com/collectiveidea/delayed_job/issues/659

答案 1 :(得分:1)

实际上我只是遇到了在docker上扩展delay_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