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

时间:2010-01-05 13:04:19

标签: ruby-on-rails ruby 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

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

3 个答案:

答案 0 :(得分:3)

你看过Ruote和Minion这样的东西吗?

这里有一些链接:http://delicious.com/alexisrichardson/rabbitmq+work+ruby

您也可以尝试Celery,它不会说本机Ruby但会说HTTP + JSON。

所有上述工作都与RabbitMQ有关,所以可以帮到你。

干杯

亚历

答案 1 :(得分:1)

有定时送货服务吗?您将消息作为有效负载发送,包含一个交付时间,服务将保留消息,直到达到指定的时间。就我所知,RabbitMQ服务器或任何AMQP客户端库中都没有类似的东西,但它是一个有用的东西。

答案 2 :(得分:0)

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

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