在RabbitMQ重新开始血汗工厂的工作

Nic*_*s C 5 ruby ruby-on-rails message-queue rabbitmq

我正在开发一个Rails应用程序,客户退款将交给Sweatshop工作人员.如果退款失败(因为我们当时无法联系到付款处理商),我想重新排队.

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
Run Code Online (Sandbox Code Playgroud)

有没有比上面更好的方法呢?我还没有在RabbitMQ中找到任何"延迟"功能,这是迄今为止我提出的最佳解决方案.我想在重新排队时避免繁忙的循环.

Nic*_*s C 0

AMQP(或者至少 RabbitMQ)似乎不支持“延迟这项工作”的想法。因此,如果失败,从工作线程内部重新排队相同的作业的方法似乎是目前最好的解决方案。

我的代码在演示环境中运行,到目前为止它满足了我的需求。