在线设计:零基础做出专业设计的实用指南
2026/1/16 11:02:43
这是 Skynet 集群模块中的入站连接处理器,负责处理来自其他节点的连接请求,并将请求转发给本地服务。是 Skynet集群能够实现高性能、可靠的跨节点通信的关键组件之一
clusteragent.lua 是 Skynet 集群模块中的入站连接处理器,它:
核心角色
服务启动参数
localclusterd,gate,fd=...clusterd=tonumber(clusterd)gate=tonumber(gate)fd=tonumber(fd)localskynet=require"skynet"localsocket=require"skynet.socket"localcluster=require"skynet.cluster.core"localignoreret=skynet.ignoreretlocalclusterd,gate,fd=...clusterd=tonumber(clusterd)gate=tonumber(gate)fd=tonumber(fd)详细解析
clusterd=tonumber(clusterd)gate=tonumber(gate)fd=tonumber(fd)-- 在 clusterd.lua 的 socket 处理中localagent=skynet.newservice("clusteragent",skynet.self(),-- clusterdsource,-- gatefd-- 连接文件描述符)locallarge_request={}localinquery_name={}localregister_namelocalregister_name_mt={__index=function(self,name)localwaitco=inquery_name[name]ifwaitcothenlocalco=coroutine.running()table.insert(waitco,co)skynet.wait(co)returnrawget(register_name,name)elsewaitco={}inquery_name[name]=waitcolocaladdr=skynet.call(clusterd,"lua","queryname",name:sub(2))-- name must be '@xxxx'ifaddrthenregister_name[name]=addrendinquery_name[name]=nilfor_,coinipairs(waitco)doskynet.wakeup(co)endreturnaddrendend}localfunctionnew_register_name()register_name=setmetatable({},register_name_mt)endnew_register_name()localtracetag详细解析
locallarge_request={}{addr=目标地址,is_push=是否推送,tracetag=跟踪标签,-- 分片数据通过 cluster.append 添加}localinquery_name={}这是一个关键设计,实现了名称查询的延迟加载和并发控制。
元表定义
localregister_name_mt={__index=function(self,name)-- 查询逻辑end}查询函数详细解析
第1步:检查是否已有查询在进行
localwaitco=inquery_name[name]ifwaitcothenlocalco=coroutine.running()table.insert(waitco,co)skynet.wait(co)returnrawget(register_name,name)end场景:已有其他协程正在查询同一名称
第2步:开始新的查询
waitco={}inquery_name[name]=waitcolocaladdr=skynet.call(clusterd,"lua","queryname",name:sub(2))-- name must be '@xxxx'ifaddrthenregister_name[name]=addrendinquery_name[name]=nilfor_,coinipairs(waitco)doskynet.wakeup(co)endreturnaddr详细流程:
localaddr=skynet.call(clusterd,"lua","queryname",name