Khi chúng tôi khởi động lại hoặc triển khai, chúng tôi nhận được một số công việc Resque trong hàng đợi không thành công với Resque::TermException (SIGTERM)
hoặc Resque::DirtyExit
.Phục hồi sạch từ Resque :: TermException hoặc SIGTERM trên Heroku
Chúng tôi đang sử dụng mới TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10
trong Procfile của chúng tôi để dòng người lao động của chúng tôi trông giống như:
worker: TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake environment resque:work QUEUE=critical,high,low
Chúng tôi cũng đang sử dụng resque-retry
mà tôi nghĩ có thể tự động thử lại trên hai trường hợp ngoại lệ này? Nhưng có vẻ như không.
Vì vậy, tôi đoán hai câu hỏi:
- Chúng tôi bằng tay có thể giải cứu từ
Resque::TermException
trong từng công việc, và sử dụng để sắp xếp lại công việc. Nhưng liệu có cách nào sạch sẽ để làm điều này cho mọi công việc? Ngay cả một miếng vá khỉ. - Không nên khởi động lại, thử lại tự động thử lại các tính năng này? Bạn có thể nghĩ ra bất kỳ lý do gì tại sao nó không?
Cảm ơn!
Chỉnh sửa: Nhận tất cả công việc cần hoàn thành trong chưa đầy 10 giây có vẻ không hợp lý về quy mô. Có vẻ như cần phải có một cách để tự động sắp xếp lại các công việc này khi ngoại lệ Resque :: DirtyExit được chạy.
upvoted và chấp nhận - Tôi thành thật không chắc chắn nếu chúng ta có thể nhận được tất cả dưới 10 giây mặc dù. Chúng tôi có một số hàng xuất khẩu lớn vv mà cần phải tạo ra một tập tin. Tái enqueueing có vẻ như nó giải quyết điều này mặc dù? Bạn có thể chia sẻ sự khác nhau giữa 'Resque :: TermException' và' Resque :: DirtyExit' hay không. Tôi có một giải cứu trong đó cho 'Resque :: DirtyExit' nhưng nó không có vẻ luôn luôn tái enqueue. Cảm ơn! –
Là một bản cập nhật, họ kỳ lạ không giải cứu những ngoại lệ đó một cách rõ ràng đôi khi mặc dù có 'giải cứu Resque :: DirtyExit' trong công việc. Tôi đã không thể tìm ra lý do tại sao. Điều này làm cho công việc của chúng tôi không đáng tin cậy vì chúng tôi vẫn tìm thấy chúng trong hàng đợi không thành công với ngoại lệ Resque :: DirtyExit. Nó thực sự trở thành một vấn đề –
Ai đó có thể giới thiệu cách nhân viên xử lý SIGTERM bên trong nhân viên để người lao động có thể tự tắt nó không? Ví dụ, công nhân (resque) cũng bẫy SIGTERM và đặt một số biến mà mã lặp định kỳ kiểm tra? Im giả định rằng TermException hoặc DirtyException chỉ được gọi sau RESQUE_TERM_TIMEOUT secnds. –