長時間実行ジョブをキューイングする最善の方法

そこで、Ansible を起動して Discourse のインストールを行うプラグインを作成しました(WordPress を使って インストール注文 を受注するのは、本当にやめたいのです!)。

当初は fork を呼び出して起動していましたが、テストでは問題なく動作しました。しかし、より「Discourse らしい方法」で行うべきだと考えました。

そこで、プロセスを実行するワンオフジョブを作成しましたが、以下のように終了されてしまいます。

E, [2020-12-16T12:53:39.662683 #3158277] ERROR -- : worker=0 PID:3158425 timeout (61s > 60s), killing

クラスに sidekiq_options queue: 'low' を追加し、さらにジョブを実行する関数にも追加してみました。

その後、ジョブでプロセスを実行するのではなく、モデル内で直接実行するように変更しました。

         Discourse::Utils.execute_command(*instructions)

rails c から実行すれば問題なく動作しますが、Ubuntu 開発環境(./bin/unicorn で起動)でどのように実行しても、終了されてしまいます。

「いいね!」 1

ワンショットジョブは、文字通り一度だけ実行されるジョブです。あなたが必要なのは、リクエストがコントローラーに到達するなど、トリガーによってスケジュールされる通常ジョブのようです。

通常ジョブは、通常の使用状況で一部が60秒を超える場合があるため、60秒以上実行される可能性があります。

「いいね!」 1

さて、通常のジョブに変更し、./bin/unicorn の代わりに ./bin/rails s で実行してみましたが、依然として解決しませんでした。

これは理にかなっていません。多くのジョブが1分以上かかることはよく知っているからです。

ジョブは具体的にどのように実行していますか?関連する Ruby コードの一部を貼り付けていただけますか?

もちろん!

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/jobs/regular/create_droplet.rb

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/models/pfaffmanager/server.rb#L150-L172

なぜ、https://github.com/pfaffman/discourse-pfaffmanager/blob/49f7369b1dc0b1c8f63065b14c92ac7ecc3ab2b3/app/models/pfaffmanager/server.rb#L146 では、

Jobs::CreateDroplet.new.execute(server_id: id)

ではなく、

Jobs.enqueue(:create_droplet, server_id: id)

を使用しているのでしょうか?

「いいね!」 2

だから質問しなければならないのです!私は単なる原始人だからです。(洞窟に住んでいる方々に失礼な意図はありません。)

もちろん、理由はありません。ただ、どう呼び出せばよいのかがわからなかったのです!

本当にありがとうございます!

…そして、まだ実行中です!…

本当にありがとうございます。これだけでも数時間かかりました…

次のステップ:実際の本番サーバーで実行すること…

「いいね!」 4