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