Simple load balancer for lua_resty_redis
-- Simple load balancer for lua_resty_redis
-- TODO: get nearest node
local cjson = require "cjson"
local exports = {
new = function (self, servers)
-- Generate a balancer based on servers
local len = table.getn(servers);
return {
next = function (self)
if not self._selected or self._selected >= len then
self._selected = 1
else
self._selected = self._selected + 1
end
return servers[self._selected]
end,
get_by_hash = function (self, str)
local digit = 0
local srv_idx = 0
for c in str:gmatch(".") do
digit = digit + c:byte()
end
srv_idx = (digit % len) + 1
return servers[srv_idx]
end
}
end,
_test = function (self)
-- Do test
-- resty -e 'require("redis_load_balancer"):_test()'
local balancer = self:new({
{
host = '1.1.1.1',
port = '8888',
},
{
host = '2.2.2.2',
port = '9999',
},
})
ngx.say(cjson.encode(balancer:next()))
ngx.say(cjson.encode(balancer:next()))
ngx.say(cjson.encode(balancer:next()))
ngx.say(cjson.encode(balancer:next()))
ngx.say(cjson.encode(balancer:next()))
end,
}
return exports