lua-resty-worker-events

ua-resty-worker-events

$ opm get fffonion/lua-resty-worker-events

lua-resty-worker-events

Nginx 工作进程之间的进程间事件

状态

该库已准备好投入生产。

概要

    http {
        lua_package_path "/path/to/lua-resty-worker-events/lib/?.lua;;";
    
        # the size depends on the number of event to handle:
        lua_shared_dict process_events 1m;
    
        init_worker_by_lua_block {
            local ev = require "resty.worker.events"
    
            local handler = function(data, event, source, pid)
                print("received event; source=",source,
                      ", event=",event,
                      ", data=", tostring(data),
                      ", from process ",pid)
            end
    
            ev.register(handler)
    
            local ok, err = ev.configure {
                shm = "process_events", -- defined by "lua_shared_dict"
                timeout = 2,            -- life time of unique event data in shm
                interval = 1,           -- poll interval (seconds)
    
                wait_interval = 0.010,  -- wait before retry fetching event data
                wait_max = 0.5,         -- max wait time before discarding event
                shm_retries = 999,      -- retries for shm fragmentation (no memory)
            }
            if not ok then
                ngx.log(ngx.ERR, "failed to start event system: ", err)
                return
            end
        }
    
        server {
            ...
    
            # example for polling:
            location = /some/path {
    
                default_type text/plain;
                content_by_lua_block {
                    -- manually call `poll` to stay up to date, can be used instead,
                    -- or together with the timer interval. Polling is efficient,
                    -- so if staying up-to-date is important, this is preferred.
                    require("resty.worker.events").poll()
    
                    -- do regular stuff here
    
                }
            }
        }
    }

描述

该模块提供了一种向 Nginx 服务器中的其他工作进程发送事件的方法。通信通过共享内存区域进行,事件数据将存储在其中。

所有工作进程中事件的顺序**保证**相同。

工作进程将在后台设置一个计时器来检查事件。该模块遵循单例模式,因此每个工作进程只运行一次。但是,如果需要保持最新状态,则可以将间隔设置为较低的频率,并对每个收到的请求调用 poll,以确保尽快处理所有事件。

该设计允许 3 种用例;

  1. 向所有工作进程广播事件,请参见 post。在这种情况下,所有工作进程中事件的顺序保证相同。例如:在一个工作进程中运行的健康检查,但通知所有工作进程上游节点出现故障。

  2. 仅向本地工作进程广播事件,请参见 post_local

  3. 将外部事件合并到一个动作中。例如:所有工作进程都监视指示需要刷新内存缓存的外部事件。收到事件后,它们都会使用唯一的事件哈希值(所有工作进程生成相同的哈希值)将其发布,请参见 postunique 参数。现在,只有 1 个工作进程会 _只_ 接收该事件一次,因此只有 1 个工作进程会命中上游数据库以刷新内存数据。

该模块本身将使用 source="resty-worker-events" 触发两个事件;

  • event="started",当模块首次配置时(注意:事件处理程序必须在调用 configure 之前注册,才能捕获该事件)

  • event="stopping",当工作进程退出时(基于计时器 premature 设置)

请参见 event_list,了解如何在没有硬编码魔术值/字符串的情况下使用事件。

故障排除

为了正确地调整 shm 大小,了解其使用方法非常重要。事件数据存储在 shm 中,以便将其传递给其他工作进程。因此,shm 中有 2 种类型的条目

  1. 仅由单个工作进程执行的事件(请参见 post 方法的 unique 参数)。这些条目在 shm 中获得 ttl,因此将过期。

  2. 所有其他事件(本地事件除外,本地事件不使用 SHM)。在这些情况下,没有设置 ttl

上述结果是 SHM 将始终处于满载状态!因此,这不是要调查的指标。

如何防止问题

  • SHM 大小必须至少是预期最大有效载荷的倍数。它必须能够容纳在一个 interval(请参见 configure)内可能发送的所有事件。

  • no memory 错误 _不能_ 通过增大 SHM 来解决。解决这些错误的唯一方法是增加传递给 configureshm_retries 选项。这是因为错误是由于碎片化而不是内存不足造成的。

  • 如果事件数据在所有工作进程处理它之前被逐出,则会出现 waiting for event data timed out 错误。如果出现大量(大负载)事件,则可能会发生这种情况。为了解决这些问题

lua-resty-worker-events =======================

Nginx 工作进程之间的进程间事件

目录 =================

* [名称](#name) * [状态](#status) * [概要](#synopsis) * [描述](#description) * [故障排除](#troubleshooting) * [方法](#methods) * [configure](#configure) * [configured](#configured) * [event_list](#event_list) * [poll](#poll) * [post](#post) * [post_local](#post_local) * [register](#register) * [register_weak](#register_weak) * [unregister](#unregister) * [安装](#installation) * [待办事项](#todo) * [错误和补丁](#bugs-and-patches) * [作者](#author) * [版权和许可](#copyright-and-license) * [历史](#history) * [另请参见](#see-also)

状态 ======

该库已准备好投入生产。

概要 ========

```nginx http { lua_package_path "/path/to/lua-resty-worker-events/lib/?.lua;;";

    # the size depends on the number of event to handle:
    lua_shared_dict process_events 1m;

    init_worker_by_lua_block {
        local ev = require "resty.worker.events"

        local handler = function(data, event, source, pid)
            print("received event; source=",source,
                  ", event=",event,
                  ", data=", tostring(data),
                  ", from process ",pid)
        end

        ev.register(handler)

        local ok, err = ev.configure {
            shm = "process_events", -- defined by "lua_shared_dict"
            timeout = 2,            -- life time of unique event data in shm
            interval = 1,           -- poll interval (seconds)

            wait_interval = 0.010,  -- wait before retry fetching event data
            wait_max = 0.5,         -- max wait time before discarding event
            shm_retries = 999,      -- retries for shm fragmentation (no memory)
        }
        if not ok then
            ngx.log(ngx.ERR, "failed to start event system: ", err)
            return
        end
    }

    server {
        ...

        # example for polling:
        location = /some/path {

            default_type text/plain;
            content_by_lua_block {
                -- manually call `poll` to stay up to date, can be used instead,
                -- or together with the timer interval. Polling is efficient,
                -- so if staying up-to-date is important, this is preferred.
                require("resty.worker.events").poll()

                -- do regular stuff here

            }
        }
    }
}
```

描述 ===========

[返回目录](#table-of-contents)

该模块提供了一种向 Nginx 服务器中的其他工作进程发送事件的方法。通信通过共享内存区域进行,事件数据将存储在其中。

所有工作进程中事件的顺序 __保证__ 相同。

工作进程将在后台设置一个计时器来检查事件。该模块遵循单例模式,因此每个工作进程只运行一次。但是,如果需要保持最新状态,则可以将间隔设置为较低的频率,并对每个收到的请求调用 [poll](#poll) ,以确保尽快处理所有事件。

该设计允许 3 种用例;

1. 向所有工作进程广播事件,请参见 [post](#post) 。在这种情况下,所有工作进程中事件的顺序保证相同。例如:在一个工作进程中运行的健康检查,但通知所有工作进程上游节点出现故障。 2. 仅向本地工作进程广播事件,请参见 [post_local](#post_local) 。 3. 将外部事件合并到一个动作中。例如:所有工作进程都监视指示需要刷新内存缓存的外部事件。收到事件后,它们都会使用唯一的事件哈希值(所有工作进程生成相同的哈希值)将其发布,请参见 [post](#post) 的 `unique` 参数。现在,只有 1 个工作进程会 _只_ 接收该事件一次,因此只有 1 个工作进程会命中上游数据库以刷新内存数据。

该模块本身将使用 `source="resty-worker-events"` 触发两个事件; * `event="started"`,当模块首次配置时(注意:事件处理程序必须在调用 [configure](#configure) 之前 [注册](#register) ,才能捕获该事件) * `event="stopping"`,当工作进程退出时(基于计时器 `premature` 设置)

请参见 [event_list](#event_list) ,了解如何在没有硬编码魔术值/字符串的情况下使用事件。

故障排除 ================

为了正确地调整 shm 大小,了解其使用方法非常重要。事件数据存储在 shm 中,以便将其传递给其他工作进程。因此,shm 中有 2 种类型的条目

1. 仅由单个工作进程执行的事件(请参见 `post` 方法的 `unique` 参数)。这些条目在 shm 中获得 ttl,因此将过期。 2. 所有其他事件(本地事件除外,本地事件不使用 SHM)。在这些情况下,没有设置 ttl

上述结果是 SHM 将始终处于满载状态!因此,这不是要调查的指标。

如何防止问题

* SHM 大小必须至少是预期最大有效载荷的倍数。它必须能够容纳在一个 `interval`(请参见 `configure`)内可能发送的所有事件。 * `no memory` 错误 _不能_ 通过增大 SHM 来解决。解决这些错误的唯一方法是增加传递给 configureshm_retries 选项。这是因为错误是由于碎片化而不是内存不足造成的。 * 如果事件数据在所有工作进程处理它之前被逐出,则会出现 waiting for event data timed out 错误。如果出现大量(大负载)事件,则可能会发生这种情况。为了解决这些问题

    * try to avoid big event payloads
    * use a smaller `interval`, so workers check for (and deal with) events
      more frequently (see `interval` option as passed to `configure`)
    * increase the SHM size, such that it can hold all the event data that
      might be send within 1 interval.

方法 =======

[返回目录](#table-of-contents)

configure --------- `语法:success, err = events.configure(opts)`

将初始化事件监听器。opts 参数是一个带有命名选项的 Lua 表

* `shm`:(必需)要使用的共享内存的名称。事件数据不会过期,因此该模块依赖于 shm lru 机制从 shm 中逐出旧事件。因此,shm 可能不应用于其他目的。 * `shm_retries`:(可选)当 shm 在发布事件时返回“no memory”时的重试次数,默认值为 999。每次尝试插入而没有可用内存(没有可用空间或内存可用但已碎片化)时,都会逐出“最多十个”旧条目。之后,如果仍然没有可用内存,则会返回“no memory”错误。重试插入操作会多次触发逐出阶段,从而增加可用内存,以及找到足够大的连续内存块的可能性。 * `interval`:(可选)轮询事件的间隔(以秒为单位),默认值为 1。设置为 0 将禁用轮询。 * `wait_interval`:(可选)两次尝试之间的间隔,当找到新的 eventid 但数据尚未可用时(由于工作进程的异步行为) * `wait_max`:(可选)在丢弃事件之前,找到事件 id 后等待数据的最大时间。这是一个保险设置,以防出现问题。 * `timeout`:(可选)存储在 shm 中的唯一事件数据的超时时间(以秒为单位),默认值为 2。请参见 [post](#post) 方法的 `unique` 参数。

返回值将为 `true`,或为 `nil` 和错误消息。

该方法可以重复调用以更新设置,但 `shm` 值除外,该值在初始配置后不能更改。

注意:wait_interval 使用 ngx.sleep 函数执行。在 ngx.sleep 函数不可用(例如 init_worker)的上下文中,它将执行繁忙等待以执行延迟。

[返回目录](#table-of-contents)

configured ---------- `语法:is_already_configured = events.configured()`

事件模块在每个工作进程中作为一个 singelton 运行。configured 函数允许检查它是否已启动并运行。建议在启动任何依赖项之前进行检查;```lua local events = require "resty.worker.events"

local initialization_of_my_module = function() assert(events.configured(), "Please configure the 'lua-resty-worker-events' ".. "module before using my_module")

    -- do initialization here
end
```

[返回目录](#table-of-contents)

event_list ---------- `语法:_M.events = events.event_list(sourcename, event1, event2, ...)`

实用程序函数,用于生成事件列表并防止魔术字符串中的拼写错误。访问返回表中不存在的事件将导致“未知事件错误”。第一个参数 sourcename 是一个唯一的名称,用于标识事件源,该名称将作为字段 _source 可用。所有后续参数都是事件源生成的命名事件。

示例用法;```lua local ev = require "resty.worker.events"

-- 事件源示例

local events = ev.event_list( "my-module-event-source", -- 作为 _M.events._source 可用 "started", -- 作为 _M.events.started 可用 "event2" -- 作为 _M.events.event2 可用 )

local raise_event = function(event, data) return ev.post(events._source, event, data) end

-- 发布我自己的“started”事件 raise_event(events.started, nil) -- 为清晰起见为 nil,没有传递 eventdata

-- 定义我的模块表 local _M = { events = events -- 导出事件表

  -- implementation goes here
}
return _M

-- 事件客户端示例; local mymod = require("some_module") -- 带有“events”表的模块

-- 定义回调并使用源模块的事件表 local my_callback = function(data, event, source, pid) if event == mymod.events.started then -- “started” 是事件名称

        -- started event from the resty-worker-events module

    elseif event == mymod.events.stoppping then  -- 'stopping' is the event name

        -- the above will throw an error because of the typo in `stoppping`

    end
end

ev.register(my_callback, mymod.events._source)

```

[返回目录](#table-of-contents)

poll ---- `语法:success, err = events.poll()`

将轮询新事件并处理所有事件(调用已注册的回调)。该实现非常高效,它只会检查单个共享内存值,如果没有任何新事件可用,则会立即返回。

返回值将为“done”,当它处理完所有事件时,为“recursive”,当它已在轮询循环中时,或为 `nil + error`,当出现错误时。“recursive” 结果发生在从事件处理程序发布事件时。事件处理程序从 `poll` 中调用,当发布事件时,发布方法也会在发布事件后调用 `poll`,从而导致循环。“recursive” 结果只是表示事件已成功发布,但尚未处理,因为还有其他事件需要先处理。

[返回目录](#table-of-contents)

post ---- `语法:success, err = events.post(source, event, data, unique)`

将发布一个新事件。`source` 和 `event` 都是字符串。`data` 可以是任何内容(包括 `nil`),只要它可以通过 cjson 模块进行(反)序列化即可。

如果提供了 `unique` 参数,则只有一个工作进程会执行该事件,其他工作进程将忽略它。此外,任何具有相同 `unique` 值的后续事件都将被忽略(对于传递给 [configure](#configure) 的 `timeout` 周期)。执行该事件的进程不一定发布该事件的进程。

在返回之前,它将调用 [poll](#poll) 来处理所有事件,直到并包括新发布的事件。检查返回值以确保它已完成,请参见 `poll`。

返回值将是 `poll` 的结果。

*注意*: 发送事件的 worker 进程也会收到事件!因此,如果 eventsource 也会对事件采取行动,它不应该从事件发布代码中执行此操作,而应该只在接收事件时执行。

[返回目录](#table-of-contents)

post_local ---------- `语法: success, err = events.post_local(source, event, data)`

与 [post](#post) 相同,但事件将局限于 worker 进程,不会广播到其他 worker。使用此方法,`data` 元素不会被 json 化。

在返回之前,它将调用 [poll](#poll) 首先处理发布的事件,然后处理所有其他新发布的事件。检查返回值以确保它已完成,请参阅 `poll`。

返回值将是 `poll` 的结果。

[返回目录](#table-of-contents)

register -------- `语法: events.register(callback, source, event1, event2, ...)`

将注册一个回调函数来接收事件。如果省略了 `source` 和 `event`,则回调将在 _每个_ 事件上执行;如果提供了 `source`,则只传递与源匹配的事件。如果给出了 (一个或多个) 事件名称,则只有在 `source` 和 `event` 都匹配时才会调用回调。

回调应该具有以下签名;

`语法: callback = function(data, event, source, pid)`

参数将与提供给 [post](#post) 的参数相同,除了额外的值 `pid`,它将是源 worker 进程的 pid,如果是本地事件,则为 `nil`。`callback` 的任何返回值都将被丢弃。*注意*: `data` 可能是数据类型的引用类型(例如 Lua `table` 类型)。相同的值传递给所有回调,_因此不要在您的处理程序中更改该值,除非您知道自己在做什么!_

`register` 的返回值将为 `true`,或者如果 `callback` 不是函数值,则会抛出错误。

*警告*: 事件处理程序必须快速返回。如果处理程序花费的时间超过配置的 `timeout` 值,事件将被丢弃!

*注意*: 要接收进程自己的 `started` 事件,必须在调用 [configure](#configure) 之前注册处理程序。

[返回目录](#table-of-contents)

register_weak ------------- `语法: events.register_weak(callback, source, event1, event2, ...)`

此函数与 `register` 相同,唯一的例外是该模块只会对 `callback` 函数保留 _弱引用_。

[返回目录](#table-of-contents)

unregister ---------- `语法: events.unregister(callback, source, event1, event2, ...)`

将注销回调函数并阻止它接收更多事件。参数的工作原理与 [register](#register) 完全相同。

返回值将为 `true` 如果它被移除,`false` 如果它不在处理程序列表中,或者如果 `callback` 不是函数值,则会抛出错误。

[返回目录](#table-of-contents)

安装 ============

不需要任何特殊的操作,像任何其他纯 Lua 模块一样安装。只需确保它的位置在模块搜索路径中即可。

[返回目录](#table-of-contents)

待办事项 ====

[返回目录](#table-of-contents)

* 在修复“停止”事件后,激活并实现第一个测试

错误和补丁 ================

请通过在 [GitHub 问题跟踪器](http://github.com/Kong/lua-resty-worker-events/issues) 上创建一个票证来报告错误或提交补丁,

[返回目录](#table-of-contents)

作者 ======

Thijs Schreijer <thijs@konghq.com>,Kong Inc.

[返回目录](#table-of-contents)

版权和许可 =====================

该模块是根据 [Apache 2.0 许可](https://open-source.org.cn/licenses/Apache-2.0) 授权的。

版权所有 (C) 2016-2019,由 Thijs Schreijer,Kong Inc. 所有。

保留所有权利。

[返回目录](#table-of-contents)

历史 =======

注意: 请在发布新版本时更新代码中的版本号!

1.1.0,未发布

- 修复: 在无法写入 shm 时改进日志记录(添加有效负载大小以进行故障排除)- 修复: 不要再记录有效负载,因为它可能会通过日志公开敏感数据 - 更改: 将 `shm_retries` 默认值更新为 999

1.0.0,2019 年 7 月 18 日

- 中断性变更: `poll`(因此也是 `post` 和 `post_local`)的返回值已更改为更类似于 Lua,在一切顺利时为真值。- 功能: 新选项 `shm_retries` 用于修复在发布事件时由 shm 中的内存碎片造成的“无内存”错误。- 修复: 修复了变量名称中的两个拼写错误(边缘情况)

0.3.3,2018 年 5 月 8 日

- 修复: 初始化阶段的超时,通过删除超时设置,请参阅问题 #9

0.3.2,2018 年 4 月 11 日

- 更改: 在处理程序错误中添加堆栈跟踪 - 修复: 如果值不可序列化,则错误处理程序失败,请参阅问题 #5 - 修复: 修复了弱处理程序的测试

[返回目录](#table-of-contents)

另请参阅 ======== * OpenResty: https://openresty.org.cn

[返回目录](#table-of-contents)

尝试避免大型事件有效负载 使用更小的 `interval`,这样 worker 可以更频繁地检查(和处理)事件(请参阅传递给 `configure` 的 `interval` 选项) 增加 SHM 大小,这样它可以容纳在一个间隔内可能发送的所有事件数据。

方法

configure

语法: success, err = events.configure(opts)

将初始化事件侦听器。opts 参数是一个具有命名选项的 Lua 表

  • shm: (必需) 要使用的共享内存的名称。事件数据不会过期,因此模块依赖于 shm lru 机制来从 shm 中驱逐旧事件。因此,shm 可能不应该用于其他目的。

  • shm_retries: (可选) 当 shm 在发布事件时返回“无内存”时的重试次数,默认值为 999。每次尝试插入但没有内存可用(没有可用空间或内存可用但已碎片化)时,将驱逐“最多十几个”旧条目。之后,如果仍然没有可用内存,则返回“无内存”错误。重试插入会触发驱逐阶段多次,从而增加可用内存以及找到足够大的连续内存块的可能性,以供新的事件数据使用。

  • interval: (可选) 轮询事件的间隔(以秒为单位),默认值为 1。设置为 0 以禁用轮询。

  • wait_interval: (可选) 找到新的 eventid 但数据尚未可用(由于 worker 进程的异步行为)时,两次尝试之间的间隔

  • wait_max: (可选) 在丢弃事件之前,找到事件 id 后等待数据的最长时间。这是一个故障安全设置,以防出现问题。

  • timeout: (可选) 存储在 shm 中的唯一事件数据的超时(以秒为单位),默认值为 2。请参阅 post 方法的 `unique` 参数。

返回值将为 `true` 或 `nil` 和错误消息。

此方法可以重复调用以更新设置,除了 `shm` 值,该值在初始配置后无法更改。

注意: wait_interval 是使用 `ngx.sleep` 函数执行的。在该函数不可用的上下文中(例如 `init_worker`),它将执行一个忙等待以执行延迟。

configured

语法: is_already_configured = events.configured()

事件模块在每个 worker 进程中作为一个单例运行。configured 函数允许检查它是否已启动并运行。建议在启动任何依赖项之前进行检查;

    local events = require "resty.worker.events"
    
    local initialization_of_my_module = function()
        assert(events.configured(), "Please configure the 'lua-resty-worker-events' "..
               "module before using my_module")
    
        -- do initialization here
    end

event_list

语法: _M.events = events.event_list(sourcename, event1, event2, ...)

实用函数用于生成事件列表并防止魔术字符串中的拼写错误。访问返回表中不存在的事件会导致“未知事件错误”。第一个参数 `sourcename` 是一个唯一名称,用于标识事件源,该名称将作为字段 `_source` 可用。所有后续参数都是事件源生成的命名事件。

示例用法;

    local ev = require "resty.worker.events"
    
    -- Event source example
    
    local events = ev.event_list(
            "my-module-event-source", -- available as _M.events._source
            "started",                -- available as _M.events.started
            "event2"                  -- available as _M.events.event2
        )
    
    local raise_event = function(event, data)
        return ev.post(events._source, event, data)
    end
    
    -- Post my own 'started' event
    raise_event(events.started, nil) -- nil for clarity, no eventdata is passed
    
    -- define my module table
    local _M = {
      events = events   -- export events table
    
      -- implementation goes here
    }
    return _M
    
    
    
    -- Event client example;
    local mymod = require("some_module")  -- module with an `events` table
    
    -- define a callback and use source modules events table
    local my_callback = function(data, event, source, pid)
        if event == mymod.events.started then  -- 'started' is the event name
    
            -- started event from the resty-worker-events module
    
        elseif event == mymod.events.stoppping then  -- 'stopping' is the event name
    
            -- the above will throw an error because of the typo in `stoppping`
    
        end
    end
    
    ev.register(my_callback, mymod.events._source)
    

poll

语法: success, err = events.poll()

将轮询新事件并处理所有事件(调用已注册的回调)。该实现非常高效,它只会检查单个共享内存值,如果没有任何新事件可用,则会立即返回。

返回值将为 `“done”` 当它处理完所有事件时,如果它已经在轮询循环中,则为 `“recursive”`,或者如果出现问题,则为 `nil + error`。“recursive”` 结果发生在从事件处理程序发布事件时。事件处理程序是从 `poll` 中调用的,并且在发布事件时,post 方法也会在发布事件后调用 `poll`,从而导致循环。“recursive”` 结果只是意味着事件已成功发布,但尚未处理,因为其他需要首先处理的事件排在它前面。

post

语法: success, err = events.post(source, event, data, unique)

将发布一个新事件。source 和 `event` 都是字符串。data 可以是任何东西(包括 `nil`),只要它可以被 cjson 模块(反)序列化即可。

如果提供了 `unique` 参数,则只有一个 worker 将执行事件,其他 worker 将忽略它。此外,任何具有相同 `unique` 值的后续事件也将被忽略(对于传递给 configure 的 `timeout` 时间段)。执行事件的进程不一定是发布事件的进程。

在返回之前,它将调用 poll 处理直到新发布事件的所有事件。检查返回值以确保它已完成,请参阅 `poll`。

返回值将是 `poll` 的结果。

注意: 发送事件的 worker 进程也会收到事件!因此,如果 eventsource 也会对事件采取行动,它不应该从事件发布代码中执行此操作,而应该只在接收事件时执行。

post_local

语法: success, err = events.post_local(source, event, data)

post 相同,但事件将局限于 worker 进程,不会广播到其他 worker。使用此方法,`data` 元素不会被 json 化。

在返回之前,它将调用 poll 首先处理发布的事件,然后处理所有其他新发布的事件。检查返回值以确保它已完成,请参阅 `poll`。

返回值将是 `poll` 的结果。

register

语法: events.register(callback, source, event1, event2, ...)

将注册一个回调函数来接收事件。如果省略了 `source` 和 `event`,则回调将在 _每个_ 事件上执行;如果提供了 `source`,则只传递与源匹配的事件。如果给出了 (一个或多个) 事件名称,则只有在 `source` 和 `event` 都匹配时才会调用回调。

回调应该具有以下签名;

语法: callback = function(data, event, source, pid)

参数将与提供给 post 的参数相同,除了额外的值 `pid`,它将是源 worker 进程的 pid,如果是本地事件,则为 `nil`。`callback` 的任何返回值都将被丢弃。注意: `data` 可能是数据类型的引用类型(例如 Lua `table` 类型)。相同的值传递给所有回调,_因此不要在您的处理程序中更改该值,除非您知道自己在做什么!_

`register` 的返回值将为 `true`,或者如果 `callback` 不是函数值,则会抛出错误。

警告: 事件处理程序必须快速返回。如果处理程序花费的时间超过配置的 `timeout` 值,事件将被丢弃!

注意: 要接收进程自己的 `started` 事件,必须在调用 configure 之前注册处理程序。

register_weak

语法: events.register_weak(callback, source, event1, event2, ...)

此函数与 `register` 相同,唯一的例外是该模块只会对 `callback` 函数保留 _弱引用_。

unregister

语法: events.unregister(callback, source, event1, event2, ...)

将注销回调函数并阻止它接收更多事件。参数的工作原理与 register 完全相同。

返回值将为 `true` 如果它被移除,`false` 如果它不在处理程序列表中,或者如果 `callback` 不是函数值,则会抛出错误。

安装

不需要任何特殊的操作,像任何其他纯 Lua 模块一样安装。只需确保它的位置在模块搜索路径中即可。

待办事项

  • 在修复“停止”事件后,激活并实现第一个测试

错误和补丁

请通过在 GitHub 问题跟踪器 上创建一个票证来报告错误或提交补丁,

作者

Thijs Schreijer <thijs@konghq.com>,Kong Inc.

版权和许可

该模块是根据 Apache 2.0 许可 授权的。

版权所有 (C) 2016-2019,由 Thijs Schreijer,Kong Inc. 所有。

保留所有权利。

历史

注意: 请在发布新版本时更新代码中的版本号!

1.1.0,未发布

  • 修复: 改善了无法写入共享内存时的日志记录(添加了有效载荷大小以进行故障排除)

  • 修复: 不再记录有效载荷,因为它可能会通过日志泄露敏感数据

  • 更改: 将 `shm_retries` 的默认值更新为 999

1.0.0,2019 年 7 月 18 日

  • 重大变更: `poll`(以及 `post` 和 `post_local`)的返回值已更改为更 Lua 化,在一切正常时为真值。

  • 功能: 新选项 `shm_retries` 用于解决在发布事件时由于共享内存碎片化导致的“内存不足”错误。

  • 修复: 修正了变量名称中的两个拼写错误(边缘情况)

0.3.3,2018 年 5 月 8 日

  • 修复: 初始化阶段的超时问题,通过删除超时设置解决,参见 issue #9

0.3.2,2018 年 4 月 11 日

  • 更改: 在处理程序错误中添加堆栈跟踪

  • 修复: 如果值不可序列化,则修复失败的错误处理程序,参见 issue #5

  • 修复: 修正了弱处理程序的测试

另请参见

  • OpenResty: https://openresty.org.cn

作者

Kong

许可证

apache2

版本