明潮的BLOG

崖下潮起落,捣碎亦升花!

学习skynet

skynet 是一个轻量级的为在线游戏服务器打造的框架。但从社区 Community 的反馈结果看,它也不仅仅使用在游戏服务器领域。Uses 收集了很少一部分使用 skynet 的项目,但实际项目要多得多。欢迎你把你的项目也加到这个列表中。

如果你对 skynet 毫无了解,那么可以先阅读一下 GettingStarted。由于 skynet 本身并不复杂,同时建议你阅读一下源代码。参考 Blogs 会对理解设计思路和发展历史有所帮助。还有一些同学自发编写的第三方文档 ThirdPartyDocument 供参考。

Build skynet 非常简单,动手编译一个试着玩一下是个很好的开始。examples 和 test 目录下有些例子。如果你想自己动手做二次开发,你可以从理解 Bootstrap 开始,一开始不要尝试集群 Cluster

虽然 skynet 的核心是由 C 语言编写,但如果只是简单使用 skynet ,并不要求 C 语言基础。但你需要理解 Actor 模式的工作方式,把你的业务拆分成多个服务来协同工作。Lua 是必要的开发语言,你只需要懂得 Lua 就可以使用 LuaAPI 来完成服务间的通讯协作。另外,Snax 可能会是更简单的方式。关于服务间共享数据,除了用消息传递的方式外,还可以参考 ShareData 。skynet 已提供的功能可以参考 APIList

当然只有这些仅仅可以让 skynet 内部的服务相互协作。要做到给客户端提供服务,还需要使用 Socket API ,或者使用已经编写好的 GateServer 模板解决大量客户端接入的问题。或许你还需要为 C/S 通讯制订一套通讯协议,skynet 并没有规定这个协议,可以自由选择。当然你也可以看看 Sproto

通过这套 Socket API以及更方便的 SocketChannel(更容易实现 socket 池和断开重连) ,可以让 skynet 异步调度外部 socket 事件。对外部独立服务的访问,最好都通过这套 API 的封装。如果外部库直接调用系统的 socket ,很可能阻塞住 skynet 的工作线程,发挥不出性能。目前 redis 和 MongoDB 都有内置的封装好的 driver 可供使用。也有社区的同学封装了 MySQL 库。

如果你找不到你需要的外部组件的 skynet driver ,可以自己来编写,社区欢迎你的贡献。当然,你也可以写一个独立程序和外部组件沟通,再和 skynet 通讯。通讯协议可以自行定义,也可以使用 Http 协议。另有第三方的库可以选择1 支持 websocket。


云风最新关于skynet的blog:

上周末,我对 skynet 的 cluster 模块做了一点优化。

cluster 模式 是 skynet 的一种集群方案,用于将多台机器更为弹性的组成一个集群。我们将每台机器都赋予一个名字,然后就可以在集群间用这个名字向对方推送消息或发起请求。

集群的管理是一项非常复杂的工作,skynet 作为一个轻量化的框架,只实现了最基本的基础设施。cluster 这个基础设施已实现的部分并不复杂。在每个 skynet 进程中,我们启动了一个叫 clusterd 的服务,专门用于集群间的通讯。由 clusterd 再启动了一个 gate 服务,监听其它节点连过来的连接;同时,当前节点如果要对其它节点发送数据,也通过 clusterd 向外连接。业务要使用 cluster 的时候,都是通过 require "cluster" 这个库,然后这个库中的 api 负责和本节点的 clusterd 交换数据。

我们正在开发的一个 mmorpg 项目重度依赖了 cluster ,在过去的多次压力测试中,发现 clusterd 是测试中单位时间内消耗 CPU 最多的服务。它是整个 skynet 节点中的一个性能热点。所以我考虑了对这个 clusterd 做一些优化。

非官方网站:skynetclub.github.io/
skynet Archives:  https://blog.codingnow.com/eo/skynet/

github:  https://github.com/cloudwu/skynet
Skynet 设计综述: https://blog.codingnow.com/2012/09/the_design_of_skynet.html
云风的 blog 上关于 skynet 的系列文章: https://blog.codingnow.com/eo/skynet/

skynet是云风编写的服务端底层管理框架,底层由C编写,配套lua作为脚本使用,可换python等其他脚本语言。skynet主要工作是管理注册服务,并开启多线程协调服务之间的调用和通讯。

知乎上关于skynet的评价:https://www.zhihu.com/question/27049158

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010144805/article/details/80322796
个人分类: C++/C skynet
上一篇GitHub中国区前100名到底是什么样的人?
下一篇skynet源码赏析
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭