lua-resty-sync

基于版本变更同步数据

$ opm get upyun/lua-resty-sync

名称

lua-resty-sync - 基于版本变更同步数据

概述

    http {
        lua_shared_dict sync 5m;
        lua_shared_dict locks 1m;
    
        init_worker_by_lua_block {
            local sync = require "resty.sync"
    
            local syncer, err = sync.new(5, "sync")
            if not syncer then
                ngx.log(ngx.WARN, "failed to create sync object: ", err)
                return
            end
    
            local callback = function(mode)
                if mode == sync.ACTION_DATA then
                    -- GET DATA
                    return "data " .. math.random(100) -- just some fake data
                else
                    -- GET VERSION
                    return "version " .. math.random(100)
                end
            end
    
            -- register some tasks
            syncer:register(callback, "ex1")
    
            -- start to run
            syncer:start()
    
            -- save it
            SYNCER = syncer
        }
    
        server {
            server_name _;
            listen *:9080;
    
            location = /t {
                content_by_lua_block {
                    local sync = require "resty.sync"
    
                    local syncer = SYNCER
    
                    local version, err = syncer:get_version("ex1")
                    if not version then
                        ngx.log(ngx.WARN, "failed to fetch version: ", err)
                        return
                    end
    
                    local data, err = syncer:get_data("ex1")
    
                    if not data then
                        ngx.log(ngx.WARN, "failed to fetch data: ", err)
                        return
                    end
    
                    ngx.say("task ex1, data: ", data, " and version: ", version)
    
                    ngx.sleep(5)
    
                    -- after 5s
                    local version2, err = syncer:get_version("ex1")
                    if not version2 then
                        ngx.log(ngx.WARN, "failed to fetch version: ", err)
                        return
                    end
    
                    local data2, err = syncer:get_data("ex1")
    
                    if not data2 then
                        ngx.log(ngx.WARN, "failed to fetch data: ", err)
                        return
                    end
    
                    ngx.say("after 5s, task ex1, data: ", data2, " and version: ", version2)
                }
            }
        }
    }

描述

这个 lua-resty 库帮助您根据版本变更同步数据(来自 redis、mysql、memcached 等)。

它会通过比较自身缓存的版本(存储在共享内存中)和外部源的版本来检查数据的新鲜度,当缓存的版本过期或第一次访问时,数据将被更新。请查看 概述方法 来学习如何使用这个库。

请注意,这个 lua 模块依赖于 lua-resty-lock

状态

在大多数情况下可能已经准备好投入生产,尽管尚未在实际环境中经过验证。请查看问题列表,如果您有任何问题,请告诉我。

方法

new

语法: local syncer, err = sync.new(interval, shm)

阶段: init_worker

创建并返回一个 sync 实例。

第一个参数 interval 表示两次连续操作之间的时间间隔(以秒为单位),必须大于 0。第二个参数 shm 是一个 Lua 字符串,代表共享内存。

如果失败,将返回 nil 和描述相应错误的 Lua 字符串。

register

语法: local ok, err = syncer:register(callback, tag)

阶段: init_worker

将一个任务注册到由 new 创建的实例 syncer 中。

第一个参数 callback 可以是任何 Lua 函数,它将在稍后在后台“轻量级线程”中被调用。回调函数不仅用于捕获数据,还用于获取版本。

只有一个参数 mode 可以传递给此函数,其值始终为

  • sync.ACTION_DATA - 此次捕获数据。

  • sync.ACTION_VERSION - 此次获取版本。

第二个参数 tag 是一个 Lua 字符串,用于区分不同的任务,因此它不能与以前注册的任何任务重复。

如果失败,将返回 nil 和描述相应错误的 Lua 字符串。

start

语法: local ok, err = syncer:start()

阶段: init_worker

让实例 syncer 开始工作。请注意,在所有工作线程中只创建了一个定时器。唯一性在整个服务的生命周期中保持,即使定时器所有者工作线程崩溃或 nginx 重新加载发生。

此实例中的回调将按顺序运行(根据注册顺序)。

如果失败,将返回 nil 和描述相应错误的 Lua 字符串。

get_version

语法: local version, err = syncer:get_version(tag)

阶段: set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer.\, balancer_by_lua, ssl_certificate_by_lua, ssl_session_fetch_by_lua, ssl_session_store_by_lua*

获取一个任务(由 tag 指定)的当前版本。

如果失败,将返回 nil 和描述相应错误的 Lua 字符串。

特别是,当没有数据时,将返回 nil"no data"

get_data

语法: local data, err = syncer:get_data(tag)

阶段: set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer.\, balancer_by_lua, ssl_certificate_by_lua, ssl_session_fetch_by_lua, ssl_session_store_by_lua*

获取一个任务(由 tag 指定)的当前数据。

如果失败,将返回 nil 和描述相应错误的 Lua 字符串。

特别是,当没有数据时,将返回 nil"no data"

get_last_modified_time

语法: local timestamp, err = syncer:get_last_modified_time(tag)

阶段: set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer.\, balancer_by_lua, ssl_certificate_by_lua, ssl_session_fetch_by_lua, ssl_session_store_by_lua*

获取一个任务(由 tag 指定)的最后更新时间(unix 时间戳)。

如果失败,将返回 nil 和描述相应错误的 Lua 字符串。

特别是,当没有数据时,将返回 nil"no data"

待办事项

  • 在一个 sync 实例中并发执行更新。

作者

Alex Zhang(张超) zchao1995@gmail.com, UPYUN Inc.

版权和许可

该包本身是在 2 条款 BSD 许可下授权的。

版权所有 (c) 2017,UPYUN(又拍云) Inc.

该模块是在 BSD 许可条款下授权的。

允许以源代码和二进制形式重新分发和使用本软件,无论是否修改,只要满足以下条件:

  • 重新分发源代码必须保留以上版权声明、此条件列表和以下免责声明。

  • 以二进制形式重新分发必须在随发行版提供的文档和/或其他材料中复制以上版权声明、此条件列表和以下免责声明。

本软件由版权持有人和贡献者“按原样”提供,任何明示或暗示的担保,包括但不限于对适销性和特定用途适用性的暗示担保均被排除。在任何情况下,版权持有人或贡献者均不对任何直接的、间接的、附带的、特殊的、惩罚性的或后果性的损害(包括但不限于替代商品或服务的采购;使用、数据或利润损失;或业务中断)负责,无论其责任基础如何,无论是在合同中、严格责任中,还是在侵权行为中(包括疏忽或其他原因)造成的,即使已告知存在此类损害的可能性,在任何情况下,因使用本软件而导致的损害均应归咎于版权持有人或贡献者。

作者

Alex Zhang(张超) zchao1995@gmail.com, UPYUN Inc.

许可证

2bsd

依赖项

版本