Sto lavorando a un'applicazione Rails in cui i rimborsi dei clienti vengono consegnati a un lavoratore Sweatshop. Se un rimborso non riesce (perché non siamo in grado di raggiungere il processore di pagamento in quel momento), voglio ri-interrogare il lavoro.riaccodare un lavoro di produzione 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
C'è un modo migliore per farlo rispetto a quello sopra? Non ho trovato alcuna funzione di "delay" in RabbitMQ, e questa è la soluzione migliore che ho trovato finora. Voglio evitare un ciclo occupato durante la riaccensione.
sedano fa questo per attività con un eta/conto alla rovescia. Si limita a conservare i messaggi, e c'è uno schedulatore che esegue le attività quando l'eta è soddisfatta. Dato che i messaggi devono essere riconosciuti, non è un problema tenerli, anche se è un po 'strano quando si usano i conteggi di prefetch di QoS, dato che dobbiamo incrementare il conteggio di prefetch ogni volta che viene ricevuto un messaggio con un eta e diminuirlo quando il messaggio eta è stato elaborato. – asksol