技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 系统架构 --> Skynet 的一些改进和进展

Skynet 的一些改进和进展

浏览:1549次  出处信息

    最近我的工作都围绕 skynet 的开发展开。

    因为这个项目是继承的 Erlang 老版本的设计来重新用 C 编写的。 再一些接口定义上也存在一些历史遗留问题. 我需要尽量兼容老版本, 这样才能把上层代码较容易的迁移过来。

    最近的开发已经涉及具体业务流程了, 搬迁了不少老代码过来。 我不想污染放在外面的开源版本。 所以在开发机上同时维护了两个分支, 同时对应到 github 的公开仓库, 以及我们项目的开发仓库。

    btw, 我想把自己的开发机上一个分支版本对应到办公室仓库的 master 分支, 遇到了许多麻烦。 应该是我对 git 的工作流不熟悉导致的。

    我的开发机的 master 对应着 github 上的 master , 但我大多数时间在一个叫 ejoy 的分支上开发。

    这个分支对应到办公室服务器的 master 分支上。这里需要 git config push upstream 设置一下,不然每次 push 分支都需要指名。

    偶尔,我会修改一些 bug 以及加一些基础特性,这个时候,我从 ejoy 分支切换到 master 上修改。修改完后,我会切回 ejoy 上,做 rebase master 。 似乎,这个流程用 merge 要好一些。因为 rebase 后,就不能 push 到办公室的仓库上了。(需要加 -f )

    目前没有精力去搞清楚 git 的正确工作流,暂时把这个问题放一边吧。


    最近几个比较大的改动是,增加了一个对外建立连接的服务 (connection) 。 建立起连接上,就让这个服务把所有外部连接上的数据推送到指定节点。

    我一开始的设计是有问题的。我企图采用拉的方式来工作。定义了拉数据的接口: 拉一行(设定行分割符), 以及拉指定数据块。问题在于,在异步操作环境下,有可能同时在一个连接上发起几次异步操作,在需要多步分析数据流的情况中,很可能无法得到正确的结果。


    无论是 gate 的接收外部连接, 还是 connection 发起外部连接,处理 skynet 系统外的数据,都和内部数据包的流通有所不同。因为,外部包是可以组合成任何内部布局并加以处理的(可以有指针),而外部数据则必须是连续数据块,并有一定的包分割规则。

    认清这个不同点,我就增加了内部和外部数据的识别方式(之前的版本是认为可以隐藏掉这个细节的)。我的方法是用了一个特殊的 session 号 (0x7fffffff) 。因为 session id 是由 skynet 自己递增产生的,所以不会有冲突。

    为了兼容之前的通讯协议,以及 rpc 协议。我增加了过滤器模块,可以把老的协议过滤成新的格式。这个等全部移植工作做完再去掉。

    同时,为了提高性能,增加了重定向包的接口,在做一些中间设施时,能减少包的复制。


    在我把一些基础设施补全后,尤其是在我实现了和老的服务器集群对接模块后,我发现之前用 zeromq 实现的内部集群通讯模块显的很冗余。绑上 zeromq 这么一个重量级的库,却没用上多少功能,很是不爽。

    所以我最终重写了一千多行代码,替换掉了原来使用 zeromq 的 harbor 模块。使用 zeromq 其实并没有减少总代码量(原来也有将近一千行代码)。


    目前,我已经把原有的独立的认证服务的集群替换到新 skynet 上了。并可以和老的游戏服务器集群对接。这是第一步,完全替换掉游戏服务器底层还需要一点时间。

    这可以让我做一些压力测试了。

    我们用的类似 Kerberos 的认证授权协议。中间涉及多个服务间的通讯。以及对数据库的查询操作。整个流程还是很复杂的。我觉得有一定的测试意义。

    初步测试结果,比之前的框架提高了 3-4 倍的性能。当然,这个测试很初步,不太能说明问题。有很多环节会导致老的框架表现不佳。但在简单的 echo 服务测试中,性能提升就不明显了。

    我希望在所有移植工作做完后,再来做详细细致的评测工作。至少我对新的 skynet 可以 100% 把握,可以细致的监控每一行 C 代码。暂时也想不到框架上可以有大的性能提升的余地了。

    btw, 在一些简单测试中,通过 profile ,发现其实大量 CPU 花在服务自己的 lua 虚拟机上。占掉了 80% 以上的时间。这些是跟框架(全部用 C 实现)是无关的。要提升这一点,恐怕下一步工作需要把 lua 5.2 迁移到 luajit2 上看看效果了。

建议继续学习:

  1. Skynet 设计综述    (阅读:2267)
  2. Skynet 集群及 RPC    (阅读:1986)
  3. 记录一个并发引起的 bug    (阅读:1934)
  4. 为什么 skynet 提供的包协议只用 2 个字节表示包长度    (阅读:1132)
  5. 代理服务和过载保护    (阅读:838)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1