Tôi đang làm việc trên một ứng dụng Rails nơi hoàn trả khách hàng được giao cho một công nhân Sweatshop. Nếu khoản tiền hoàn lại không thành công (vì chúng tôi không thể liên lạc với bộ phận xử lý thanh toán tại thời điểm đó), tôi muốn thực hiện lại công việc.requeue một công việc buôn bán tại RabbitMQ
class RefundWorker < Sweatshop::Worker
def process_refund(job)
if refund
Transaction.find(job[:transaction]).update_attributes(:status => 'completed')
else
sleep 3
RefundWorker.async_process_refund(job) # requeue the job
end
end
Có cách nào tốt hơn để thực hiện điều này không? Tôi đã không tìm thấy bất kỳ "chậm trễ" tính năng trong RabbitMQ, và đây là giải pháp tốt nhất tôi đã đưa ra cho đến nay. Tôi muốn tránh một vòng lặp bận rộn trong khi requeueing.
cần tây làm điều này cho các tác vụ với eta/đếm ngược. Nó chỉ giữ các thông báo, và có một trình lập lịch biểu thực hiện các nhiệm vụ khi eta được đáp ứng. Vì các thông báo cần được thừa nhận, việc giữ chúng không phải là vấn đề, mặc dù nó khá kỳ quặc khi sử dụng số lượng tìm nạp QoS, vì chúng ta phải tăng số lần tìm nạp trước mỗi khi nhận được một tin nhắn với eta và giảm khi thông điệp eta đã được xử lý. – asksol