skynet框架 源码分析 一


       本人所看的skynet框架,是云风所写的开源分布式服务器系统。
       说说广泛流传的分布式系统,我觉得最简单的理解就是,一个服务器系统可以开很多进程来完成任务,并且这些进程可以不受地域的限制,同时跑在不同的主机上面(当然也可以跑在同一台主机上),以服务器集群的方式应答各个服务请求,各进程之间通过socket的方式通信。

       我们先从整体结构上来俯视这个框架。
       大体上,该系统是一个actor模式的服务端框架。系统遵循的规则是:客户端或者服务节点发送服务请求到服务系统,服务器系统专门开辟多个工作线程,从一个消息队列中取一组消息,处理其中一个,然后归还。也就是所谓的邮件列表形式,即在一个邮件列表中取一组邮件,该组邮件都来自同一个角色。取出该组邮件中的第一封,并处理其中服务请求。在完处理完毕之后,弹出该邮件,并且将邮件组重新放到邮件列表中,等待下一次处理。这样做的目的,我猜测,作者的初衷应当是想构建一个无锁的消息处理逻辑,达到即可以利用多线程,又可以简化线程之间的临界区域逻辑。
       接下来,假设我们只运行一个进程。那么在进程启动成功后,内部会生成有很多服务的节点,如图所示:

skynet框架 源码分析 一_第1张图片

      每个节点都有服务的功能,但是节点的服务类型可以重复比如:agent。同一个模块,可以生成不同的服务节点,比如:snlua模块(skynet node lua,框架中的节点并且在lua的中执行回调,后面会详细解析),它就可以生成watchdog, agent, launcher等节点。同一个进程之中每个节点包含三个最关键的要素:上下文(context),句柄(handle),消息队列(message_queue)。向不同的节点的handle发送消息,就是向该节点的消息组message_queue添加一个消息处理请求。该消息不会立马被处理,等到work线程执行到该节点时,取到该消息的时候,才会执行该消息请求,并运行相关的逻辑。

      假设一个进程中的节点是二维平面。那么在多个进程的情况,平行展开,就可以形成一个三维空间。我猜测这就更加符合这个框架的名字“天网”的来源了。







你可能感兴趣的:(linux,lua)