Pular para conteúdo

timer: Temporizadores estendidos para nginx-module-lua

Instalação

Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.

CentOS/RHEL 7 ou 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 com NGINX, certifique-se de que o nginx-module-lua esteja instalado.

Este documento descreve lua-resty-timer v1.1.0 lançado em 06 de novembro de 2020.


Temporizadores estendidos para OpenResty. Fornece temporizadores recorrentes, canceláveis e de escopo de nó, além do que os temporizadores básicos do OpenResty fazem.

Sinopse

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

        local options = {
            interval = 0.1,           -- intervalo de expiração em segundos
            recurring = true,         -- temporizador recorrente ou único
            immediate = true,         -- o intervalo inicial será 0
            detached = false,         -- executar de forma destacada ou ser coletável
            jitter = 0.1,             -- adicionar um intervalo aleatório
            expire = object.handler,  -- callback na expiração do temporizador
            cancel = function(reason, self, param1)
                -- será chamado quando o temporizador for cancelado
            end,
            shm_name = "timer_shm",   -- shm a ser usado para temporizadores de escopo de 
            key_name = "my_key",      -- nome da chave a ser usado para temporizadores de escopo de 
            sub_interval = 0.1,       -- atraso extra máximo entre trabalhadores
        }

        local object
        object = {                            -- criar algum objeto com um temporizador
            count = 0,
            handler = function(self, param1)  -- o callback do temporizador como um método
                -- faça algo aqui
                print(param1)                 --> "Param 1"
            end,

            -- criar e adicionar ao objeto, mas também passar como 'self' para o handler
            timer = timer(options, object, "Param 1"),
        }

        -- ancorar o objeto e o temporizador
        _M.global_object = object     -- será coletado se não ancorado

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

Descrição

O temporizador do OpenResty é bastante limitado, este temporizador adiciona uma série de opções comuns como parâmetros sem precisar recodificá-los (e retestá-los) em cada projeto.

  • temporizadores recorrentes (suportados pelo OR também através de ngx.timer.every)

  • execução imediata na primeira execução para temporizadores recorrentes

  • temporizadores canceláveis

  • callback de cancelamento, chamado quando o temporizador é cancelado

  • temporizadores coletáveis, permitindo que os temporizadores sejam (opcionalmente) anexados a objetos e parem automaticamente quando coletados.

  • temporizadores de escopo de nó: o mesmo temporizador iniciado em cada trabalhador ainda será executado apenas uma vez em todo o sistema. Se o trabalhador que o executa for removido, o temporizador será automaticamente executado em outro trabalhador.

Veja a documentação online do LDoc para a API completa.

Histórico

O versionamento é estritamente baseado em Semantic Versioning

Lançando novas versões:

  • atualize o changelog abaixo (os PRs devem ser mesclados incluindo uma entrada no changelog)
  • com base no changelog, determine a nova versão SemVer
  • crie um novo rockspec
  • renderize a documentação usando ldoc (não faça isso dentro dos PRs)
  • faça commit como "release x.x.x" (não inclua a revisão do rockspec)
  • marque o commit com "x.x.x" (não inclua a revisão do rockspec)
  • faça push do commit e da tag
  • faça upload do rock para luarocks: luarocks upload rockspecs/[name] --api-key=abc

1.1.0 (6-Nov-2020)

  • Feat: adicionado uma opção jitter. Isso adiciona um intervalo aleatório para distribuir os temporizadores (no caso de agendar muitos temporizadores de uma vez).

1.0.0 (21-Sep-2020)

  • Mudança [BREAKING]: os temporizadores recorrentes agora são implementados como uma thread de espera que é mais eficiente. O efeito colateral é que o temporizador só é reprogramado APÓS a execução do handler. Portanto, se o handler for de longa duração, as execuções individuais estarão mais distantes.

0.3 (28-May-2018)

  • Feat: adicionado a invocação do callback de cancelamento quando o temporizador é coletado. Isso altera o primeiro argumento do callback cancel, e portanto é uma quebra.

0.2 (12-Feb-2018) Correção de bug

  • Fix: correção de bug na função unpack que não respeitava o parâmetro de comprimento da tabela
  • Docs: pequenas correções e erros de digitação

0.1 (22-Nov-2017) Lançamento inicial

  • Adicionado a opção sub_interval para reduzir atrasos
  • Upload inicial

GitHub

Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-timer.