Treasure / sktpmd

Created Mon, 30 May 2022 00:00:00 +0000
883 Words

简介

sktpmd模块是skynet-x底层集群模块,它承担了skynet-x网络节点之间的通讯职能。全名为(skynet port managment daemon)

架构

  1. sktpmd 为了满足对等网络的性质,所以每次和其他节点建立连接是有两条连接, 当A节点于B节点建立连接,首先A节点发送握手等待B确认,B确认完成之后重复走A的流程,这样一个双向连接就被建立了起来,1.6.0改变了个行为,对于像存在类似缓存,或者数据中心的业务而言的单向节点而言,只需要一条连接即可,节省资源。

  2. sktpmd现在支持原始的tcp,udp,unix协议,后续规划可能由reliable udp实现,降低集群通讯延时并提供更好的性能和时延性。

  3. 远程命名服务,通过内置命令生成唯一的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 下以发挥更好的性能