2013-01-17 59 views
7

我們在使用我們的WSGI應用程序時使用了RQ。我們所做的是在運行這些任務的不同後端服務器上有幾個不同的進程,連接到(可能)幾個不同的任務服務器。爲了更好地配置此設置,我們在我們的系統中使用了一個自定義管理層,負責管理運行工作人員,設置任務隊列等。重試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 

正如我所說,我們也有在一個函數worker文件,它可以正確解析它應該連接的服務器,並且可以發佈作業。問題不一定是如何發佈作業,但做什麼與您在異常處理程序中獲取的作業實例。

任何幫助將不勝感激。如果有更好的方法可以做到這一點,那麼建議或指導也會很棒。謝謝!

+0

對不起,我不熟悉RQ - 你能提供一個鏈接到圖書館嗎? – necaris

+0

我猜你的意思是http://python-rq.org/吧? – Borys

回答

1

我看到了兩個可能的問題:

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

  2. 我認爲在您的處理程序被調用時,作業不再排隊。我不是100%肯定的(特別是考慮到我上面提到的文檔),但是如果它位於失敗的隊列中,則可以調用requeue_job(job.id)來重試它。如果它不是(它聽起來不會),你可能會抓住合適的隊列並直接排隊。