2010-01-05 36 views
5

'da bir terfi işi yeniden işleme Müşteri geri ödemelerinin bir Sweatshop çalışanına teslim edildiği bir Rails uygulaması üzerinde çalışıyorum. Geri ödeme başarısız olursa (o anda ödeme işlemcisine ulaşamıyoruz çünkü) işi yeniden yapmak istiyorum.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 

Bunu yapmaktan daha iyi bir yolu var mı? RabbitMQ'da hiçbir "gecikme" özelliği bulamadım ve bu şimdiye kadar ortaya koyduğum en iyi çözüm. Requeueing sırasında yoğun bir döngüden kaçınmak istiyorum.

cevap

0

Alexis fikrini desteklediğini "Bu işi geciktirir." Yani aynı işi tekrar işten atma yaklaşımı, işçinin içinde başarısız olursa, bu zamanda en iyi çözüm gibi görünüyor.

Kodun bir demo ortamında çalışıyorum ve şu ana kadar gereksinimlerim karşılanıyor.

1

Zamanında teslimat hizmeti var mı? İletiyi, gönderilecek bir teslim ile sarılmış olarak teslim edecek şekilde gönderirsiniz ve belirtilen zamana ulaşılana kadar servisin mesajı bekler. RabbitMQ sunucusunda ya da AMQP istemci kütüphanelerinden herhangi birinin, bildiğim kadarıyla var olduğu gibi bir şey yok, ama sahip olmak yararlı bir şey olurdu.

+0

kereviz bunu bir eta/geri sayım ile gerçekleştirir. Sadece mesajlara dayanıyor ve eta yerine getirildiğinde görevleri yürüten bir zamanlayıcı var. Mesajların onaylanması gerektiğinden, bunlara bağlı kalmak bir sorun değildir, ancak QoS ön alım sayıları kullanılırken ilginçtir, çünkü eta'lı bir mesaj her alındığında ön yükleme sayımını arttırmalı ve eta mesajı işlendi. – asksol

3

Ruote ve Minion gibi şeylere baktınız mı? Burada

bazı bağlantılar: http://delicious.com/alexisrichardson/rabbitmq+work+ruby

Ayrıca yerli Ruby bilmiyor ama HTTP + JSON konuşur kereviz deneyebilirsin.

Yukarıdaki tüm çalışmalar RabbitMQ ile size yardımcı olabilir.

Alkış

O AMQP (veya en azından RabbitMQ) gibi görünmüyor

+0

Alternatif müşteriler için teşekkür ederiz. Mümkün olduğunda bir Ruby'ye yapışmayı çok seviyorum ve Sweatshop/Havuç harika çalışıyor. AMQP'de bir gecikme işlevi görünmüyor, bu nedenle yeniden sıra bu noktada en iyi seçenek gibi görünüyor. İstediğim gibi geliştirme çalışmasında kod var, sadece daha iyi bir yol olmadığını merak ediyorum. –