GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器引擎
2017-07-29 00:00
281 查看
GoWorld是一个使用Golang实现的可扩展的分布式游戏服务器引擎,并支持游戏逻辑的热更新。
GoWorld代码:https://github.com/xiaonanln/goworld
GoWorld架构图
一个GoWorld系统包括一个dispatcher进程、一个或者多个game进程以及一个或者多个gate进程。dispatcher负责game之间以及gate和game之间的消息转发,并对一些基础功能提供支持。Game进程负责Entity对象的管理和所有游戏逻辑的运行,Gate进程负责管理客户端连接,并将客户端请求通过dispatcher转发到game进程。Gate还需要负责对客户端数据进行压缩和加解密(尚未实现)。GoWorld可以通过增加更多的game进程或者gate进程来增加服务器的负载能力。虽然dispatcher进程是GoWorld服务器中的单点,但是初步的测试和推算表明一个多核高性能的主机上运行dispatcher可以支持100万以上的同时在线。
GoWorld在RPC数据的封包和解析上使用了MessagePack格式,并会在将来支持Google Protobuf。
GoWorld支持对客户端通信进行压缩。加密功能还有待添加。。。
GoWorld代码:https://github.com/xiaonanln/goworld
进程结构
GoWorld架构图
一个GoWorld系统包括一个dispatcher进程、一个或者多个game进程以及一个或者多个gate进程。dispatcher负责game之间以及gate和game之间的消息转发,并对一些基础功能提供支持。Game进程负责Entity对象的管理和所有游戏逻辑的运行,Gate进程负责管理客户端连接,并将客户端请求通过dispatcher转发到game进程。Gate还需要负责对客户端数据进行压缩和加解密(尚未实现)。GoWorld可以通过增加更多的game进程或者gate进程来增加服务器的负载能力。虽然dispatcher进程是GoWorld服务器中的单点,但是初步的测试和推算表明一个多核高性能的主机上运行dispatcher可以支持100万以上的同时在线。
热更新
GoWorld使用Hot-Swappaing的方式实现游戏逻辑的热更新。在Game进程收到SIGUSR1信号的时候,就会把当前所有Entity以及其他相关状态保存到一个文件中,并结束进程。此时可以使用最新的可执行镜像重启game进程,并从保存的文件中恢复所有的Entity和游戏状态,并恢复执行。在热更新的过程中,玩家客户端的连接不会中断,玩家角色的状态也会保持不变,只是会感受到一点卡顿,并在热更新结束后恢复。Entity架构
Entity RPC
在GoWorld中,我们使用一个Entity来代表游戏场景中的玩家、怪物、NPC之类的对象。GoWorld还支持从客户端到服务端的RPC通信,以及服务端Entity之间的RPC通信。GoWorld在RPC数据的封包和解析上使用了MessagePack格式,并会在将来支持Google Protobuf。
场景
场景(Space)是GoWorld中一个非常重要的概念。每个Entity都属于一个场景。同一个场景的Entity之间可以直接调用相互的函数,而跨场景的Entity之间需要使用RPC来进行通信。Entity可以通过迁移(Migrate)函数来跳转到别的场景中,跳转场景后Entity的所有属性数据都将保持不变。AOI
GoWorld提供了一套简化的AOI机制。同场景的Entity之间会根据距离维护一个邻居列表。GoWorld使用十字列表维护场景里的所有Entity,从而根据Entity的位置变化实时更新所有Entity的AOI信息。属性同步
GoWorld为Entity提供了属性机制。属性分为服务端属性、客户端属性和全局属性。服务端属性只有在服务端可以访问,客户端属性可以在客户端和服务端同时访问。每次服务端对其进行修改的时候,属性的变化会立刻被同步到客户端,从而保持客户端数据的实时更新。全局属性是对所有Entity都可见的数据,包括其他玩家。全局属性在发生变化的时候会被广播到AOI范围内的所有玩家,从而使得玩家可以实时获取AOI范围内其他Entity的属性变化。Entity存盘和载入
GoWorld支持Entity的自动存盘。持久化(persistent)的Entity会按一定的时间间隔进行存盘。GoWorld还提供了对已存盘Entity的载入功能。目前GoWorld支持MongoDB和Redis两种不同的底层数据库。客户端连接和通信
每个server都会创建一个监听端口用于接收来自客户端的连接。客户端和服务端之间也采用一个RPC的通信方式。客户端可以对玩家和玩家AOI里的其他Entity发起RPC调用。GoWorld支持对客户端通信进行压缩。加密功能还有待添加。。。
还在开发阶段,更多内容有待补充,敬请关注 ……
相关文章推荐
- GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器
- GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器
- Elasticsearch是一个分布式可扩展的实时搜索和分析引擎,elasticsearch安装配置及中文分词
- 使用Golang利用ectd实现一个分布式锁
- 用Golang写一个搜索引擎
- 从零开始写一个简单好用的游戏服务器引擎[3] - 网络
- 从零开始写一个简单好用的游戏服务器引擎[2] - 跨平台相关
- Tair是一个高性能,分布式,可扩展,高可靠的key/value结构存储系统(转)
- 夕阳桥断 Linux(centos6.5)下安装jenkins Jenkins 的前身是 Hudson 是一个可扩展的持续集成引擎。 通俗的来讲,jenkins就是一个可以实现自动化部署的一个插
- 基于Python的分布式高可用扩展引擎Ray 0.2.0发布
- 从零开始写一个简单好用的游戏服务器引擎[0] - 前言
- 自己写得一个分布式海量文件搜索引擎
- 基于Python的分布式高可用扩展引擎Ray 0.3.0发布
- 从零开始写一个简单好用的游戏服务器引擎[1] - 概要
- GraphQL 用例:使用 Golang 和 PostgreSQL 构建一个博客引擎 API
- 译文 Ceph:一个可扩展,高性能分布式文件系统
- 译文 Ceph:一个可扩展,高性能分布式文件系统
- 从零开始写一个简单好用的游戏服务器引擎[4] - 公开啦
- JStorm 是一个分布式实时计算引擎
- PHP扩展开发:一个简单的例子