Go游戏服务器开发的一些思考(三十七):无缝世界场景构建与同步(四)
2018-03-12 16:27
2931 查看
Cell负载均衡
多个Cell共同承载整个世界的人数。但是难免多个Cell上有个别Cell承载人数特别多。而某些Cell则承载了很少的人数。
所以完备的无缝世界,都具备
Cell的负载均衡功能。
下面来分析下如何实现Cell的负载均衡。
一、最初世界状态
上图是最初的世界状态。
整个世界场景被切分为
10 x 10100个方格。
有4个Cell,每个承载25个方格,组成一个世界场景。
下面假设,状况发生:
运行中,Cell0 承载了很多人
Cell2 则人数寥寥无几
那么
World Server发现这种情况,它来触发
Cell的负载均衡流程。
二、Cell0方块向Cell2转移
如图,
World Server决定 Cell0 粉色方块向 Cell2转移。
最终,变成下面的世界场景格局:
那么这里涉及下面几个问题:
World Server如何选择Cell0要转移的方格
World Server如何选择转移目的Cell的策略
Cell0方格到Cell2的转移流程
三、转移条件
首先需要理解,如果某方块上人数已经接近Cell0进程的最大负载。那么对这块方块的转移对整个世界来说是没有意义的。(相对于把Cell2变成了重灾区)比如下面的策略:
划分世界的方块大小为
3倍玩家视野(即定义了无法再分割的地图块单位)
Cell承载人数大于
2000人时,触发
Cell的负载均衡流程。
单个方块承载人数大于
3500人,该方块上已经形成
向单点聚集的问题。不适合转移。
转移单个方块承载人数小于
2000人的最大人数的那个方块。
(提示:这里策略不是最优化策略,仅随意举例用)
四、转移流程
(提示:点击图片可以放大)
以上是本人初略画出的转移流程图。
主要分为2个阶段:
- 数据同步阶段
- 主从切换阶段
分别来分析下:
数据同步阶段
数据同步阶段主要到步骤4-2
因为Cell0还在正常运作,游戏表现是正常的。
唯一的目的是,Cell2能创建出完整的slave副本。
因此首先要做的是把 外接Cell2的关系做好。这样同步过程中的,方块XX上以及重叠区域上的新的实体实例的创建、销毁事件才能动态的接收到。
与此同时,同步方块XX上以及重叠区域上的原来已有的实体实例。
主从切换阶段
主从切换阶段从步骤5-1开始。
这里主要要注意的是,
方块XX上这个词。
从上篇文章中,我们知道,主从切换前,在Cell分隔线与主从切换线间的,本质上都属于
方块XX上。
因此如何比较好的编码,优雅的处理这些Master,(包括在数据同步阶段)。都是需要注意的。
涉及不少跨进程通信。
转移流程是一个复杂的过程。
如何推论转移流程是完全正确的这是个难题。
因此本流程是可能存在漏洞的,或者严重BUG不可行的存在。
本篇写成就是一个思考过程,难免可能存在偏差、遗漏。
欢迎指正、指点。
Cell负载配置
服务器组运行过程中,Cell不断的负载均衡改进。因此可以把Cell管辖的方块写入配置。这样下次开服时,能从最优的世界场景构建开始。
相关文章推荐
- Go游戏服务器开发的一些思考(三十六):无缝世界场景构建与同步(三)
- Go游戏服务器开发的一些思考(三十五):无缝世界场景构建与同步(二)
- Go游戏服务器开发的一些思考(三十四):无缝世界场景构建与同步(一)
- Go游戏服务器开发的一些思考(三十二):关于无缝世界的一些思考
- Go游戏服务器开发的一些思考(十一):IO游戏同步
- Go游戏服务器开发的一些思考(十四):IO游戏同步(二)
- Go游戏服务器开发的一些思考(十七):IO游戏同步(三)
- Go游戏服务器开发的一些思考(二):综合考察(上)
- Go游戏服务器开发的一些思考(二十五):Redis的Docker Swarm部署
- Go游戏服务器开发的一些思考(二十一):Go语言的两处脑残设定
- Go游戏服务器开发的一些思考(三十九):go reflect的正确使用方法
- Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)
- Go游戏服务器开发的一些思考(十五):gochart图表制作
- Go游戏服务器开发的一些思考(九):Docker桥接网络及固定IP (二)
- Go游戏服务器开发的一些思考(二十六):Go Redis ORM库
- Go游戏服务器开发的一些思考(二十八):登录流程(一)
- Go游戏服务器开发的一些思考(三十八):MMO游戏移动同步
- Go游戏服务器开发的一些思考(七):Redis
- Go游戏服务器开发的一些思考(十二):行为树behavior3go介绍
- Go游戏服务器开发的一些思考(二十二):Godep包管理介绍