Mi aplicación crea trabajos resque que se deben procesar secuencialmente por usuario, y deben procesarse lo más rápido posible (1 segundo de retraso máximo).Resque: trabajos críticos para el tiempo que se ejecutan secuencialmente por usuario
Un ejemplo: job1 y job2 se crean para user1 y job3 para user2. Resque puede procesar job1 y job3 en paralelo, pero job1 y job2 deben procesarse secuencialmente.
que tienen diferentes pensamientos para una solución:
- que podría utilizar diferentes colas (por ejemplo queue_1 ... queue_10) y empezar un trabajador por cada cola (por ejemplo
rake resque:work QUEUE=queue_1
). Los usuarios se asignan a una cola/trabajador en tiempo de ejecución (por ejemplo, al iniciar sesión, todos los días, etc.) - Podría usar "colas de usuario" dinámicas (por ejemplo, cola _ # {user.id}) e intentar extender resque que solo 1 trabajador puede procesar una cola a la vez (como se solicitó en Resque: one worker per queue)
- Podía poner los trabajos en una cola sin interrupción y usar un "meta trabajo por usuario" con resque-lock (https://github.com/defunkt/resque-lock) que maneja esos trabajos.
¿Tiene alguna experiencia con uno de esos escenarios en la práctica? ¿O tiene otras ideas que valdría la pena pensar? Agradecería cualquier aporte, ¡gracias!
el problema es que no debe job1 explícitamente saber sobre job2 ya que no se crean al mismo tiempo (que podrían creado en diferentes solicitudes, etc.). – lacco
en cuyo caso usaría resque-retry, en job2, para realizar una comprobación si el trabajo1 ha finalizado y si no se vuelve a cola más adelante, se puede configurar resque-retry para que use retrocesos exponenciales o intentos limitados según sea necesario. – TomDunning
¿Cómo sabe job2 que el trabajo1 está en progreso para un usuario específico? – lacco