« cache server 问题总结 | 返回首页 | Lua binding 的一些方法 »

skynet 1.4.0

又是一年过去了,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 的朋友。

Comments

我就是超多agent的模式,几千个。。。经常遭遇oom,自己研究又发现内存并没有泄露,查看各种agent就发现内存缓慢增长,强制gc又是可以恢复的。
看来我要升这个级了

感谢云大!

感谢大牛

感谢

感谢

感谢大佬

感谢

感谢

云风我最欣赏的程序员之一,潇洒仗义、为人率真、良好的开源精神!

国产之光

@菜鸟浮出水

让 send 有返回值有考虑过,但是由于担心特性兼容问题,所以没有实现。

btw, timeout_call 现在已经可以用 select 实现了。

skynet真的很稳定,游戏服务器4年没重启过,到现在还在稳健运行,感谢云风大哥。

真好

最近跟朋友讨论想到了一个细节。云风这个对网络层设计的pause/resume相当于是给网络层加了一个自动熔断的机制,发现自己过载了,处理不过来了,为了保护自己,就熔断掉自己不接受新的消息,如果自己能力恢复了就再继续处理消息。
其实我们在使用skynet的时候网络层压力的感受度就像云风之前说的不那么强烈,至少在游戏里是这样,毕竟一开始的设计目的就是针对强cpu需求,弱网络需求的架构设计。相反我们更容易感受到的是服务的过载。这个相信也有很多人讨论过了,比如之前说的需要一个skynet.timeout_call其实就是部分这种想法。如果框架能提供一种可选的针对服务的熔断机制我觉得可能就更好了。仔细想想就是指某个服务没办法及时处理掉自己消息队列里的消息,因为skynet的服务调度是若干个不同力度的worker线程在调度,不能单纯的看服务的消息队列长度就认为服务处理不过来,还得考虑服务的处理性能,我觉得可以这样判定,对于每个服务,一旦某个消息投递进入到它的消息队列,就记录一下时间,如果队列头也就是最早投递进队列的消息的时间超过了一个阈值还没被消化掉就认为这个服务过载了,就启动熔断,直到消息队列里不存在这样的超阈值消息再恢复。别的服务向这个服务投递消息之前先检查一下对应服务的熔断标记,如果处于熔断状态就立马返回不进行投递了。

用了 skynet 就不怎么加班了:)

开心*

@andy

钱包已经遗失 :(

太好了

Lua5.4中require函数的返回值和前版本有一点不一样,第一次require脚本会返回两个值。这个可能会使原有脚本出错。这个是升级时要注意的一个地方,可能需要改一点代码。

我发现你的比特币地址里面存在0.2个btc,你是不是把它遗忘了

感谢风哥,风哥辛苦了

感谢云风大哥的无私开源精神

撒花:D

感谢云风,用了 skynet 就不怎么加班了:)

感谢云大!

Post a comment

非这个主题相关的留言请到:留言本