sql >> Base de Datos >  >> NoSQL >> Redis

Cancelar trabajos en Laravel

No hay una manera directa o fácil de hacerlo. Los trabajos retrasados ​​se mantienen en sorted sets como tiempo a ser procesado como score y la carga útil del trabajo como el value .

Hay varias formas de eliminar un elemento de los conjuntos ordenados (la mayoría de ellos requieren algunos esfuerzos dependiendo del tamaño de la cola retrasada) como

  • Obtienes la carga útil "exacta" del trabajo enviado y luego usas ZREM para eliminarlo. Es difícil porque el objeto (versión serializada del trabajo con todos los parámetros) puede ser enorme y no puede crear el trabajo "exacto" porque tiene un identificador único. Puede obtener la lista con ZRANGEBYSCORE y con WITHSCORES . Te dará la lista de trabajos con sus puntajes. Puede usar la puntuación para identificar un trabajo retrasado. Obtenga el valor (carga útil serializada) y luego use ZREM .
  • Si solo hay un trabajo para procesar en un momento específico, puede usar ZREMRANGEBYSCORE con el tiempo de procesamiento. Si hay n trabajos para procesar exactamente en ese momento, también se pueden eliminar otros trabajos desde ZREMRANGEBYSCORE toma un intervalo de tiempo.
  • Puede intentar usar ZSCAN para escanear toda la lista retrasada (con paginación) y encontrar la puntuación y el identificador del trabajo, y luego usar ZREMRANGEBYLEX con el identificador para eliminarlo.
  • Otra forma podría ser poner una condición de cancelación al comienzo de handle método. Este requiere el desarrollo de la capa de aplicación. Cada vez que envía un trabajo a la cola, envía un identificador al trabajo, coloque el mismo identificador (que pueda entender) en Redis también (con EXPIRE mayor que el tiempo de retardo). Cuando desee cancelarlo, elimínelo de Redis. Dentro del método handle, verifique si el identificador dado existe en Redis, si no regresa antes del bloque de código.