简介
sktpmd
模块是skynet-x
底层集群模块,它承担了skynet-x
网络节点之间的通讯职能。全名为(skynet port managment daemon
)
架构
-
sktpmd
为了满足对等网络的性质,所以每次和其他节点建立连接是有两条连接, 当A节点于B节点建立连接,首先A节点发送握手等待B确认,B确认完成之后重复走A的流程,这样一个双向连接就被建立了起来,1.6.0改变了个行为,对于像存在类似缓存,或者数据中心的业务而言的单向节点而言,只需要一条连接即可,节省资源。 -
sktpmd
现在支持原始的tcp,udp,unix
协议,后续规划可能由reliable udp
实现,降低集群通讯延时并提供更好的性能和时延性。 -
远程命名服务,通过内置命令生成唯一的Name,通过Name来与其他节点通讯是友好的。
使用
-
启动也非常简单,无须任何代码,仅仅只需要在
conf.conf
中配置一下即可,使用的时候跟节点内通讯无任何区别。因为我已经作平了本地和节点之间的差异。 -
内部均由kproto进行编码,提供更快的序列化方式。
-
example call
skynet-x.send("host:port@name","rpc"...) -- 通过域名或者地址+端口的形式和其他节点进行通讯
skynet-x.send("alias","rpc",...) -- 通过别名
skynet-x.send(pid, "rpc",...) -- 通过pid亦可
tunnel
既然节点之间是双向连接,所以连接数量为 f(n) = n²-n
,如果节点过的时候,势必造成 socket fd
消耗殆尽,
基于这个问题,可以通过内置的tun
,来设置代理,这么一来,tun
的作用相当于这个集群节点的网关。因为其内部的节点相对于其他 tun
代理是不可见的,
通过配置tun
的规则开启多个,则可以实现业务拆分。
2022-10-07 此模块被弃用,可以用多节点转接的方式或代理的方式做到,如
send("n1.n2.n3@name")
服务发现
sktpmd
提供了一套服务发现机制,但其运作原理是不同于 etcd
或者 consul
,它本身是一个惰性发现,它不需要一个中心服维持它们的关系。
sktpmd整个发现流程是基于
gossip
算法来发现的,但一些api依然可以主动触发,v1.6.0
这个模块将保留,因为集群模式的逻辑改变了
v1.6.0集群建立
v1.5.0
之前节点之间都是双向链接,但考虑到一个单向服务器,如 dns server
,conf server
等,大部分是 request/response
模式,惰性连接的收益很大,所以去除之前的一些设计。
网络底层
参考 Go协程的思考,在linux
下,使用了 epoll
。所以尽量部署到 linux
下以发挥更好的性能