Saltar a contenido

timer: Temporizadores extendidos para nginx-module-lua

Instalación

Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.

CentOS/RHEL 7 o Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-timer

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-timer

Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.

Este documento describe lua-resty-timer v1.1.0 lanzado el 06 de noviembre de 2020.


Temporizadores extendidos para OpenResty. Proporciona temporizadores recurrentes, cancelables y de alcance de nodo, más allá de lo que hacen los temporizadores básicos de OpenResty.

Sinopsis

http {
    lua_shared_dict timer_shm 1m;
    init_worker_by_lua_block {
        local timer = require("resty.timer")

        local options = {
            interval = 0.1,           -- intervalo de expiración en segundos
            recurring = true,         -- temporizador recurrente o único
            immediate = true,         -- el intervalo inicial será 0
            detached = false,         -- ejecutarse de forma independiente, o ser recolectable por el garbage collector
            jitter = 0.1,             -- añadir un intervalo aleatorio
            expire = object.handler,  -- callback en la expiración del temporizador
            cancel = function(reason, self, param1)
                -- se llamará cuando el temporizador sea cancelado
            end,
            shm_name = "timer_shm",   -- shm a utilizar para temporizadores de alcance de nodo
            key_name = "my_key",      -- nombre de clave a utilizar para temporizadores de alcance de nodo
            sub_interval = 0.1,       -- retraso extra máximo entre trabajadores
        }

        local object
        object = {                            -- crear algún objeto con un temporizador
            count = 0,
            handler = function(self, param1)  -- el callback del temporizador como un método
                -- hacer algo aquí
                print(param1)                 --> "Param 1"
            end,

            -- crear y añadir al objeto, pero también pasarlo como 'self' al handler
            timer = timer(options, object, "Param 1"),
        }

        -- anclar el objeto y el temporizador
        _M.global_object = object     -- será recolectado si no está anclado

        -- cancelar el temporizador
        object.timer:cancel()
    }
}

Descripción

El temporizador de OpenResty es bastante limitado, este temporizador añade una serie de opciones comunes como parámetros sin tener que recodificarlos (y volver a probarlos) en cada proyecto.

  • temporizadores recurrentes (soportados por OR también a través de ngx.timer.every)

  • ejecución inmediata inicial para temporizadores recurrentes

  • temporizadores cancelables

  • callback de cancelación, llamado cuando el temporizador es cancelado

  • temporizadores recolectables por el garbage collector, permitiendo que los temporizadores se (opcionalmente) adjunten a objetos y se detengan automáticamente cuando sean recolectados.

  • temporizadores de alcance de nodo: el mismo temporizador iniciado en cada trabajador solo se ejecutará una vez en todo el sistema. Si el trabajador que lo ejecuta es eliminado, el temporizador se ejecutará automáticamente en otro trabajador.

Consulta la documentación en línea de LDoc para la API completa.

Historia

El versionado se basa estrictamente en Semantic Versioning

Lanzamiento de nuevas versiones:

  • actualizar el changelog a continuación (los PR deben ser fusionados incluyendo una entrada en el changelog)
  • basándose en el changelog, determinar la nueva versión SemVer
  • crear un nuevo rockspec
  • renderizar la documentación usando ldoc (no hacer esto dentro de los PR)
  • hacer commit como "release x.x.x" (no incluir la revisión del rockspec)
  • etiquetar el commit con "x.x.x" (no incluir la revisión del rockspec)
  • empujar el commit y la etiqueta
  • subir el rock a luarocks: luarocks upload rockspecs/[name] --api-key=abc

1.1.0 (6-Nov-2020)

  • Feat: añadir una opción jitter. Esto añade un intervalo aleatorio para distribuir los temporizadores (en caso de programar muchos temporizadores a la vez).

1.0.0 (21-Sep-2020)

  • Cambio [BREAKING]: los temporizadores recurrentes ahora se implementan como un hilo en espera, lo que es más eficiente. El efecto secundario es que el temporizador solo se vuelve a programar DESPUÉS de ejecutar el handler. Así que si el handler es de larga duración, entonces las ejecuciones individuales estarán más separadas.

0.3 (28-May-2018)

  • Feat: se añadió la invocación del callback de cancelación al ser recolectado el temporizador. Esto cambia el primer argumento del callback cancel, y por lo tanto es un cambio importante.

0.2 (12-Feb-2018) Corrección de errores

  • Fix: corrección de error en la función unpack que no respetaba el parámetro de longitud de la tabla
  • Docs: pequeñas correcciones y errores tipográficos

0.1 (22-Nov-2017) Lanzamiento inicial

  • Se añadió la opción sub_interval para reducir retrasos
  • Carga inicial

GitHub

Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-timer.