2010-01-05 10 views
5

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.

risposta

0

Non sembra come AMQP (o almeno RabbitMQ) sostiene l'idea di "ritardare questo lavoro." Quindi l'approccio per ri-accodare lo stesso lavoro dall'interno del lavoratore se fallisce sembra essere la soluzione migliore in questo momento.

Ho il codice che funziona in un ambiente demo e soddisfa le mie esigenze fino ad ora.

1

Avere un servizio di consegna a tempo? Dovresti inviare il messaggio per consegnarlo come carico utile, concluso con un time-to-deliver, e il servizio manterrà il messaggio fino al raggiungimento del tempo specificato. Nulla di ciò esiste nel server RabbitMQ o in nessuna delle librerie client AMQP, per quanto ne so, ma sarebbe una cosa utile da avere.

+0

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

3

Hai visto cose come Ruote e Minion?

Alcuni link qui: http://delicious.com/alexisrichardson/rabbitmq+work+ruby

Si potrebbe anche provare di sedano, che non parla nativo di Ruby, ma non parlano HTTP + JSON.

Tutti i suddetti lavori con RabbitMQ, quindi possono aiutarti.

Acclamazioni

alexis

+0

Grazie per i clienti alternativi. Preferisco stare con Ruby quando possibile e Sweatshop/Carrot ha funzionato alla grande. La loro non sembra essere una funzione di ritardo in AMQP, quindi la re-queue sembra l'opzione migliore a questo punto. Ho il codice in sviluppo che funziona come voglio, mi chiedo solo se non ci fosse un modo migliore. –

Problemi correlati