簡體   English   中英

Rails 延遲作業和 docker:添加更多工人

[英]Rails delayed job and docker: adding more workers

我使用 Docker 運行我的 rails 應用程序。 延遲作業由一個單獨的 worker 處理,該 worker 運行在一個名為worker的單獨容器中,在其中 worker 使用命令bundle exec rake jobs:work

我有幾種類型的作業,我想將它們移動到單獨的隊列並為此創建一個單獨的工作器。 或者至少有兩個工人來處理流程任務。

我嘗試使用env QUEUE=default_queue bundle exec rake job:work && env QUEUE=another_queue bundle exec rake job:work運行我的工作容器,但這沒有任何意義。 它不會失敗,會啟動但不會處理作業。

有沒有辦法在一個容器中放置單獨的工人? 它是正確的嗎? 或者我應該為我想要制作的每個工人創建單獨的容器?

提前謝謝!

運行命令command1 && command2導致 command2 僅在 command1 完成時執行。 rake jobs:work 永遠不會終止,即使它已經完成了隊列中的所有作業,所以第二個命令永遠不會執行。

單個“&”可能就是您要查找的內容: command1 & command2 這將在它們自己的進程中獨立運行命令。

您應該在生產中使用 delay_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和 delay_job 腳本之間的差異:
似乎唯一的區別是rake jobs:work在前台開始處理作業,而 delay_job 腳本創建了一個在后台處理作業的守護進程。 您可以使用更適合您的用例的任何一種。
檢查這個 github 問題: https : //github.com/collectiveidea/delayed_job/issues/659

實際上,我剛剛在 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM