游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2258

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1197|回复: 14

[枫叶飘零] Photon Server之LoadBalancing Application介绍

[复制链接]  [移动端链接]
排名
1658
昨日变化
1

52

主题

247

帖子

1798

积分

Rank: 9Rank: 9Rank: 9

UID
6728
好友
21
蛮牛币
6422
威望
0
注册时间
2013-10-30
在线时间
670 小时
最后登录
2018-7-13

专栏作家社区QQ达人

发表于 2017-12-18 18:54:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本文解释LoadBalancing应用程序的服务器端的实现。
Concept 概念
在Photon 3中,LoadBalancing应用程序扩展了Lite应用程序。 它提供了所有知名的Lite函数,如“房间”,“事件”,“属性”等,并增加了一层可扩展性,使您能够在多个服务器上运行应用程序。 LoadBalancing还增加了大厅支持和配对功能。
在Photon 4中,Lite被弃用于Hive。 所以LoadBalancing现在扩展了更加复杂但更具可扩展性的Hive。
基本设置没有改变,并且总是很简单:总是有一个主服务器和1..N游戏服务器。
1.png
主服务器处理这些任务:

跟踪游戏服务器上当前打开的游戏。

跟踪连接的游戏服务器的工作量,并将对等点分配给合适的游戏服务器。

保留并更新“大厅”中的客户可用房间列表。

为客户找到房间(随机或名称)并将游戏服务器地址转发给他们

游戏服务器有这些任务:
        主持游戏室。 他们为此目的运行Lite应用程序的稍微修改版本。
        定期向主服务器报告当前的工作负载和游戏列表。
与Photon云服务的差异:
LoadBalancing应用程序提供了与Photon Cloud服务几乎相同的逻辑。 作为云服务无法编写服务器逻辑,LoadBalancing可以自行编写逻辑处理。
Basic Workflow 基本工作流程
从客户端角度来看,工作流程也非常简单:

1,客户端连接到主服务器,他们可以加入大厅,并检索打开的游戏列表。

2,当他们在Master上调用CreateGame操作时,游戏实际上并不创建 - 主服务器只确定工作量最小的游戏服务器,并将其IP返回给客户端。

3,当客户端在主服务器上调用JoinGame或JoinRandomGame操作时,主服务器查找运行游戏的游戏服务器,并将其IP返回给客户端。

4,客户端与主服务器断开连接,使用刚收到的IP连接到游戏服务器,再次调用CreateGame或JoinGame操作。

5,从此以后,所有的工作都和Lite应用程序一样。

2.png

Master Server 主服务器
下面介绍了主服务器实现 - 请参阅\ src-server \ Loadbalancing \ Loadbalancing.sln解决方案中的LoadBalancing.MasterServer命名空间。
MasterApplication决定传入连接是由游戏客户端(在“客户端口”上)还是由游戏服务器(在“游戏服务器端口”上)发起的。

Master: Handling Client Peers处理客户对等
MasterClientPeer代表到主服务器的客户端连接。 以下操作适用于MasterClientPeer:
认证
Authenticate操作只有一个虚拟的实现。 开发者应该以此为出发点来实现自己的认证机制:
3.png
JoinLobby
JoinLobby操作用于将MasterClientPeer添加到AppLobby,该AppLobby包含GameList - 任何游戏服务器上所有打开的游戏的列表。 Peer接收一个初始的GameListEvent,它包含GameList中的当前游戏列表(由JoinLobby操作的可选属性过滤):
之后,GameListUpdateEvent会定期发送到客户端,其中包含已更改游戏的列表(也由JoinLobby操作的可选属性进行过滤)。 客户端只要连接就会收到更新事件。
protected virtual OperationResponse HandleJoinLobby(MasterClientPeer peer, OperationRequest operationRequest, SendParameters sendParameters)
{
    // validate operation
    var operation = new JoinLobbyRequest(peer.Protocol, operationRequest);
    OperationResponse response;
    if (OperationHelper.ValidateOperation(operation, log, out response) == false)
    {
        return response;
    }
    peer.GameChannelSubscription = null;
    var subscription = this.GameList.AddSubscription(peer, operation.GameProperties, operation.GameListCount);
    peer.GameChannelSubscription = subscription;
    peer.SendOperationResponse(new OperationResponse(operationRequest.OperationCode), sendParameters);
    // publish game list to peer after the response has been sent
    var gameList = subscription.GetGameList();
    var e = new GameListEvent { Data = gameList };
    var eventData = new EventData((byte)EventCode.GameList, e);
    peer.SendEvent(eventData, new SendParameters());
    return null;
}

JoinGame / JoinRandomGame
JoinGame操作在客户端想要加入由AppLobby的GameList中列出的现有游戏(由唯一的GameId指定)时被调用。如果游戏存在并且允许对方加入,则主服务器将游戏实际运行的游戏服务器的IP返回给客户端。
主服务器还更新GameState并将对等体添加到“加入对等体”列表中。一旦游戏服务器加入游戏(或超时),它将被删除。这样,主服务器可以跟踪在主服务器和游戏服务器之间转换的对等体。
JoinRandomGame以类似的方式工作,除了主服务器随机选择游戏并将GameId返回给客户端。
创建游戏
CreateGame操作在客户想要创建新游戏时被调用。主服务器确定将在其上创建新游戏的游戏服务器,并将游戏服务器的IP返回给客户端。
另外,GameState对象被创建并被添加到GameList中,对等体被存储为“加入对等体”。
请注意,此GameState仅用于跟踪游戏 - 游戏本身只存在于游戏服务器上。

Master: Handling Game Server Peers 处理游戏服务器对等
主服务器总是知道哪些游戏服务器可用,它们托管了多少游戏以及当前的工作负载是多少。
为了达到这个目的,每个游戏服务器在启动时连接到主服务器。 MasterApplication维护一个GameServerCollection,其中存储IncomingGameServerPeers。
游戏服务器只能调用一个操作:
RegisterGameServer
游戏服务器在连接到主服务器后调用RegisterGameServer操作一次。 游戏服务器被添加到Master的GameServerCollection和它的LoadBalancer。 它将在断开连接时从GameServerCollection中删除。

Game Server 游戏服务器
本节介绍游戏服务器的实现。 请参阅\ src-server \ Loadbalancing \ Loadbalancing.sln解决方案中的LoadBalancing.GameServer命名空间。
Game Server: Handling Client Peers
游戏服务器来自Lite应用程序。 只要客户端从主服务器收到游戏服务器地址,客户端就可以调用Lite中可用的游戏服务器上的任何操作。 唯一的区别是我们在游戏服务器上有JoinGame和CreateGame的单独的操作代码,而Lite则通过JoinGame处理。

Game Server: Reporting Game States to the Master将游戏状态报告给主服务器
与主服务器的连接在游戏服务器中表示为OutgoingMasterServerPeer。 连接建立后,游戏服务器将在主服务器上调用注册操作。 之后,游戏服务器将所有现有游戏状态发布到主服务器:
// OutgoingMasterServerPeer.cs:
protected virtual void HandleRegisterGameServerResponse(OperationResponse operationResponse)
{
    switch (operationResponse.ReturnCode)
    {
    case (short)ErrorCode.Ok:
        {
            log.InfoFormat("Successfully registered at master server: serverId={0}", GameApplication.ServerId);
            this.IsRegistered = true;
            this.UpdateAllGameStates();
            this.StartUpdateLoop();
            break;
        }
    }
}
这是通过向每个游戏发送一条消息告诉它发送游戏状态给主控人员来完成的:
// OutgoingMasterServerPeer.cs:
public virtual void UpdateAllGameStates()
{
    foreach (var gameId in GameCache.Instance.GetRoomNames())
    {
        Room room;
        if (GameCache.Instance.TryGetRoomWithoutReference(gameId, out room))
        {
            room.EnqueueMessage(new RoomMessage((byte)GameMessageCodes.ReinitializeGameStateOnMaster));
        }               
    }
}
游戏在ProcessMessage方法中处理这个事件,并调用UpdateGameStateOnMaster方法将UpdateGameEvent发送给主机:
4.png
游戏状态也在游戏创建,加入或由客户留下游戏或其属性发生变化时在游戏中更新。

LoadBalancing implementation 实现
下面将介绍游戏服务器如何向主服务器报告当前的工作负载,以及主服务器如何确定最适合处理新的CreateGame请求的游戏服务器 - 实际的负载平衡算法。
Game Servers: Determine Workload 游戏服务器:确定工作量
有关实现细节,请参阅“\ src-server \ Loadbalancing \ Loadbalancing.sln”解决方案中的LoadBalancing.LoadShedding命名空间。
游戏服务器定期向主服务器报告当前的工作负载。 工作负载包括,例如: - CPU使用率 - 流量 - 一些特定于Photon的值,如ENet +业务队列长度,服务器在每个请求上花费的平均时间等等。 - 延迟(向自己发送请求时)
最重要(也是最容易理解的)因素是CPU负载,因此我们将重点介绍本文档中的CPU负载。
所有这些因素都汇总在一个单一的值 - 一个游戏服务器的“负载水平”,这是报告给主。
游戏服务器负载水平越低,适合主持新游戏的游戏服务器就越好。
Implementation Details 实施细节
游戏服务器收集关于上述因素的“反馈”。 每个因素都有一个FeedbackController对象 - 它由一个FeedbackName和一个FeedbackLevel组成:
5.png
DefaultConfiguration类定义了每个值的阈值 - 例如,服务器具有“最低”的FeedbackLevel高达20%的CPU使用率,达到90%CPU的“最高”FeedbackLevel等等。
6.png
这些值也可以在workload.config文件中配置。 LoadBalancing.LoadShedding.Configuration命名空间负责从配置文件读取值,或者如果不存在配置,则应用DefaultConfiguration。
游戏服务器会定期检查一些Windows性能计数器,为所有FeedbackControllers设置当前值,并计算新的“整体反馈”。
这是在WorkloadController类中完成的:

private void Update()
{
    FeedbackLevel oldValue = this.feedbackControlSystem.Output;
    if (this.cpuCounter.InstanceExists)
    {
        var cpuUsage = (int)this.cpuCounter.GetNextAverage();
        Counter.CpuAvg.RawValue = cpuUsage;
        this.feedbackControlSystem.SetCpuUsage(cpuUsage);
    }
    if (this.timeSpentInServerInCounter.InstanceExists && this.timeSpentInServerOutCounter.InstanceExists)
    {
        var timeSpentInServer = (int)this.timeSpentInServerInCounter.GetNextAverage() + (int)this.timeSpentInServerOutCounter.GetNextAverage();
        Counter.TimeInServerInAndOutAvg.RawValue = timeSpentInServer;
        this.feedbackControlSystem.SetTimeSpentInServer(timeSpentInServer);
    }
    this.FeedbackLevel = this.feedbackControlSystem.Output;
    Counter.LoadLevel.RawValue = (byte)this.FeedbackLevel;
    if (oldValue != this.FeedbackLevel)
    {
        if (log.IsInfoEnabled)
        {
            log.InfoFormat("FeedbackLevel changed: old={0}, new={1}", oldValue, this.FeedbackLevel);
        }
        this.RaiseFeedbacklevelChanged();
    }
}
如果整体反馈级别发生变化,OutgoingMasterServerPeer会将新的服务器状态报告给Master:
public void UpdateServerState()
{
    this.UpdateServerState(
        GameApplication.Instance.WorkloadController.FeedbackLevel,
        GameApplication.Instance.PeerCount,
        GameApplication.Instance.WorkloadController.ServerState);
}
Master Server: LoadBalancing Algorithm  主服务器:负载均衡算法
有关实现细节,请参阅\ src-server \ Loadbalancing \ Loadbalancing.sln解决方案中的LoadBalancing.LoadBalancer类。
主服务器在LoadBalancer类中存储每个游戏服务器的LoadLevel。 它还包含当前具有最低负载级别的所有服务器的附加列表。
每当客户端调用CreateGame操作时,主服务器都会从LoadBalancer中获取负载级别最低的服务器的地址,并将其返回给客户端,客户端将连接到该服务器。
Configuration and Deployment配置和部署
为了演示目的,SDK包含在其部署目录中的1个主服务器和2个游戏服务器的设置:
/deploy/LoadBalancing/Master
/deploy/LoadBalancing/GameServer1
/deploy/LoadBalancing/GameServer2
此设置仅用于本地开发。

Deploying a Game Server部署游戏服务器
当您将LoadBalancing项目部署到生产服务器时,您不应在一台服务器上托管2个游戏服务器应用程序。 从PhotonServer.config中删除“GameServer2”的所有设置,并删除/ deploy / LoadBalancing / GameServer2目录。
您需要确保游戏服务器可以在主服务器上注册。 将Photon.LoadBalancing.dll.config中的MasterIPAddress设置为Master的公共IP。
您还需要确保游戏客户端可以访问游戏服务器。 在每个游戏服务器上,您需要设置该游戏服务器的公共IP地址。 如果将值保留为空,则将自动检测公共IP地址。
7.png
您也可以使用Photon控制器来设置公共IP。
Deploying a Master Server 部署主服务器
您需要确保您只有一个主服务器:从游戏服务器上的PhotonServer.config中删除“主”应用程序的所有设置,或者至少确保您的游戏服务器和客户端都使用相同的IP 连接到相同的单个主服务器。
否则,主服务器上不需要特殊配置。

Take a Game Server out of rotation 让游戏服务器停止运行
主服务器知道游戏服务器的状态,如“ServerState”枚举中所述:
“在线”(这是默认)
“未轮换”(=开放游戏仍然列在大厅中,玩家可以加入该服务器上的现有游戏,但是不会创建新游戏)
“离线”(该服务器上的现有游戏不能加入,并且该GS上不会创建新的游戏)
GS定期将它们的服务器状态发送到主服务器。
8.png
如果你想以编程方式设置服务器状态,你需要做的是:

修改WorkloadController类,以确定当前的服务器状态
例如,您可以添加一个“文件观察器”,并从文本文件(0/1/2)中读取服务器状态。
你也可以建立一个从客户端调用的操作,从数据库中读取它,或者你想到的任何东西。


回复

使用道具 举报

排名
1658
昨日变化
1

52

主题

247

帖子

1798

积分

Rank: 9Rank: 9Rank: 9

UID
6728
好友
21
蛮牛币
6422
威望
0
注册时间
2013-10-30
在线时间
670 小时
最后登录
2018-7-13

专栏作家社区QQ达人

 楼主| 发表于 2017-12-18 18:54:54 | 显示全部楼层
不管你有关于Photon产品的问题或者是Photon价格问题或者Photon教程方面的问题或者其他问题都可以联系我们给我我们留言,我们真诚的为您服务。关注我们公众号PhotonServer获取等多新鲜资讯。


回复 支持 反对

使用道具 举报

7日久生情
2535/5000
排名
3446
昨日变化
1

2

主题

1780

帖子

2535

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
241666
好友
0
蛮牛币
10199
威望
0
注册时间
2017-9-6
在线时间
362 小时
最后登录
2018-6-7
发表于 2017-12-19 07:55:23 来自Mobile--- | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
1556/5000
排名
3257
昨日变化
18

3

主题

852

帖子

1556

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
246489
好友
0
蛮牛币
2581
威望
0
注册时间
2017-9-28
在线时间
293 小时
最后登录
2018-7-17

活力之星迈向小康

发表于 2017-12-19 08:40:15 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
2151/5000
排名
3347
昨日变化
4

8

主题

1098

帖子

2151

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
168159
好友
4
蛮牛币
5036
威望
0
注册时间
2016-9-12
在线时间
639 小时
最后登录
2018-7-17
发表于 2017-12-19 09:21:08 | 显示全部楼层

回复

使用道具 举报

7日久生情
3049/5000
排名
2420
昨日变化
7

0

主题

2080

帖子

3049

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2487
威望
0
注册时间
2017-7-12
在线时间
437 小时
最后登录
2018-7-17

活力之星

发表于 2017-12-19 09:39:36 | 显示全部楼层
谢谢分享

回复

使用道具 举报

3偶尔光临
267/300
排名
8172
昨日变化
76

5

主题

52

帖子

267

积分

Rank: 3Rank: 3Rank: 3

UID
195502
好友
0
蛮牛币
255
威望
0
注册时间
2016-12-23
在线时间
76 小时
最后登录
2018-7-17
发表于 2017-12-19 09:48:57 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
4173/5000
排名
2763
昨日变化
10

5

主题

3111

帖子

4173

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
209186
好友
5
蛮牛币
5180
威望
0
注册时间
2017-3-1
在线时间
585 小时
最后登录
2018-7-17
发表于 2017-12-19 11:11:34 | 显示全部楼层
谢谢分享
[发帖际遇]: luastudy 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
1803/5000
排名
2164
昨日变化
10

0

主题

715

帖子

1803

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
148286
好友
0
蛮牛币
3755
威望
0
注册时间
2016-5-11
在线时间
504 小时
最后登录
2018-7-17
发表于 2017-12-19 15:43:30 | 显示全部楼层
[发帖际遇]: 一个袋子砸在了 tzb1125 头上,tzb1125 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
519/1000
排名
7524
昨日变化
4

0

主题

262

帖子

519

积分

Rank: 5Rank: 5

UID
250350
好友
1
蛮牛币
466
威望
0
注册时间
2017-10-23
在线时间
109 小时
最后登录
2018-7-12
发表于 2017-12-19 18:19:23 | 显示全部楼层
谢谢分享

回复

使用道具 举报

5熟悉之中
809/1000
排名
3783
昨日变化

0

主题

247

帖子

809

积分

Rank: 5Rank: 5

UID
228538
好友
6
蛮牛币
1304
威望
0
注册时间
2017-6-24
在线时间
212 小时
最后登录
2018-7-17
发表于 2017-12-20 09:37:15 | 显示全部楼层
感谢分享

回复

使用道具 举报

排名
22432
昨日变化
7

0

主题

34

帖子

69

积分

Rank: 2Rank: 2

UID
186188
好友
0
蛮牛币
0
威望
0
注册时间
2016-11-23
在线时间
17 小时
最后登录
2018-5-25
发表于 2017-12-20 23:00:09 | 显示全部楼层

感谢分享

回复

使用道具 举报

7日久生情
2238/5000
排名
19113
昨日变化
13

2

主题

1857

帖子

2238

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2917
威望
0
注册时间
2016-11-22
在线时间
353 小时
最后登录
2018-7-5
发表于 2018-1-2 16:19:05 | 显示全部楼层
赞,学习了,谢谢分享
[发帖际遇]: 东坡肘子2010 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

排名
36963
昨日变化
10

2

主题

32

帖子

56

积分

Rank: 2Rank: 2

UID
257804
好友
0
蛮牛币
125
威望
0
注册时间
2017-12-4
在线时间
16 小时
最后登录
2018-4-24
发表于 2018-1-7 00:52:06 | 显示全部楼层
感谢分享

回复

使用道具 举报

5熟悉之中
723/1000
排名
4739
昨日变化
2

1

主题

96

帖子

723

积分

Rank: 5Rank: 5

UID
144748
好友
1
蛮牛币
1517
威望
0
注册时间
2016-4-7
在线时间
356 小时
最后登录
2018-7-8
发表于 2018-1-8 09:00:45 | 显示全部楼层
我想请问一下使用PUN插件能否与数据库交互

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表