2010-01-05 38 views
5

我正在Rails应用程序中将客户退款交给血汗工厂工人。如果退款失败(因为我们当时无法到达付款处理器),我想重新安排工作。要求在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 

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

回答

0

它似乎并不像AMQP(或至少的RabbitMQ)支持的想法“拖延这项工作。”因此,如果失败的话,从工人内部重新排列相同工作的方法似乎是目前最好的解决方案。

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

1

是否有定时送货服务?您将发送消息作为有效负载进行交付,并包含交付时间,并且该服务将保留该消息,直到达到指定的时间。就我所知,在RabbitMQ服务器或任何AMQP客户端库中都不存在这样的内容,但它是一件有用的事情。

+0

芹菜这样做的任务与eta /倒计时。它只是保留消息,并且有一个调度程序在满足eta时执行任务。由于这些消息需要被确认,因此在使用QoS预取计数时有点古怪,因为每次收到一个带有eta的消息时都必须增加预取计数,并在eta消息已被处理。 – asksol 2010-02-01 16:30:50

3

你看过类似Ruote和Minion的东西吗?

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

您也可以尝试芹菜不说话本地Ruby但说话HTTP + JSON。

以上所有与RabbitMQ工作,所以可以帮助你。

干杯

亚历克西斯

+0

谢谢你的替代客户。只要有可能,我真的很喜欢Ruby,而Sweatshop/Carrot一直在努力工作。它们似乎不是AMQP中的延迟功能,因此重新排队似乎是此时的最佳选择。我有开发中的代码正在工作,只是想知道是否没有更好的方法。 – 2010-01-10 14:45:24