wonderbeyond
4/20/2016 - 8:55 AM

Simple load balancer for lua_resty_redis

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