当前位置: 首页 > news >正文

skynet.cluster 库函数应用

在这里插入图片描述

目录

  • 模块概览
  • 核心函数解析
    • 1. 节点通信
    • 2. 节点配置与监听
    • 3. 服务注册与查询
    • 4. 远程服务代理
  • 底层机制
  • 使用场景示例
    • 场景1:跨节点数据存储
    • 场景2:动态扩展节点
  • 注意事项

以下是对 cluster.lua 模块的详细解析,涵盖其核心功能、函数用途及使用示例:


模块概览

cluster.lua 是 Skynet 框架中用于实现跨节点通信集群管理的核心模块。它封装了节点间的消息传递、服务注册/查询、代理生成等功能,是构建分布式系统的关键组件。


核心函数解析

1. 节点通信

  • cluster.call(node, address, ...)
    作用:向指定节点的某个服务发起同步调用,等待并返回结果。
    参数

    • node:目标节点名称(如 "db")。
    • address:目标服务地址(十六进制或数字)。
    • ...:调用参数(支持多参数)。
      流程
    1. 检查目标节点的发送器(sender)是否存在。
    2. 若不存在,将请求加入任务队列,异步初始化发送器后重试。
    3. 通过发送器将请求转发至目标节点。
      示例
    local result = cluster.call("db", 0x123, "GET", "key")
    
  • cluster.send(node, address, ...)
    作用:向指定节点的服务发送异步消息,无需等待响应。
    参数:同 cluster.call
    特点:适用于无需返回值的场景(如日志记录)。
    示例

    cluster.send("db2", 0x456, "UPDATE", {data = "value"})
    

2. 节点配置与监听

  • cluster.open(port, maxclient)
    作用:启动节点监听,接受其他节点的连接请求。
    参数

    • port:端口号(数字)或预定义配置名称(字符串,如 "db")。
    • maxclient:最大连接数(可选)。
      示例
    cluster.open("db")         -- 使用配置中的端口
    cluster.open(2528, 100)   -- 监听2528端口,最多100个连接
    
  • cluster.reload(config)
    作用:动态更新集群配置(如节点地址变更)。
    参数config 为包含节点名称与地址的键值表。
    示例

    cluster.reload {db = "192.168.1.10:2528",db2 = "192.168.1.11:2529"
    }
    

3. 服务注册与查询

  • cluster.register(name, addr)
    作用:将当前服务的地址注册为全局名称,供其他节点查询。
    参数

    • name:服务名称(字符串)。
    • addr:服务地址(可选,默认当前服务)。
      示例
    cluster.register("sdb", skynet.self())  -- 注册当前服务为sdb
    
  • cluster.unregister(name)
    作用:解除服务的全局名称绑定。
    参数name 为已注册的名称。
    示例

    cluster.unregister("sdb")  -- 移除sdb的名称绑定
    
  • cluster.query(node, name)
    作用:查询指定节点上的服务地址。
    参数

    • node:目标节点名称。
    • name:服务名称。
      返回:服务地址(十六进制字符串)。
      示例
    local addr = cluster.query("db", "sdb")  -- 查询db节点的sdb服务地址
    

4. 远程服务代理

  • cluster.proxy(node, name)
    作用:生成远程服务的本地代理,支持直接调用远程方法。
    参数

    • node:目标节点名称。
    • name:服务名称或地址。
      示例
    local proxy = cluster.proxy("db", "sdb")
    proxy.send("SET", "key", "value")  -- 通过代理发送异步请求
    
  • cluster.snax(node, name, address)
    作用:绑定远程 Snax 服务,返回代理对象。
    参数

    • node:目标节点。
    • name:Snax 服务名称。
    • address:可选,直接指定服务地址。
      示例
    local ping = cluster.snax("db2", "pingserver")
    ping.post.ping("hello")  -- 调用Snax服务的post方法
    

底层机制

  • 发送器管理
    • 通过 sender 表缓存各节点的发送器(用于消息转发)。
    • 若发送器未初始化,任务会被加入 task_queue,异步初始化后执行。
  • 协程与异步
    • 使用 skynet.fork 和协程管理异步任务,避免阻塞主线程。
  • 集群服务(clusterd)
    • clusterd 是唯一服务,负责节点间通信的核心逻辑(如监听、注册、查询)。

使用场景示例

场景1:跨节点数据存储

-- 节点A(db)
cluster.open("db")
cluster.register("storage", skynet.self())-- 节点B(app)
local storage = cluster.proxy("db", "storage")
storage.call("SET", "user1", "data")
local data = storage.call("GET", "user1")

场景2:动态扩展节点

-- 新增节点后,动态更新配置
cluster.reload {db3 = "10.0.0.3:2530"
}
local new_node = cluster.proxy("db3", "new_service")
new_node.send("INIT")

注意事项

  1. 节点连通性:确保节点间网络互通,防火墙开放对应端口。
  2. 名称唯一性:全局服务名称需唯一,避免冲突。
  3. 错误处理:跨节点调用需捕获可能的超时或网络错误。
  4. 性能优化:频繁的跨节点调用可能成为瓶颈,建议批量操作或缓存结果。
http://www.xdnf.cn/news/100063.html

相关文章:

  • update方法
  • Kafka 保证多分区的全局顺序性的设计方案和具体实现
  • 接口访问数据库报错问题记录
  • Java多线程的暗号密码:5分钟掌握wait/notify
  • 大模型框架技术演进与全栈实践指南
  • 57、Spring Boot 最佳实践
  • 模板方法模式:定义算法骨架的设计模式
  • 图文结合 - 光伏系统产品设计PRD文档 -(慧哥)慧知开源充电桩平台
  • docker学习笔记5-docker中启动Mysql的最佳实践
  • SQL技术终极指南:从内核原理到超大规模应用
  • 4.23刷题记录(栈与队列专题)
  • devops自动化容器化部署
  • 【人工智能】解锁 AI 潜能:DeepSeek 大模型迁移学习与特定领域微调的实践
  • MCP 协议:AI 时代的 “USB-C” 革命——从接口统一到生态重构的技术哲学
  • 硬核解析:整车行驶阻力系数插值计算与滑行阻力分解方法论
  • vue项目打包后点击dist下面index.html(无法访问您的文件该文件可能已被移至别处、修改或删除。ERR_FILE_NOT_FOUND)比如若依
  • 金仓读写分离集群修改IP
  • 从性能到安全:大型网站系统架构演化的 13 个核心维度
  • Qt案例 使用QFtpServerLib开源库实现Qt软件搭建FTP服务器,使用QFTP模块访问FTP服务器
  • C语言中小写字母转大写字母
  • 数据通信学习笔记之OSPF的基础术语
  • 有哪些信誉良好的脂多糖供应商推荐?
  • 16.第二阶段x64游戏实战-分析二叉树结构
  • 前端js需要连接后端c#的wss服务
  • python自动化测试1——鼠标移动偏移与移动偏移时间
  • Redis 服务自动开启
  • Linux——进程优先级/切换/调度
  • Elasticsearch 堆内存使用情况和 JVM 垃圾回收
  • Maven 项目中引入本地 JAR 包
  • LinkedList与链表