概述
skynet
是一个基于消息和服务的Actor
分布式服务框架,采用go
编写,致力于简化开发难度和成本。
它是一个年轻的框架,仅仅经历了两款项目的迭代 现在版本为 v1.6.0 2023-05-28
设计目的
-
过往的工作中曾经开发了一个
cobweb
的分布式服务器框架(基于golang
,c
),但是在实际开发过程中代码难以维护以及更新,主要是每次都需要跨平台进行编译,特别是cgo
往往需要指定平台的系统库,而且一些不规范的使用方式造成无法充分发挥多核的优势,可以参见关于Go协程的思考
虽然1.16 支持抢占式,但错误的使用方式依然造成了cpu过高的问题。 -
再者,服务器过多的
goroutine
被创建,极大浪费了内存以及cpu。我不希望滥用协程,其代价比预估的要高。 -
由于以上目的,重写了
cobweb
的底层,底层对用户不再透明。而是通过脚本语言导出来提供支持 -
包括后续的DSL
-
在2024/03我重新用C实现了一版以提供更好的性能和更底层的控制
特性
-
支持纯
Lua
开发,方便更快的开发业务。 -
mysql,redis client支持,值得注意的是这些库都是作为插件实现,跟主库关联不大,需要编译时指定
-
网络支持(http,tcp,udp,websocket,epoll)
-
内置集群组件 sktpmd,易于实现分布式
-
隐藏的数据编码,对业务不透明,基与比
protobuf-v3
更快的编码 kproto -
超快的性能,完全摒弃
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版本持续开发中。。。