Перейти к содержанию

timer: Расширенные таймеры для nginx-module-lua

Установка

Если вы еще не подписались на репозиторий RPM, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или 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

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-timer v1.1.0, выпущенную 6 ноября 2020 года.


Расширенные таймеры для OpenResty. Предоставляют повторяющиеся, отменяемые, глобальные таймеры, которые выходят за рамки базовых таймеров OpenResty.

Синопсис

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

        local options = {
            interval = 0.1,           -- интервал истечения в секундах
            recurring = true,         -- повторяющийся или однократный таймер
            immediate = true,         -- начальный интервал будет 0
            detached = false,         -- запуск в отдельном потоке или возможность сборки мусора
            jitter = 0.1,             -- добавление случайного интервала
            expire = object.handler,  -- обратный вызов при истечении таймера
            cancel = function(reason, self, param1)
                -- будет вызван, когда таймер будет отменен
            end,
            shm_name = "timer_shm",   -- shm для использования глобальных таймеров
            key_name = "my_key",      -- имя ключа для использования глобальных таймеров
            sub_interval = 0.1,       -- максимальная дополнительная задержка между рабочими
        }

        local object
        object = {                            -- создаем объект с таймером
            count = 0,
            handler = function(self, param1)  -- обратный вызов таймера как метод
                -- делаем что-то здесь
                print(param1)                 --> "Param 1"
            end,

            -- создаем и добавляем в объект, но также передаем его как 'self' в обработчик
            timer = timer(options, object, "Param 1"),
        }

        -- закрепляем объект и таймер
        _M.global_object = object     -- будет собран, если не закреплен

        -- отменяем таймер
        object.timer:cancel()
    }
}

Описание

Таймер OpenResty довольно ограничен, этот таймер добавляет ряд общих опций в качестве параметров, не требуя переписывания (и повторного тестирования) их в каждом проекте.

  • повторяющиеся таймеры (также поддерживаются OR через ngx.timer.every)

  • немедленный первый запуск для повторяющихся таймеров

  • отменяемые таймеры

  • обратный вызов отмены, вызываемый при отмене таймера

  • таймеры, подлежащие сборке мусора, позволяющие таймерам (по желанию) быть привязанными к объектам и автоматически останавливаться при сборке мусора.

  • глобальные таймеры: один и тот же таймер, запущенный в каждом рабочем процессе, будет выполняться только один раз в системе. Если рабочий процесс, выполняющий его, будет удален, таймер автоматически выполнится в другом рабочем процессе.

Смотрите онлайн-документацию LDoc для полного API.

История

Версионирование строго основано на Semantic Versioning

Выпуск новых версий:

  • обновите changelog ниже (PR должны быть объединены, включая запись в changelog)
  • на основе changelog определите новую версию SemVer
  • создайте новый rockspec
  • создайте документацию с помощью ldoc (не делайте это в рамках PR)
  • зафиксируйте как "release x.x.x" (не включайте ревизию rockspec)
  • пометьте коммит как "x.x.x" (не включайте ревизию rockspec)
  • отправьте коммит и тег
  • загрузите rock в luarocks: luarocks upload rockspecs/[name] --api-key=abc

1.1.0 (6-нояб-2020)

  • Feat: добавлен параметр jitter. Это добавляет случайный интервал для распределения таймеров (в случае планирования множества таймеров одновременно).

1.0.0 (21-сен-2020)

  • Изменение [BREAKING]: повторяющиеся таймеры теперь реализованы как спящий поток, что более эффективно. Побочный эффект заключается в том, что таймер переназначается ТОЛЬКО ПОСЛЕ выполнения обработчика. Поэтому, если обработчик выполняется долго, то отдельные запуски будут дальше друг от друга.

0.3 (28-май-2018)

  • Feat: добавлено вызов обратного вызова отмены при сборке таймера. Это изменяет первый аргумент обратного вызова cancel, и, следовательно, является нарушающим.

0.2 (12-фев-2018) Исправление ошибок

  • Исправление: исправление ошибки в функции unpack, не учитывающей параметр длины таблицы
  • Документация: небольшие исправления и опечатки

0.1 (22-нояб-2017) Первоначальный выпуск

  • Добавлен параметр sub_interval для уменьшения задержек
  • Первоначальная загрузка

GitHub

Вы можете найти дополнительные советы по настройке и документацию для этого модуля в репозитории GitHub для nginx-module-timer.