skynet框架

来源:互联网 发布:淘宝app 设备管理 编辑:程序博客网 时间:2024/05/24 04:12

这里写图片描述
1.框架概述
模块和服务名

解析:该系统是一个actor模式的服务端框架。客户端或者服务节点发送服务请求到服务系统,服务器系统专门开辟多个工作线程,从一个消息队列中取一组消息,处理其中一个,然后归还。假设我们只运行一个进程。那么在进程启动成功后,内部会生成有很多服务的节点 ,每个节点都有服务的功能,但是节点的服务类型可以重复比如:agent。同一个模块,可以生成不同的服务节点,比如:snlua模块,它就可以生成watchdog, agent, launcher等节点。
同一个进程之中每个节点包含三个最关键的要素:
(1)上下文(context),
(2)句柄(handle),
(3)消息队列(message_queue)。
向不同的节点的handle发送消息,就是向该节点的消息组message_queue添加一个消息处理请求。该消息不会立马被处理,等到work线程执行到该节点时,取到该消息的时候,才会执行该消息请求,并运行相关的逻辑。

2.skynet简介
2.1 节点
通过 master ,认识网络中所有其它 skynet 节点。它们相互一一建立单向通讯通道。
这个系统是单进程多线程模型。
每个内部服务的实现,放在独立的动态库中。由动态库导出的三个接口 create ,init ,release 来创建出服务的实例。init 可以传递字符串参数来初始化实例。比如用 lua 实现的服务(这里叫 snlua ),可以在初始化时传递启动代码的 lua 文件名。
每个服务都是严格的被动的消息驱动的,以一个统一的 callback 函数的形式交给框架。框架从消息队列里取到消息,调度出接收的服务模块,找到 callback 函数入口,调用它。服务本身在没有被调度时,是不占用任何 CPU 的。
2.2 基本流程及特点
底层有一个线程消息队列,消息由三部分构成:源地址、目的地址、以及数据块。框架启动固定的多条线程,每条工作线程不断的 从消息队列取到消息。根据目的地址获得服务对象。当服务正在工作(被锁住)就把消息放到服务自己的私有队列中。否则调用服务的 callback 函数。当 callback 函数运行完后,检查私有队列,并处理完再解锁。
线程数应该略大于系统的 CPU 核数,以防止系统饥饿。(只要服务不直接给自己不断发新的消息,就不会有服务被饿死)
skynet解决的主要问题:把一个符合规范的 C 模块,从动态库(so 文件)中启动起来,绑定一个永不重复(即使模块退出)的数字 id 做为其 handle 。模块被称为服务(Service),服务间可以自由发送消息(交互)。每个模块可以向 Skynet 框架注册一个 callback 函数,用来接收发给它的消息。每个服务都是被一个个消息包驱动,当没有包到来的时候,它们就会处于挂起状态,对 CPU 资源零消耗。如果需要自主逻辑,则可以利用 Skynet 系统提供的 timeout 消息,定期触发。

3.config(启动服务的配置文件)

root = "./" thread = 8 --线程数略大于CPU核数,预防系统饥饿logger = nil --第一个启动的服务harbor = 1   --单节点模式address = "127.0.0.1:2526" --ip和端口master = "127.0.0.1:2013"   ---节点类型start = "main"  -- main script --主服务bootstrap = "snlua bootstrap"   -- The service for bootstrap(第二个服务,,配置支持系统运行) standalone = "0.0.0.0:2013"   --- standalone 配置项判断你启动的是一个 master 节点还是 slave 节点。luaservice = root.."service/?.lua;"..root.."test/?.lua;"..root.."examples/?.lua"lualoader = "lualib/loader.lua"snax = root.."examples/?.lua;"..root.."test/?.lua"   cpath = root.."cservice/?.so"

必要的配置项:
(1) thread 启动多少个工作线程。通常不要将它配置超过你实际拥有的 CPU 核心数。
(2)bootstrap skynet 启动的第一个服务以及其启动参数。默认配置为 snlua bootstrap ,即启动一个名为 bootstrap 的 lua 服务。通常指的是 service/bootstrap.lua 这段代码。
(3)cpath 用 C 编写的服务模块的位置,通常指 cservice 下那些 .so 文件。如果你的系统的动态库不是以 .so 为后缀,需要做相应的修改。这个路径可以配置多项,以 ; 分割。
在默认的 bootstrap 代码中还会进一步用到一些配置项:
(4)logger 它决定了 skynet 内建的 skynet_error 这个 C API 将信息输出到什么文件中。如果 logger 配置为 nil ,将输出到标准输出。你可以配置一个文件名来将信息记录在特定文件中。
(5)logservice 默认为 “logger” ,你可以配置为你定制的 log 服务(比如加上时间戳等更多信息)。可以参考 service_logger.c 来实现它。注:如果你希望用 lua 来编写这个服务,可以在这里填写 snlua ,然后在 logger 配置具体的 lua 服务的名字。在 examples 目录下,有 config.userlog 这个范例可供参考。
logpath 配置一个路径,当你运行时为一个服务打开 log 时,这个服务所有的输入消息都会被记录在这个目录下,文件名为服务地址。
(6)standalone 如果把这个 skynet 进程作为主进程启动(skynet 可以由分布在多台机器上的多个进程构成网络),那么需要配置standalone 这一项,表示这个进程是主节点,它需要开启一个控制中心,监听一个端口,让其它节点接入。
(7)master 指定 skynet 控制中心的地址和端口,如果你配置了 standalone 项,那么这一项通常和 standalone 相同。
(8)address 当前 skynet 节点的地址和端口,方便其它节点和它组网。注:即使你只使用一个节点,也需要开启控制中心,并额外配置这个节点的地址和端口。
(9)harbor 可以是 1-255 间的任意整数。一个 skynet 网络最多支持 255 个节点。每个节点有必须有一个唯一的编号。如果 harbor 为 0 ,skynet 工作在单节点模式下。此时 master 和 address 以及 standalone 都不必设置。
(10)start 这是 bootstrap 最后一个环节将启动的 lua 服务,也就是你定制的 skynet 节点的主程序。默认为 main ,即启动 main.lua 这个脚本。这个 lua 服务的路径由下面的 luaservice 指定。
(11)luaservice lua 服务代码所在的位置。可以配置多项,以 ; 分割。 如果在创建 lua 服务时,以一个目录而不是单个文件提供,最终找到的路径还会被添加到 package.path 中。比如,在编写 lua 服务时,有时候会希望把该服务用到的库也放到同一个目录下。
(12)lua_path 将添加到 package.path 中的路径,供 require 调用。
(13)lua_cpath 将添加到 package.cpath 中的路径,供 require 调用。
(14)preload 在设置完 package 中的路径后,加载 lua 服务代码前,loader 会尝试先运行一个 preload 制定的脚本,默认为空。
(15)snax 用 snax 框架编写的服务的查找路径。
(16)profile 默认为 true, 可以用来统计每个服务使用了多少 cpu 时间。在 DebugConsole 中可以查看。会对性能造成微弱的影响,设置为 false 可以关闭这个统计。