2010-01-05 7 views
5

Estoy trabajando en una aplicación de Rails donde los reembolsos de clientes se entregan a un trabajador de la maquiladora. Si falla un reembolso (porque no podemos comunicarnos con el procesador de pagos en ese momento) quiero volver a ponerle el pedido en el trabajo.vuelva a colocar un trabajo de explotación en 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 

¿Hay alguna manera mejor de hacer esto que arriba? No he encontrado ninguna característica de "demora" en RabbitMQ, y esta es la mejor solución que he encontrado hasta ahora. Quiero evitar un bucle ocupado mientras realizo la recarga.

Respuesta

0

No parece como AMQP (o al menos RabbitMQ) apoya la idea de "retrasar este trabajo." Entonces, el enfoque para volver a poner en cola el mismo trabajo desde el interior del trabajador si falla, parece ser la mejor solución en este momento.

Tengo el código funcionando en un entorno de demostración y satisface mis necesidades hasta el momento.

1

¿Tiene un servicio de entrega programada? Enviarías el mensaje para entregar como carga útil, envuelto con un tiempo de entrega, y el servicio retendría el mensaje hasta que se alcanzara el tiempo especificado. Nada de eso existe en el servidor RabbitMQ o en ninguna de las bibliotecas cliente de AMQP, hasta donde yo sé, pero sería útil tenerlo.

+0

apio lo hace para tareas con eta/countdown. Simplemente se aferra a los mensajes, y hay un planificador que ejecuta las tareas cuando se cumple el eta. Como los mensajes deben ser reconocidos, aferrarse a ellos no es un problema, aunque es un poco peculiar cuando se usan recuentos de precaptura de QoS, ya que tenemos que incrementar el conteo de captación previa cada vez que se recibe un mensaje y disminuirlo cuando el mensaje eta ha sido procesado. – asksol

3

¿Has visto cosas como Ruote y Minion?

Algunos enlaces aquí: http://delicious.com/alexisrichardson/rabbitmq+work+ruby

También puede probar apio, que no habla nativa Rubí, pero no parecen ser HTTP + JSON.

Todo lo anterior funciona con RabbitMQ, por lo que puede ser de ayuda.

Saludos

Alexis

+0

Gracias por los clientes alternativos. Realmente prefiero seguir con Ruby siempre que sea posible y Sweatshop/Carrot ha estado funcionando muy bien. No parece ser una función de retardo en AMQP, por lo que la nueva cola parece ser la mejor opción en este momento. Tengo el código en desarrollo trabajando como quiero, solo preguntándome si no había una mejor manera. –

Cuestiones relacionadas