[英]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.