您的位置:首页 > 编程语言 > Go语言

Go游戏服务器开发的一些思考(三十七):无缝世界场景构建与同步(四)

2018-03-12 16:27 2931 查看

Cell负载均衡

多个Cell共同承载整个世界的人数。

但是难免多个Cell上有个别Cell承载人数特别多。而某些Cell则承载了很少的人数。

所以完备的无缝世界,都具备
Cell的负载均衡
功能。

下面来分析下如何实现Cell的负载均衡。

一、最初世界状态



上图是最初的世界状态。

整个世界场景被切分为
10 x 10
100个方格。

有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管辖的方块写入配置。

这样下次开服时,能从最优的世界场景构建开始。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐