万字攻略 您所在的位置:网站首页 云风skynet 万字攻略

万字攻略

2024-05-29 18:35| 来源: 网络整理| 查看: 265

Skynet 是一个基于C跟lua的开源服务端并发框架,这个框架是单进程多线程Actor模型。是一个轻量级的为在线游戏服务器打造的框架。C++游戏后端开发,基于魔兽开源后端框架TrinityCore

一、skynet介绍1.1简介

​ 这个系统是单进程多线程模型。每个服务都是严格的被动的消息驱动的,以一个统一的 callback 函数的形式交给框架。框架从消息队列里调度出接收的服务模块,找到 callback 函数入口,调用它。服务本身在没有被调度时,是不占用任何 CPU 的。

skynet虽然支持集群,但是作者云风主张能用一个节点完成尽量用一个节点,因为多节点通信方面的开销太大,如果一共有 100 个 skynet 节点,在它们启动完毕后,会建立起 9900条通讯通道。

1.2特点

Skynet框架做两个必要的保证:

一个服务的 callback 函数永远不会被并发。一个服务向另一个服务发送的消息的次序是严格保证的。

用多线程模型来实现它。底层有一个线程消息队列,消息由三部分构成:源地址、目的地址、以及数据块。框架启动固定的多条线程,每条工作线程不断从消息队列取到消息,调用服务的 callback 函数。

线程数应该略大于系统的 CPU 核数,以防止系统饥饿。(只要服务不直接给自己不断发新的消息,就不会有服务被饿死)

​对于目前的点对点消息,要求发送者调用 malloc 分配出消息携带数据用到的内存;由接受方处理完后调用 free 清理(由框架来做)。这样数据传递就不需要有额外的拷贝了。

做为核心功能,Skynet 仅解决一个问题:

​把一个符合规范的 C 模块,从动态库(so 文件)中启动起来,绑定一个永不重复(即使模块退出)的数字 id 做为其 handle 。模块被称为服务(Service),服务间可以自由发送消息。每个模块可以向 Skynet 框架注册一个 callback 函数,用来接收发给它的消息。每个服务都是被一个个消息包驱动,当没有包到来的时候,它们就会处于挂起状态,对 CPU 资源零消耗。如果需要自主逻辑,则可以利用 Skynet 系统提供的 timeout 消息,定期触发。

1.3Actor模型

Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成:

状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题行为(Behavior):行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态邮箱(mailBox):邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息

Actor的基础就是消息传递,skynet中每个服务就是一个LUA虚拟机,就是一个Actor。

Actor模型好处

事件模型驱动: Actor之间的通信是异步的,即使Actor在发送消息后也无需阻塞或者等待就能够处理其他事情。强隔离性: Actor中的方法不能由外部直接调用,所有的一切都通过消息传递进行的,从而避免了Actor之间的数据共享,想要观察到另一个Actor的状态变化只能通过消息传递进行询问。位置透明: 无论Actor地址是在本地还是在远程机上对于代码来说都是一样的。轻量性:Actor是非常轻量的计算单机,只需少量内存就能达到高并发。二、skynet原理2.1消息队列


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有