skynet cluster集群笔记

news/2024/11/28 19:35:59/

skynet cluster集群笔记

  • 前言
  • cluster相关方法说明
  • 集群设计方案:
  • 集群中常遇到的问题:
  • 注意事项:

前言

skynet 是一个基于事件驱动的分布式游戏服务器框架,支持构建高性能、高并发的网络程序。在 skynet中,集群是指将多个节点连接在一起,共同协作完成任务的一个系统,一个skynet集群架构中涉及的一些名词如下:

1. 节点: skynet 中的节点是指运行着 skynet 实例的独立服务器。每个节点都有自己的地址和唯一标识符,可以运行不同的服务。节点之间通过网络连接进行通信和协作。
2. 服务: 在 skynet 中,服务是指运行在节点上的具体功能模块。每个服务都有一个唯一的服务名标识符,可以通过该标识符进行访问和通信。服务可以在同一节点上运行,也可以跨节点部署。
3. 集群: skynet 中的集群是指多个节点连接在一起,共同组成一个分布式系统。集群中的节点可以相互通信,共享资源,协同完成任务。集群可以通过网络连接,也可以根据配置在同一台物理机器上运行多个节点。
4. 节点发现: 节点发现是指节点之间相互发现和连接的过程。skynet 提供了节点发现的功能,可以通过配置文件(例如clustername)或者其他方式指定节点的地址和端口,使节点能够找到彼此并建立连接。
5. 服务发现: 集群中的服务发现是指服务之间相互发现和通信的过程。通过服务发现,可以在集群中查找和访问指定的服务,实现分布式系统中的模块化和协作。

cluster相关方法说明

cluster.call: 用于在集群中向指定节点的服务发送请求并等待其回应。它可以用于远程调用其他节点上的服务。

-- 调用名为 "testservice" (也可以是address)的服务的 "hello" 函数,并传递参数 "arg1" 和 "arg2",等待返回结果
local ret = cluster.call("node1", ".testservice", "hello", "arg1", "arg2")
print(ret) 

cluster.send: 用于在集群中向指定节点的服务发送消息,不等待回应。它通常用于异步通信或者发送不需要返回结果的消息。

-- 向名为 "testservice" (也可以是address)的服务发送消息通知,传递参数 "message"
cluster.send("node2", ".testservice", "notify", "message")

cluster.open: 打开节点端口, 通知网关监听节点端口。用于节点发现,这个节点中的服务可以被其他节点调用(前提需要使用cluster.register或cluster.proxy获取到服务句柄)。

-- 在当前节点中打开一个名为 "node1" 的服务,并指定处理函数
cluster.open("node1")

cluster.reload: 用于加载集群节点配置

-- 加载node2,用于集群中的节点发现(node1配置关闭状态)
-- __nowaiting设置true,表示使用cluster.call时是阻塞等待,若设置为false,cluster.call不等待加载完成,而立即返回
-- __nowaiting默认为true
cluster.reload {__nowaiting = true,node1 = false, -- node1 is downnode2 = "127.0.0.1:2529"}

cluster.proxy: 用于在当前节点中创建一个代理对象,代理指定节点上的服务。这样可以方便地通过代理对象调用远程服务。(可以直接使用skynet.call代替使用cluster.call直接调用远端服务地址)

-- 将远程节点node2上的db1服务在本地创建一个代理对象
local proxy = cluster.proxy "node2@db1"   -- cluster.proxy("node2", "@.db1")
-- 使用代理对象调用远程服务的方法
skynet.call(proxy, "lua", ...)

cluster.snax: 用于在当前节点中创建一个 SNAX 服务实例,该实例可以管理指定节点上的 SNAX 服务。

-- 创建一个 SNAX 服务实例,管理名为 "testservice" 的 SNAX 服务,位于 "node1" 节点上
local instance = cluster.snax("node1", "testservice")

cluster.register: 用于将addr注册为在cluster中可见的字符串名字name,如果不传addr,如默认将自身注册为name

-- 在集群中注册当前节点的db1服务
cluster.register(".db1")

cluster.unregister: 用于取消cluster.register的注册。

cluster.unregister(".db1")

cluster.query: 用于查询指定节点上注册的服务名字,返回该名字对应的服务数字地址。若不存在,则抛出error

-- 查询节点node1上的.db1服务的address,并返回其对应的服务地址
local address = cluster.query("node1", ".db1")
print(address)  -- 打印查询结果

源方法使用的注意点:
cluster.call、cluster.send、cluser.proxy接口可以使用@加字符串的方式来调用通过cluster.register注册的服务(官方推荐用法

集群设计方案:

-- TODO(未完待续)

集群中常遇到的问题:

-- TODO (未完待续)

注意事项:

-- TODO(未完待续)

http://www.ppmy.cn/news/1379719.html

相关文章

2024年春招程序员个人简历范本(精选5篇|附模板)

HR浏览一份简历也就25秒左右,如果你连「好简历」都没有,怎么能找到好工作呢? 如果你不懂得如何在简历上展示自己,或者觉得怎么改简历都不出彩,那请你一定仔细读完。 Java开发工程师简历范本> 性别 男 年龄 24 学历 本科 张三 专业 计算机科学与技术 毕业院校 …

C++ set 容器

1.6 C set 容器 一般性的 Set 实现而言,是无序的,在 C 中,std::set 是有序的容器,它基于红黑树(Red-Black Tree)实现,并且会根据元素的键值进行排序。因此,std::set 中的元素总是按…

Docker 的资源控制

目录 Docker 的资源控制为什么需要资源控制?控制内存使用限制 CPU 使用磁盘 I/O 控制网络带宽限制实践建议 Docker 资源控制:保障性能与稳定性Docker资源控制概览内存限制CPU限制磁盘 I/O 控制网络带宽管理实际应用 Docker 启动后的 更新资源管理 Docker…

[蓝桥杯]接龙数列(C语言)

目录 题目链接 题目理解 解题思路 完整代码 重难点解答 *dp数组的具体用法 *对于dp[b]dp[a]1>dp[b]?dp[a]1:dp[b]的解释 题目链接 [蓝桥杯 2023 省 B] 接龙数列 - 洛谷 题目理解 这道题让我们求任给的一串数字,若想让其变成接龙数列最少需要删除的数字…

查找字符串在Text文本中的位置

public static Vector3 GetStringPositionAtText(Text text, string strFragment) {int strFragmentIndex text.text.IndexOf(strFragment); //-1表示不包含strFragmentVector3 stringPos Vector3.zero;if (strFragmentIndex > -1){Vector3 firstPos GetCharPositionAtTe…

‘ jupyter ‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

安装anaconda后,在 Dos黑窗口 运行 jupyter notebook 的两个问题 原因:没配置环境变量 解决方法: 在 系统环境变量Path 中 添加两个地址 这里以anaconda安装在 D:\anaconda\install 下为例 (根据个人安装具体位置而定&#xff…

架构师面试100问?

面试架构师时,需要考察广泛的知识领域,包括技术、架构设计、团队管理、沟通能力等方面。以下是一些可能的面试问题,涵盖了多个方面问题: 介绍一下你的技术背景和经验。你在之前的项目中扮演过哪些角色?你对微服务架构…

go go.mod file not found in current directory or any parent directory

场景: 安装好 liteide 之后创建了第一个 “hello world” 的golang 项目,却报了如下错误。 原因分析: go 的环境配置问题。与 golang 的包管理有关。 解决方案: 如果你是 Windows 系统,快捷键 “WinR”&#xff0c…