11

WSGI アプリケーションでRQを使用しています。私たちが行っていることは、タスクを実行するさまざまなバックエンド サーバーにいくつかの異なるプロセスを配置し、(場合によっては) いくつかの異なるタスク サーバーに接続することです。このセットアップをより適切に構成するために、システムでカスタム管理レイヤーを使用して、ワーカーの実行、タスク キューのセットアップなどを処理します。

ジョブが失敗した場合、再試行を実装したいと考えています。これは、遅延が増加した後にジョブを数回再試行し、最終的にジョブを完了するか失敗させて、ログ システムにエラー エントリを記録します。ただし、これをどのように実装する必要があるかはわかりません。データベースにエラーを記録できるようにするカスタム ワーカー スクリプトを既に作成しており、最初の再試行の試みは次のようなものでした。

# This handler would ideally wait some time, then requeue the job.
def worker_retry_handler(job, exc_type, exc_value, tb):
    print 'Doing retry handler.'
    current_retry = job.meta[attr.retry] or 2

    if current_retry >= 129600:
        log_error_message('Job catastrophic failure.', ...)
    else:
        current_retry *= 2

        log_retry_notification(current_retry)
        job.meta[attr.retry] = current_retry
        job.save()
        time.sleep(current_retry)

        job.perform()

return False

前述したように、ワーカー ファイルには、接続先のサーバーを正しく解決し、ジョブを投稿できる関数もあります。問題は必ずしもジョブを発行する方法ではなく、例外ハンドラーで取得したジョブ インスタンスをどうするかです

どんな助けでも大歓迎です。これを行うためのより良い方法に関する提案や指針があれば、それも素晴らしいでしょう. ありがとう!

4

2 に答える 2

1

次の 2 つの問題が考えられます。

  1. 戻り値が必要です。False は、デフォルトの例外処理がジョブに発生しないようにします (このページの最後のセクションを参照してください: http://python-rq.org/docs/exceptions/ )

  2. ハンドラーが呼び出されるまでに、ジョブはキューに入れられなくなったと思います。私は 100% 肯定的ではありませんが (特に上記で指摘したドキュメントを考えると)、失敗したキューにある場合は、 requeue_job(job.id) を呼び出して再試行できます。そうでない場合 (そうではないように聞こえます)、おそらく適切なキューを取得して、直接キューに入れることができます。

于 2013-01-18T16:11:02.780 に答える
0

強いテキスト私はよりきれいな解決策を持っています

from rq import Queue, Worker
from redis import Redis

redis_conn = Redis(host=REDIS_HOST, health_check_interval=30)
queues = [
    Queue(queue_name, connection=redis_conn, result_ttl=0) 
    for queue_name in ["Low", "Fast"]
]
worker = Worker(queues, connection=redis, exception_handlers=[retry_handler])


def retry_handler(job, exc_type, exception, traceback):
    if isinstance(exception, RetryException):
        sleep(RetryException.sleep_time)
        job.requeue()
        return False

ハンドラー自体は、例外処理が完了したかどうか、またはスタック上の次のハンドラーにフォールスルーする必要があるかどうかを決定する責任があります。ハンドラーはブール値を返すことでこれを示すことができます。Falseは例外の処理を停止することを意味し、Trueは続行してスタック上の次の例外ハンドラーに進むことを意味します。

デフォルトでは、ハンドラーが明示的な戻り値を持たない (したがってNone ) 場合、これはTrueとして解釈される(つまり、次のハンドラーに進む) ことを実装者は知っておくことが重要です。

ハンドラー チェーン内の次の例外ハンドラーが実行されないようにするには、失敗しないカスタム例外ハンドラーを使用します。次に例を示します。

于 2020-09-23T16:06:34.063 に答える