谈谈skynet
这将是一篇长期更新的关于skynet理解的文章。
Skynet是什么?云风是怎么说的:作为服务器,通常需要同时处理多份类似的业务。例如在网络游戏中,你需要同时向数千个用户提供服务;同时运作上百个副本,计算副本中的战斗、让 NPC 通过 AI 工作起来,等等。在单核年代,我们通常在 CPU 上轮流处理这些业务,给用户造成并行的假象。而现代计算机,则可以配置多达数十个核心,如何充分利用它们并行运作数千个相互独立的业务,是设计 skynet 的初衷。
充分利用多个核心,是编程比较困难的地方。写正确的多线程程序,充分利用CPU的性能,至少对于我来说,是一件很困难的事。我就不评价别人的能力了。skynet框架通过一个个lua虚拟机解决了这个问题,对于他提出的需求和目的,可以说是完美地解决了。
skynet框架还封装了不少对于服务器来说必须的框架,上手比较简单。我这个从没有写过服务器的人,两周就从无到有头把服务器搭好了,可以说是非常方便了。包括写一些库也比较方便。skynet作为工具上手,文档的支持也非常不错。
那么代价是什么呢?
每个lua虚拟机有开销,并且势必加载了同等数量的lua代码。某篇skynet的博文就提到了某个开发者遇到的不断创建agent线程造成的开销堵塞的问题。不过现在服务器的瓶颈还在IO上,并不在内存上。而且虚拟机和脚本所占的内存对于他们承载的用户数据来说,又很少。因此相比与传统服务器,这点代价可以接受。
lua虚拟机没有特别好的debug方法,至少“如呼吸般简单”的单步执行单步调试是不可能了。对于一些习惯于打断点debug,或者写代码能力稍差的同学,会比较痛苦。另外lua语言由于比较的灵活,因此可能相比于编译语言,写错了以后逻辑是不会出错的。
Written on October 14, 2018