Treasure / skynet 设计初衷以及特性

Created Mon, 20 Jun 2022 00:00:00 +0000 Modified Mon, 01 Apr 2024 12:33:05 +0000
814 Words

概述

skynet 是一个基于消息和服务的Actor分布式服务框架,采用go编写,致力于简化开发难度和成本。

它是一个年轻的框架,仅仅经历了两款项目的迭代 现在版本为 v1.6.0 2023-05-28

设计目的

  1. 过往的工作中曾经开发了一个cobweb的分布式服务器框架(基于golang,c),但是在实际开发过程中代码难以维护以及更新,主要是每次都需要跨平台进行编译,特别是cgo 往往需要指定平台的系统库,而且一些不规范的使用方式造成无法充分发挥多核的优势,可以参见 关于Go协程的思考 虽然1.16 支持抢占式,但错误的使用方式依然造成了cpu过高的问题。

  2. 再者,服务器过多的 goroutine 被创建,极大浪费了内存以及cpu。我不希望滥用协程,其代价比预估的要高。

  3. 由于以上目的,重写了cobweb 的底层,底层对用户不再透明。而是通过脚本语言导出来提供支持

  4. 包括后续的DSL

  5. 在2024/03我重新用C实现了一版以提供更好的性能和更底层的控制

特性

  1. 支持纯Lua开发,方便更快的开发业务。

  2. mysql,redis client支持,值得注意的是这些库都是作为插件实现,跟主库关联不大,需要编译时指定

  3. 网络支持(http,tcp,udp,websocket,epoll)

  4. 内置集群组件 sktpmd,易于实现分布式

  5. 隐藏的数据编码,对业务不透明,基与比protobuf-v3 更快的编码 kproto

  6. 超快的性能,完全摒弃interface{}以及各种抽象,采用Pointer的方式创建数据(仅底层,上层无须关心)

优势

  • skynet 是过程式以及低抽象的架构,纯函数式主要是受 c 的影响。纯函数也更贴合职责单一的原则,而低抽象是因为go interface 并非零成本抽象,它有一定的性能代价。所以整个skynet 没有任何接口定义

  • skynet仅需要一个执行文件,大小仅仅5.78mb,默认运行内存仅仅 2.2mb

  • 65535 Lua服务仅占用1.8GB,也就是每个 Lua服务 仅占用 28.8kb

  • 65535 纯go服务仅占用120mb,每个pure go服务仅占用 1.9kb

  • 纯C版本持续开发中。。。

目录大纲

processor

sktpmd

socket

zmalloc

plugin