skynet是开源社区中一个璀璨的明星,在设计上高屋建瓴,整个核心层代码数量非常少,深度嵌入lua语言,使得开发任何网络服务端的应用,都能很快的实现,并且非常方便后续的开发和维护。这里主要就网络服务端很常见的进程间通信的场景,对skynet是如何解决的作一番剖析。
skynet提供的cluster模块,就是用于两个进程间通信的解决方案。cluster模块主要包含clusterd.lua、cluster.lua、clustersender.lua、clusteragent.lua、lua-cluster.c,还有一些公共模块。在节点(运行中的进程)运行时,clusterd.lua作为一个服务(通过snlua(99%的服务的宿主)动态库建立),cluster.lua向外提供操作接口,最终在clusterd服务里开启对一个端口的监听,同时,当有其他的节点发起对这个节点的网络连接时,通过clusterd会建立一个clusteragent服务,skynet进程间通信的消息都是由连接方(底层调用connect)主动(不会由建立clusteragent的节点主动发起通信)发起的。对另一个节点发起通信,会通过clusterd服务建立一个clustersender服务,然后通过clustersender向另一个节点发数据。这些都是skynet框架层提供的底层支持,应用层不需要修改(之前因为不满足我们项目的一个需求,做过一点修改)。通常是在一个服务A里对另一个节点的某个服务B发送数据,数据的流向是服务A->clustersender->服务A所在节点的网络层->服务B所在节点的网络层->clusteragent->服务B,如果需要等服务B返回数据,会在服务A、clustersender服务、clusteragent服务挂起协程,等服务B处理完业