如想了解更多skynet知识,可关注微信公众号 GameGuide
1.介绍
skynet 是由中国开发者云风设计并开源的一款轻量级游戏服务器框架,专注于解决高并发、分布式、实时在线的服务端架构需求。其核心设计理念基于 Actor 模型,通过消息传递机制实现服务间的松耦合协作,特别适合 MMO、即时对战等复杂在线游戏的服务器开发。
1.1. 核心设计
Skynet 核心解决什么问题 我希望我们的游戏服务器(但 skynet 不仅限于用于游戏服务器)能够充分利用多核优势,将不同的业务放在独立的执行环境中处理,协同工作。这个执行环境,最早的时候,我期望是利用 OS 的进程,后来发现,如果我们必定采用嵌入式语言,比如 Lua 的话,独立 OS 进程的意义不太大。Lua State 已经提供了良好的沙盒,隔离不同执行环境。而多线程模式,可以使得状态共享、数据交换更加高效。而多线程模型的诸多弊端,比如复杂的线程锁、线程调度问题等,都可以通过减小底层的规模,精简设计,最终把危害限制在很小的范围内。这一点,Skynet 最终花了不到 3000 行 C 代码来实现核心层的代码,一个稍有经验的 C 程序员,都可以在短时间理解,做维护工作。 做为核心功能,Skynet 仅解决一个问题: 把一个符合规范的 C 模块,从动态库(so 文件)中启动起来,绑定一个永不重复(即使模块退出)的数字 id 做为其 handle 。模块被称为服务(Service),服务间可以自由发送消息。每个模块可以向 Skynet 框架注册一个 callback 函数,用来接收发给它的消息。每个服务都是被一个个消息包驱动,当没有包到来的时候,它们就会处于挂起状态,对 CPU 资源零消耗。如果需要自主逻辑,则可以利用 Skynet 系统提供的 timeout 消息,定期触发。 Skynet 提供了名字服务,还可以给特定的服务起一个易读的名字,而不是用 id 来指代它。id 和运行时态相关,无法保证每次启动服务,都有一致的 id ,但名字可以。 Skynet 核心不解决什么问题 Skynet 的消息传递都是单向的,以数据包为单位传递的。并没有定义出类似 TCP 连接的概念。也没有约定 RPC 调用的协议。不规定数据包的编码方式,没有提供一致的复杂数据结构的列集 API 。 Skynet 原则上主张所有的服务都在同一个 OS 进程中协作完成。所以在核心层内,不考虑跨机通讯的机制,也不为单独一个服务的崩溃,重启等提供相应的支持。和普通的单线程程序一样,你要为你代码中的 bug 和意外负责。如果你的程序出了问题而崩溃,你不应该把错误藏起来,假装它们没有发生。至少,这些不是核心层做的事情。和操作系统不一样,操作系统会认为用户进程都是不可靠的,不会让一个用户进程的错误影响到另一个进程。但在 Skynet 提供的框架内,所有的服务都有统一的目的,为游戏服务器的最终客户服务,如果有某个环节出了错都可能是致命的,没有必要被问题隔离开。 当然,这并不是说,最终用 Skynet 搭建的系统不具有健壮性,只是这些是在更高层去解决。比如,使用 Lua 的沙盒就可以隔绝大多数上层逻辑中的 bug 了。 简单说,Skynet 只负责把一个数据包从一个服务内发送出去,让同一进程内的另一个服务收到,调用对应的 callback 函数处理。它保证,模块的初始化过程,每个独立的 callback 调用,都是相互线程安全的。编写服务的人不需要特别的为多线程环境考虑任何问题。专心处理发送给它的一个个数据包。引用自skynet设计综述
从上述可以总结如下几点:
单进程多线程模型 ● 单进程内通过多线程处理消息,避免多进程上下文切换开销,使得状态共享、数据交换更加高效。
采用Actor模型 ● 每个独立服务(service)为一个 Actor,拥有独立的消息队列。使用Lua State 提供了良好的沙盒,隔离不同执行环境。 ● Actor之间的通信是异步的,即使Actor在发送消息后也无需阻塞或者等待就能够处理其他事情。 ● 服务之间通过异步消息(message)和同步调用(call)通信。
高效的消息调度 ● 提供全局消息队列,通过多线程调度提升吞吐量。但Actor中的消息队列不会被并发。 从上图可以知道timer线程和socket线程会push消息到次级消息队列,然后次级消息队列会挂在到全局消息队列中,供worker线程消费,驱动Actor的运行,也就是调用callback。
1.2. 主要优点
1.2.1. 功能模块
● 服务管理:动态创建/销毁服务,支持热更新。 ● 网络库:内置 TCP/UDP 协议支持,提供非阻塞 IO 接口。 ● 数据库集成:封装 MySQL、Redis 等常用数据库访问。 ● 集群支持:通过 Harbor 机制实现多节点分布式部署。 ● 调试工具:内置服务监控、性能分析工具(如 skynet.stat)。
1.2.2. 技术栈与性能
● 语言:核心框架用 C 编写,逻辑层用 Lua(默认)或 C 扩展。 ● 性能特点:单机可轻松承载数万并发连接,延迟低至微秒级。 ● 资源占用:轻量级设计,单个服务内存可低至 KB 级别。
1.2.3. 典型应用场景
● MMORPG 游戏:处理玩家移动、战斗、社交等实时交互。 ● 实时对战游戏:如 MOBA、吃鸡类游戏的房间同步逻辑。 ● 微服务架构:拆解复杂业务为独立服务,提升可维护性。
2.目录结构