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 croncomando. cronpermite 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 crontabarchivo. Hoy en día, incluso en un entorno tecnológico muy diferente, el cronmecanismo sigue siendo relevante. En este artículo, veremos cómo usar el cronpaquete 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”.

Table
  1. La croncuerda
  2. Corriendo en la nube
  3. Conclusión

La croncuerda

La crontabcadena 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

Un análisis UX de Arc, Opera y Edge: El futuro de las interfaces de los navegadores

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, 30especifique el minuto en que se ejecutará la tarea (en este caso, 30 minutos después de la hora). 2representa 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 crontabcadena 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 crontabcadena 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.

Manejo de fechas en JavaScript con Tempo

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 cronAPI (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 crontabcadena "* * * * *". 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 crontabcuerda.

Cómo hablar con las partes interesadas como líder de UX

Como se esperaba, la ejecución imprime el mensaje de task1cada minuto y el mensaje de task2cada 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.

El rol de un propietario de producto: responsabilidades y habilidades clave

En la siguiente imagen, se puede ver una ejecución y se puede notar cómo la tarea programada que imprime el tiempo ( task1en 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 backoffScheduleatributo 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 task1simplemente 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.cronDeno.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