首发于图解skynet

skynet深度探索

skynet是一个轻量级的,为在线游戏服务器打造的框架。在当前市面上,它是使用非常广泛的游戏服务端框架。它以精简的设计,良好的性能,非常不错的可拓展性,在业内备受欢迎。尽管skynet有诸多优点,但是它并不是一个开箱即用的框架,我们还需要对它进行比较深入地研究,才能将其更好地运用在自己的项目之中。

很久之前,我就写了skynet源码分析的文章,之前主要是放在自己的blog之上,后来为了更好地服务于社区,也曾向云风大大投过稿,并且得到了比较好的评价。为了能够让更多的第三方文档能够参与到skynet社区的建设中,云大也在skynet的wiki上设置了一个开放的编辑页面

写skynet源码分析的资料,可以说非常的多了,不过从我个人的学习经历来看,当时网上能搜到的资料,大多数是着重于某一个点进行深入研究,并未能找到一篇能够比较全面介绍skynet内部运作机制的文章,于是我决定写了一篇,对skynet进行比较系统地研究的文章--《skynet源码赏析》

这篇文章比较长,全文大概4万字,已经远远超过知乎文章的字数上限了,因此不再将原文贴到知乎上。文章先通过图文,大致介绍了skynet的基本结构,消息调度机制,然后再逐个模块,比较深入地对它们进行研究,如果读者只是想大概了解一下skynet,那么只需要阅读overview部分即可,如果读者希望了解skynet的更多细节,那么我相信该文余下的部分对读者非常有帮助。全文主要集中在以下问题的探索上:

  • skynet本质上解决什么问题?
  • skynet有哪些基本的数据结构?
  • skynet有几类线程,他们分别的作用是什么?
  • skynet如何启动一个c服务?
  • skynet消息调度机制是怎样的?
  • skynet如何启动一个lua服务?
  • skynet的lua层消息派发机制是怎样的?
  • timer是如何产生消息的?他的结构和流程是怎样的?
  • 网络模块是如何产生消息的?他的结构和流程是怎样的?
  • skynet有哪些基本服务,他们的作用分别是什么?

我相信读者,可以通过文章,理解skynet的基本数据结构、线程类别、消息调度机制、线程安全保障、定时器的基本运作、网络消息处理等。

《skynet源码赏析》对skynet的基本结构和运作流程,进行了比较详细的阐述,不过在网络模块,只是在比较抽象的层面进行了论述,并没有非常深入地进行研究,为此,我后来又补写了一篇《skynet网络机制》

这篇文章,比较深入地探索了以下的问题:

  • skynet服务的网络消息,是怎么转给socket线程处理的?
  • skynet的网络模块,有哪些基本的数据结构?
  • skynet创建listen socket的流程是怎样的?
  • skynet连接处理流程是怎样的?
  • skynet数据包接收、整包处理流程是怎样的?
  • skynet服务中的网络消息如何发送?
  • skynet关闭一个socket的流程是怎样的?

此外,该文对epoll在比较抽象的层面,进行了探索,并通过一个实验

对其lt和et模式下,数据包的收发表现,进行了研究。后续,我还可能会写一篇,skynet集群机制的文章,今后,我的skynet相关的研究内容,均会放到这个专栏里。开这个专栏的目的,是为了能够更好地服务于社区,同时也希望通过这里,认识更多的朋友。

最后,本人水平有限,如有写的不当之处,也希望大家不吝赐教。

编辑于 2020-10-19 14:39