2010-01-05 8 views
5

Ich arbeite an einer Rails-Anwendung, wo Kundenrückerstattungen an einen Sweatshop Arbeiter übergeben werden. Wenn eine Rückerstattung fehlschlägt (weil wir den Zahlungsprozessor zu diesem Zeitpunkt nicht erreichen können), möchte ich den Auftrag erneut anfordern.requeue einen Sweatshop-Job in 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 

Gibt es einen besseren Weg als oben? Ich habe in RabbitMQ keine "Verzögerung" -Funktion gefunden, und dies sind die besten Lösungen, die ich bisher entwickelt habe. Ich möchte eine beschäftigte Schleife vermeiden, während ich requeueeing.

Antwort

0

Es ist nicht wie AMQP scheint (oder zumindest RabbitMQ) unterstützt die Idee von "diesen Job verzögern." Daher scheint der Ansatz, den gleichen Job innerhalb des Arbeiters erneut einzutragen, wenn er fehlschlägt, zur Zeit die beste Lösung zu sein.

Ich habe den Code in einer Demoumgebung arbeiten und es erfüllt meine Bedürfnisse so weit.

1

Haben Sie einen zeitgesteuerten Lieferservice? Sie würden die Nachricht senden, um als Payload zu liefern, verpackt mit einer Zeit bis zur Auslieferung, und der Dienst würde die Nachricht beibehalten, bis die angegebene Zeit erreicht wurde. Nichts dergleichen existiert auf dem RabbitMQ-Server oder in einer der AMQP-Client-Bibliotheken, soweit mir bekannt ist, aber es wäre eine nützliche Sache zu haben.

+0

Sellerie tut dies für Aufgaben mit einem Eta/Countdown. Es hält nur an den Nachrichten fest, und es gibt einen Scheduler, der die Aufgaben ausführt, wenn das Eta erfüllt ist. Da die Nachrichten quittiert werden müssen, ist das Festhalten kein Problem, obwohl es bei der Verwendung von QoS-Prefetch-Zählungen etwas merkwürdig ist, da wir den Prefetch-Zähler jedesmal erhöhen müssen, wenn eine Nachricht mit einem Eta empfangen wird Die ETA-Nachricht wurde verarbeitet. – asksol

3

Haben Sie Dinge wie Ruote und Minion angeschaut?

Einige Links hier: http://delicious.com/alexisrichardson/rabbitmq+work+ruby

Sie auch Sellerie versuchen könnten, die nicht nativen Rubin spricht aber HTTP + JSON spricht.

Alle oben genannten arbeiten mit RabbitMQ, so kann Ihnen helfen.

Prost

alexis

+0

Vielen Dank für die alternativen Kunden. Ich bleibe lieber bei einem Ruby, wann immer möglich und Sweatshop/Carrot hat super funktioniert. In AMQP scheint es sich nicht um eine Verzögerungsfunktion zu handeln, daher scheint die erneute Warteschlange zu diesem Zeitpunkt die beste Option zu sein. Ich habe den Code in der Entwicklung so, wie ich will, frage mich nur, ob es keinen besseren Weg gibt. –