I use a different approach: configuration is stored in shared dictionary as JSON and in workers in deserialized form. Each time I want to get configuration I compare version stored in worker with version in shared dictionary. When my version is too old I update worker-level cache. It works as long as entire configuration can be deserialized in a sane amount of time, or if it can be divided into small parts that can be managed that way. It has an advantage of being simple to work with.
A simplified example:
-- config.lua
local M = {}
-- worker-level cache
local local_data_version = 0
local local_data
-- ngx.shared.my_config.data_json and ngx.shared.my_config.version are periodically set in ngx.timer worker
function M.get_full_config()
local shared_dict_config = ngx.shared.my_config
local shared_data_version = shared_dict_config.version
if shared_data_version > data_version then
data_version = shared_data_version
data = cjson.decode(shared_dict_config.data_json)
end
return data
end
return M