同理,对节点进行接收消息的 clusteragent 服务的创建大同小异。 现在,对每个节点都创建了 clustersender, clusteragent 两个服务后,我们看下cluster.call的执行过程是怎样的。 cluster.call 的执行过程 当执行cluster.call时,首先先访问当前缓存是否有对应节点的发送服务信息,如果没有先将此次消息插入到节点的消息队列...
13 return cluster.unpackresponse(msg) -- session, ok, data, padding 14 end 对于进程2,gate服务收到进程1的tcp连接请求后, 第8行,给clusterd服务发送消息 第17-18行,clusterd收到后,新建一个clusteragent服务。注:clusteragent是skynet最近新加的。参考https://blog.codingnow.com/2018/04/skynet_cluster....
当这个gate服务收到网络连接时,会发送lua消息socket到clusterd服务,然后由clusterd启动一个clusteragent服务,来处理这个连接的消息: functioncommand.socket(source,subcmd,fd,msg)ifsubcmd=="open"thenskynet.error(string.format("socket accept from %s",msg))-- new cluster agentcluster_agent[fd]=falselocalag...
clusterd 保留了对外请求的功能,所以大致是原来 50% 的处理量。而剩下的 50% 则被分摊到了多个 clusteragent 上,数量正是节点数量减一。 由于clusteragent 的相关消息转发环节还做了一些优化处理,减少了消息内存的拷贝,对消息转发的处理速度也比 clusterd 的转发速度快了一倍。经测试,在我们这台虚拟机上,差不多...
Cluster 的配置文件就是这样做的。注意:默认 skynet 使用自带的修改版 lua ,会缓存 lua 源文件。当一个 lua 文件通过 loadfile 加载后,磁盘上的修改不会影响下一次加载。所以你需要直接用 io.open 打开文件,再用 load 加载内存中的 string 。 另一个更好的方法是使用sharedata模块。
Cluster 的配置文件就是这样做的。注意:默认 skynet 使用自带的修改版lua,会缓存 lua 源文件。当一个 lua 文件通过 loadfile 加载后,磁盘上的修改不会影响下一次加载。所以你需要直接用 io.open 打开文件,再用 load 加载内存中的 string 。 另一个更好的方法是使用sharedata模块。
假如图2-23的ping1要发送消息给另一个节点ping3,流程是:节点1先和节点2建立TCP连接,消息经由skynet传送至节点2的cluster服务,再由cluster转发给节点内的ping3。 节点配置: examples/.Pconfig.c1中新增的内容如下: node = "node1" examples/Pconfig.c2中新增的内容如下: ...
skynet cluster 模块的设计与编码协议 skynet 在最初的设计里,希望做一个分布式系统,抹平 actor 放在本机和处于网络两端的差别。所以,设计了 master/slave 模式。利用 4 个字节表示 actor 的地址,其高 8 位是节点编号,低 24 位是进程(节点)内的 id 。这样,在同一个系统中,不管处于哪个进程下,每个 actor ...
agent服务向客户端发送消息时,直接通过管道,将数据包从worker线程发送往socket线程,socket线程收到后,会将数据包存入对应socket的write buffer中,最后再向客户端推送。 skynet的几个基本服务 我们可以在skynet/service/bootstrap.lua里看到skynet的基本lua服务启动流程,这里不再赘述。 集群 这一部分,云风大侠已经说的...
cluster之间调用是双向的,也就是A->B 和 B->A 是两个socket通道。 对于一种简单的请求+后续广播的需求,遇到了消息到达顺序问题。 之前看到了这个讨论:#576 基本和我的问题一致,文中的方案可以解决,但总感觉应该有更好的设计方法 来解决,或者之前自己被绕的设计想法不对。