20

skynet 1.4.0

 3 years ago
source link: https://blog.codingnow.com/2020/10/skynet_140.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

又是一年过去了,skynet 目前保持着一年一个发布版的开发进度。skynet 1.4.0 发布版将于近期冻结。

这次的主要更新是将 Lua 更新到了 5.4.2 (尚未发布,但 github 仓库中的版本号已经到了 5.4.2 )。可能会让 skynet 的许多项目享受到分代 gc 的好处。如果使用大量 agent 服务的模式,将会降低整体的内存峰值开销(GC 更加及时)。lua 5.4 中 table 的内存开销也比之前的版本要小,运行性能也有所提升。

升级到 lua 5.4 基本不需要修改过往的 Lua 代码。C 库需要重新编译,但基本不需要修改。但如果可以改用新版的 lua_newuserdatanv 取代 lua_newuserdata 会更好。

skynet 依然提供了针对多 vm 共享 proto 的补丁。和以前一样,这是一个可选项,可以自行编译官方版本的 lua 。

另一个新特性是 skynet.select 。它将给 skynet 的 lua api 提供多个并发多个请求的能力。 具体可以看过往的 blog 解释

在网络方面,增强了流量控制的支持。这会对基于 skynet 做重 IO 操作(例如文件服务器)的业务有所帮助。在上个版本,对于写 socket 有 warning 消息的支持,可以让写缓冲区太大后,得到消息暂停业务层产生新数据;在写缓冲区清空后再延续。

但对于读缓冲区满没有设计应对的方法。这是因为,skynet 设计时假设上行数据的 IO 压力通常小于处理压力(游戏业务的特点)。cpu 总有能力消化掉客户端传来的流量。这个版本中,新增了 pause/resume 的 C API 通知网络底层暂停及延续 socket 的读操作。在 Lua 层,这个过程是自动进行的,不需要业务层主动干预。一旦 lua 服务收到了太多网络包未能被业务层读取(积累在 socket 模块中)将自动发送 pause 消息暂停网络层的接收,当读空缓冲区后,再次发起读请求则会通知网络层重新开启读数据。

另外,这次的版本在 ssl websocket mysql sproto crypt 等内置库方面均有加强。这得益于 skynet 越来越多的用户。这些增强代码几乎都来自于社区的贡献。skynet 到现在已经在 github 上拥有了 9.4K 的 star ,3.5K 的 fork ,以及 92 个 Contributors 。是用户社区保障了项目的健壮。

感谢所有 skynet 的用户,特别是为 skynet 提交 pr ,解答 issue,审核 commit 的朋友。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK