2024年5月7日火曜日

RQ でジョブがエラーになった際の挙動を確認する

RQ でジョブがエラーになった際の挙動を確認する

概要

ジョブ内で raise した際の挙動を確認してみました

環境

  • macOS 11.7.10
  • Python 3.11.6
  • rq 1.16.1

サンプルコード

エンキューする側のコードは以下です

from datetime import timedelta

from redis import Redis
from rq import Queue
from rq_scheduler import Scheduler

from lib.util import Message

queue = Queue("default", connection=Redis(host="192.168.1.2"))
scheduler = Scheduler(queue=queue, connection=queue.connection)


scheduler.enqueue_in(timedelta(seconds=5), Message().say, msg="hello")

ジョブは単純に raise するようにしています

import time


class Message:
    def say(self, **kwargs):
        print("Start say")
        print(kwargs)
        time.sleep(10)
        raise ValueError()
        # print("End say")

起動

  • pipenv run rq worker
  • pipenv run rqscheduler
  • pipenv run app.py

動作確認

failed のジョブを確認

redis 内のキーの情報を確認すると failed したジョブの情報が格納されています

1) "rq:job:2c380d9c-c65b-41b8-8d92-3b85135782c0"
2) "rq:results:2c380d9c-c65b-41b8-8d92-3b85135782c0"
3) "rq:failed:default"
4) "rq:scheduler_instance:e276ed31a4434691b91c426e979a9e4d"
5) "rq:worker:86f028648da249c38de683f8ce10f865"
6) "rq:queues"

失敗したジョブは zset としてジョブIDが格納されています

127.0.0.1:6379> zrange rq:failed:default 0 -1
1) "2c380d9c-c65b-41b8-8d92-3b85135782c0"

結果には何も格納されていませんでした

ワーカーは自動でリトライすることはなさそう

オプションを付与していない限りリトライはしないようです

なおワーカー、スケジューラを再起動しても特にリトライはしませんでした

失敗したジョブの情報を確認するスクリプト

FailedJobRegistry として管理されています
以下のスクリプトを実行すると失敗したジョブの情報を一覧で表示してくれます

from redis import Redis
from rq import Queue
from rq.job import Job
from rq.registry import FailedJobRegistry

redis = Redis()
queue = Queue(connection=redis)
registry = FailedJobRegistry(queue=queue)

# Show all failed job IDs and the exceptions they caused during runtime
for job_id in registry.get_job_ids():
    job = Job.fetch(job_id, connection=redis)
    print(job_id, job.exc_info)

最後に

rq では基本はリトライせず失敗したジョブは別途管理されるようです

参考サイト

0 件のコメント:

コメントを投稿