2013-01-17 27 views
7

Chúng tôi đang sử dụng RQ bằng ứng dụng WSGI của chúng tôi. Những gì chúng tôi làm là có nhiều quy trình khác nhau trong các máy chủ back-end khác nhau chạy các tác vụ, kết nối với (có thể) một số máy chủ tác vụ khác nhau. Để cấu hình tốt hơn thiết lập này, chúng tôi đang sử dụng một lớp quản lý tùy chỉnh trong hệ thống của chúng tôi, quản lý các công việc đang chạy, thiết lập hàng đợi công việc, v.v.Thử lại các công việc thất bại trong RQ

Khi công việc thất bại, chúng tôi muốn thực hiện thử lại một công việc nhiều lần sau một sự chậm trễ gia tăng, và cuối cùng hoặc hoàn thành nó hoặc có nó thất bại và đăng nhập một mục nhập lỗi trong hệ thống khai thác gỗ của chúng tôi. Tuy nhiên, tôi không chắc làm thế nào điều này nên được thực hiện. Tôi đã tạo ra một kịch bản lao động tùy chỉnh cho phép chúng tôi để đăng nhập lỗi cơ sở dữ liệu của chúng tôi, và nỗ lực đầu tiên của tôi tại retry là một cái gì đó dọc theo dòng này:

# 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 

Như tôi đã đề cập, chúng tôi cũng có một chức năng trong tệp công nhân xử lý chính xác máy chủ mà nó sẽ kết nối và có thể đăng công việc. Vấn đề không nhất thiết phải là cách xuất bản một công việc, nhưng phải làm gì với trường hợp công việc mà bạn nhận được trong trình xử lý ngoại lệ.

Mọi trợ giúp sẽ được đánh giá cao. Nếu có gợi ý hay gợi ý về cách tốt hơn để làm điều này cũng sẽ rất tuyệt. Cảm ơn!

+0

Tôi rất tiếc, tôi không quen với RQ - bạn có thể cung cấp liên kết tới thư viện không? – necaris

+0

Tôi đoán bạn có nghĩa là http://python-rq.org/ phải không? – Borys

Trả lời

1

tôi thấy hai vấn đề có thể:

  1. Bạn nên có một giá trị trả về. Sai ngăn cản việc xử lý ngoại lệ mặc định xảy ra với công việc (xem phần cuối cùng trên trang này: http://python-rq.org/docs/exceptions/)

  2. Tôi nghĩ rằng thời gian xử lý của bạn được gọi là công việc không còn được xếp hàng. Tôi không phải là 100% tích cực (đặc biệt là cho các tài liệu mà tôi chỉ đến ở trên), nhưng nếu nó trên hàng đợi thất bại, bạn có thể gọi requeue_job (job.id) để thử lại nó. Nếu nó không phải (mà nó âm thanh như nó sẽ không được), bạn có thể có thể lấy hàng đợi thích hợp và enqueue trực tiếp.