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.
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