#1523·skynet

cluster 集群组网

Author: fanyhCreated Jan 14, 2022Updated May 15, 2025

云大侠,我在某业务场景中需要实现 cluster 组网 skynet 进程都是等价的slave(不是使用master-slave模式) 目前cluser的配置只能声明

    nodename = "nodeaddress"

我期望的输入方式

    slave = {
        "address",
        "address"
    }

loadconfig中config已经规定了cluser的配置格式

    for name,address in pairs(tmp) do
        if name:sub(1,2) == "__" then
            name = name:sub(3)
            config[name] = address
            skynet.error(string.format("Config %s = %s", name, address))
        else
            assert(address == false or type(address) == "string")
            if node_address[name] ~= address then
                -- address changed
                if node_sender[name] then
                    -- reset connection if node_sender[name] exist
                    node_channel[name] = nil 
                    table.insert(reload, name)
                end 
                node_address[name] = address
            end 
            local ct = connecting[name]
            if ct and ct.namequery and not config.nowaiting then
                skynet.error(string.format("Cluster node [%s] resloved : %s", name, address))
                skynet.wakeup(ct.namequery)
            end 
        end 
    end 

#Question: 我想问的是: 业务层不关心目标node在哪的情况下

可以对cluster进行扩展 支持 array吗?

还是自行将cluster包装一次 在wrapper中调度cluster (wrapper 中可以实现load level) ,例如: wrapper.lua:

local config = {
	slave = {
		"slave1",	--cluster config key
		"slave2"
	}
}

local wrapper = {}

function wrapper.call(name, ...)
	local slave = assert(config[name], name)
	local name = slave[math.random(1, #slave)] --load level
	cluserd.call(name, ...)
end

wrapper.call( slave,  ...)

这样就存在一个问题 cluster配置会变得臃肿 name将变成一个无意义的key cluser

    slave1 = "address"
    slave2 = "address"