Necesito diseñar un sistema de programación de tareas escalable impulsado por Redis.Ejecución escalable escalable de tareas con Redis
Requisitos:
- procesos de trabajo múltiples.
- Muchas tareas, pero son posibles períodos largos de inactividad.
- Precisión de tiempo razonable.
- Mínimo desperdicio de recursos cuando está inactivo.
- Debe usar la API síncrona Redis.
- Debería funcionar para Redis 2.4 (es decir, no tiene características de la próxima versión 2.6).
- No debe usar otros medios de RPC que Redis.
Pseudo-API: schedule_task(timestamp, task_data)
. La marca de tiempo está en segundos enteros.
idea básica:
- Escuchar para las próximas tareas en la lista.
- Ponga las tareas en cubos por marca de tiempo.
- Dormir hasta la fecha más cercana.
- Si aparece una nueva tarea con marca de tiempo menor que la más cercana, despiértate.
- Procese todas las tareas venideras con indicación de fecha y hora ≤ ahora, en lotes (suponiendo que la ejecución de tareas sea rápida).
- Asegúrese de que el trabajador concurrente no procese las mismas tareas. Al mismo tiempo, asegúrese de que no se pierdan tareas si fallamos al procesarlas.
Hasta ahora no puedo encontrar la manera de encajar esto en primitivas Redis ...
Alguna pista?
Tenga en cuenta que hay una pregunta anterior similar: Delayed execution/scheduling with Redis? En esta nueva pregunta, presento más detalles (lo más importante, muchos trabajadores). Hasta el momento, no pude averiguar cómo aplicar las respuestas antiguas aquí, por lo tanto, una nueva pregunta.
Me gustaría señalar explícitamente que la interrogación de una clave de Redis en un bucle violaría el requisito de "mínimo desperdicio de recursos cuando está inactivo". Los trabajadores deben dormir cuando no hay nada que hacer. –
sondeo con BLPOP/BRPOP puede bloquear hasta que la lista esté completa, y es lo que la mayoría de la gente usa para hacer esto. Por lo general, bloqueas durante unos segundos en un bucle, pero en términos de tiempo de CPU es insignificante. Puede usar redis pub/sub pero eso es malo porque si no hay un trabajador, las tareas se perderán. –
@Not_a_Golfer: Las cosas son un poco más complicadas que BLPOPping una sola lista. Tenga en cuenta que necesito demorar la ejecución de la tarea (es decir, el planificador de tareas), no un procesador de tareas sencillo. –