簡體   English   中英

在 RQ 中重試失敗的作業

[英]Retrying failed jobs in RQ

我們在 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

正如我所提到的,我們在工作文件中還有一個函數,它可以正確解析它應該連接的服務器,並且可以發布作業。 問題不一定是如何發布作業,而是如何處理您在異常處理程序中獲得的作業實例。

任何幫助將不勝感激。 如果有關於更好的方法的建議或指示,也會很棒。 謝謝!

我看到兩個可能的問題:

  1. 你應該有一個返回值。 False 可防止作業發生默認異常處理(請參閱本頁的最后一部分: http : //python-rq.org/docs/exceptions/

  2. 我認為當您的處理程序被調用時,作業不再排隊。 我不是 100% 肯定(特別是考慮到我上面提到的文檔),但是如果它在失敗的隊列中,您可以調用 requeue_job(job.id) 重試它。 如果不是(聽起來好像不會),您可能可以獲取正確的隊列並直接入隊。

強文本我有一個更漂亮的解決方案

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 (即繼續下一個處理程序)。

要防止處理程序鏈中的下一個異常處理程序執行,請使用不會失敗的自定義異常處理程序,例如:

暫無
暫無

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

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