Una guía para Deno.cron

En el mundo UNIX, uno de los mecanismos más antiguos y confiables disponibles desde fines de los años 70 ha sido el cron
comando. cron
permite programar la ejecución de tareas especificando una cadena simple (ya veces crítica) para indicar cuándo y con qué frecuencia se debe ejecutar un comando determinado.
En el apogeo de UNIX, estas cadenas, para cada comando específico, se recopilan en el crontab
archivo. Hoy en día, incluso en un entorno tecnológico muy diferente, el cron
mecanismo sigue siendo relevante. En este artículo, veremos cómo usar el cron
paquete en Deno. El código que presentamos aquí está disponible en este repositorio de GitHub.
Asumiremos que nunca has usado Deno, así que el primer paso es instalarlo. Solo tienes que ejecutar el script de instalación; para saber cómo hacerlo correctamente, consulta la documentación oficial. Para familiarizarse con Deno, consulte “Introducción a Deno y Fresh”.
La croncuerda
La crontab
cadena utilizada por sigue un formato específico que consta de cinco campos, cada uno de los cuales representa diferentes parámetros de tiempo para la programación de tareas. El formato básico incluye un campo de minuto, hora, día del mes, mes y día de la semana:Deno.cron
Estos campos están separados por un espacio, y se pueden usar números o caracteres especiales para especificar intervalos de tiempo o puntos específicos. Este formato permite a los usuarios definir programaciones precisas y recurrentes para tareas automatizadas.
He aquí un ejemplo sencillo de un programa que utiliza:Deno.cron
30 2 * * 1 - 5 30 2 * * 1 - 5
En este ejemplo, 30
especifique el minuto en que se ejecutará la tarea (en este caso, 30 minutos después de la hora). 2
representa la hora del día en que se ejecutará la tarea (2 am). *
significa “todos los días del mes”, lo que significa que la tarea se realizará cualquier día del mes. El siguiente *
indica “todos los meses”, lo que implica que la tarea está programada para todos los meses. Y se refiere a “de lunes a viernes” para el día de la semana, lo que indica que la tarea se ejecutará de lunes a viernes.1-5
En resumen, esta crontab
cadena programa una tarea para que se ejecute a las 2:30 am de lunes a viernes. La buena noticia es que la idea general de la crontab
cadena de finales de los 70 se ha trasladado a enfoques modernos, y es posible definir una cadena mediante un objeto JavaScript más expresivo. Analizaremos esto en la siguiente sección.
La biblioteca Cron está disponible en Deno (v1.43 al momento de escribir este artículo), pero está etiquetada como inestable. Esto significa que, al ejecutar el código de los siguientes ejemplos, debe usar esto para habilitar explícitamente el uso de la cron
API (aún) inestable:
$ deno run -- inestable - cron servidor .ts
El primer ejemplo es bastante simple:
Deno. cron("tarea1" , "* * * * *" , () = console . log( "Esto se imprimirá cada UN minuto")) Deno . cron ( "task2" , { minuto : { cada : 2 } }, () = console . log ("Esto se imprimirá cada DOS minutos" ))
En el código, definimos dos tareas con diferentes programaciones: la primera ( 'task1'
) está programada para ejecutarse cada minuto debido a la crontab
cadena "* * * * *"
. La segunda actividad, denominada task2
, está programada cada dos minutos por el objeto JSON:
{ minuto : { cada : 2 } }
Probablemente puedas estar de acuerdo en que esto es mucho más expresivo que la crontab
cuerda.
Como se esperaba, la ejecución imprime el mensaje de task1
cada minuto y el mensaje de task2
cada dos ejecuciones de task1
:
$ deno run -- inestable - cron . ejemplo1. ts Esto se imprimirá cada UN minuto Esto se imprimirá cada DOS minutos Esto se imprimirá cada UN minuto Esto se imprimirá cada UN minuto Esto se imprimirá cada DOS minutos
En el primer ejemplo, vimos cómo programar dos tareas bastante sencillas. Sin embargo, este mecanismo tiene una limitación: la ejecución de la función asociada a una tarea no puede solaparse con la ejecución de otra. En este caso, Deno omitirá la ejecución de la segunda tarea.
Es importante comprender este mecanismo, ya que si el tiempo necesario para completar la función asociada a una tarea es incierto, el orden de ejecución de las tareas también será impredecible, ya que la ejecución no puede solaparse y, si una función está en ejecución, bloquea la ejecución de todas las demás. En el archivo, se muestra un ejemplo básico para ilustrar este efecto:example02.ts
importar { dormir } desde "https://deno.land/x/ sleep@v1.3.0 /mod.ts" importar { tiempo } desde "https://denopkg.com/burhanahmeed/ time.ts@v2.0.1 /mod.ts"; Deno. cron ( "tarea1" , { minuto : { cada : 1 } }, () = { console . log ( 'Hora actual UTC: ' , time (). t ) }) Deno . cron ( "tarea2", { minuto : { cada : 2 } }, () = { console . log ( "Durmiendo 3 minutos" ) sleep ( 3 * 60 ) console . log ( "Listo" ) })
En este ejemplo, utilizaremos dos nuevos paquetes Deno: time
, para obtener la hora actual y sleep
, para permitir que una tarea pierda algo de tiempo para superponer la ejecución de las dos tareas.
En la siguiente imagen, se puede ver una ejecución y se puede notar cómo la tarea programada que imprime el tiempo ( task1
en el origen) saltó su ejecución: hay un salto del minuto 26 al minuto 31. Esto es más de los tres minutos que dejamos task2
“dormir” y esto aclara cuán poco confiable puede ser la programación de tareas cuyas ejecuciones pueden solaparse:
$ deno run -- inestable - cron . ejemplo2. ts Hora actual UTC : 2024 - 03 - 17T16 : 24 : 00.009Z Hora actual UTC : 2024 - 03 - 17T16 : 25 : 00.001Z Durmiendo 3 minutos Hecho Hora actual UTC : 2024 - 03 - 17T16 : 26 : 00.010Z Hora actual UTC : 2024 - 03 - 17T16 : 31 : 30.309Z Durmiendo 3 minutos Hecho Hora actual UTC : 2024 - 03 - 17T16 : 32 : 00.007Z Durmiendo 3 minutos Hecho
El último ejemplo es útil para gestionar el fallo de una tarea recurrente. La idea general es programar una tarea de la forma habitual, como vimos anteriormente, junto con una programación específica, denominada backoffSchedule
, que se utilizará en caso de error.
La situación que se pretende modelar aquí es la siguiente: programar una invocación a un servicio a un ritmo determinado. En nuestro ejemplo, usaremos cinco minutos. En caso de que la invocación genere un error, se reintentará con un tiempo de espera para no saturar el servicio con demasiados intentos.
importar { tiempo } desde "https://denopkg.com/burhanahmeed/time.ts@v2.0.1 /mod.ts"; Deno. cron ( "tarea1" , { minuto : { cada : 1 }}, { backoffSchedule : [ 1000 , 5000 , 10000 ], }, () = { console . log ( 'Hora actual UTC: ' , time (). t ) lanzar nuevo Error (); });
Las ejecuciones de cron fallidas se reintentan automáticamente según una estrategia de reintento predeterminada. Para definir esta estrategia, puede utilizar el backoffSchedule
atributo para especificar una matriz de intervalos de tiempo (en milisegundos) que se deben esperar antes de reintentar la llamada a la función.
En el ejemplo anterior, definimos un cronograma de retroceso de un segundo, cinco segundos y 10 segundos y, para mostrar cómo funciona el mecanismo de retroceso, la función asociada con task1
simplemente arrojará un error:
Hora actual UTC : 2024-03-17T18 : 40 : 00.009Z Excepción en la tarea 1 del controlador de cron Error en el archivo : ///example3.ts:8:11 en la ext : deno_cron / 01 _cron.ts : 101 : 24 en eventLoopTick ( text : core / 01 _core.js : 169 : 7 ) Hora actual UTC : 2024-03-17T18 : 40 : 01.029Z Excepción en la tarea 1 del controlador de cron Error en el archivo : ///example3.ts:8:11 en la ext : deno_cron / 01 _cron . ts : 101 : 24 en eventLoopTick ( text : core / 01 _core . js : 169 : 7 ) Hora actual UTC : 2024-03-17T18 : 40 : 06.037Z Excepción en la tarea del controlador de cron1 Error en el archivo : ///example3.ts:8:11 en la text : deno_cron / 01 _cron . ts : 101 : 24 en eventLoopTick ( text : core / 01_core.js : 169 : 7 ) Hora actual UTC : 2024-03-17T18 : 40 : 16.050Z Excepción en la tarea1 del controlador de cron Error en el archivo : ///example3.ts:8:11 en la text : deno_cron / 01_cron.ts: 101: 24 en eventLoopTick (ext: núcleo/01 _core. js: 169: 7)
En la ejecución, puedes notar que, después de la primera excepción lanzada (tiempo), podemos ver otra excepción después de un segundo (tiempo 18:40:01), cinco segundos (tiempo 18:40:06) y 10 segundos (tiempo 18:40:16).18:40:00
Corriendo en la nube
El verdadero uso de [nombre del servidor] se encuentra en el lado del servidor de la aplicación, para recalcular datos en una tabla, reintentar llamadas a la API, actualizar paneles, etc. En el ecosistema Deno, esto se logra aprovechando Deno Deploy, una plataforma distribuida globalmente para aplicaciones JavaScript sin servidor.Deno.cron
La implementación funciona de forma ligeramente diferente en Deno Deploy. En particular, Deno Deploy garantiza que las tareas cron se ejecutarán al menos una vez por cada intervalo de tiempo programado. Esto generalmente significa que el controlador de cron se invocará una vez por cada intervalo de tiempo programado, pero, en caso de fallos, podría invocarse varias veces durante el mismo intervalo de tiempo programado.Deno.cron
Conclusión
En resumen, este artículo introduce el concepto de programación de tareas mediante , incluyendo ejemplos de diversos formatos de programación. Vimos la importancia de considerar la ejecución no determinista de tareas debido a la posible superposición de funciones, y ofrecemos ejemplos prácticos de las capacidades de para gestionar tareas programadas.Deno.cron
Deno.cron
Empieza ahora
Si quieres conocer otros artículos parecidos a Una guía para Deno.cron puedes visitar la categoría Guias.
Entradas Relacionadas