我在一个运行在Azure云上的游戏服务器上工作,我遇到了一些障碍。游戏本身是基于一系列的世界,每个世界都运行在不同的工人角色上,并具有单独的地形数据。但是,我不知道如何才能使我用于管理这些世界的主要工作人员角色启动世界角色,并配置它们以加载正确的地图。我也不知道如何确保客户端连接到请求的世界,而不是随机连接到其他世界。
如果任何人可以链接到正确的API来做这件事,我将不胜感激。
发布于 2012-09-14 16:33:11
在您的解决方案中,您可以创建多个工作人员角色,并使用特定端口为每个角色创建一个终结点(同一端口不能用于不同的角色)。请注意,我使用输入端点是为了实现端点的负载平衡。
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="CloudPathDemo" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-05.1.7">
<WorkerRole name="WorkerMainWorld" vmsize="Small">
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="tcp" port="50000" />
</Endpoints>
</WorkerRole>
<WorkerRole name="WorkerWorld1" vmsize="Small">
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="tcp" port="50001" />
</Endpoints>
</WorkerRole>
<WorkerRole name="WorkerWorld2" vmsize="Small">
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="tcp" port="50002" />
</Endpoints>
</WorkerRole>
<WorkerRole name="WorkerWorld3" vmsize="Small">
<Imports>
<Import moduleName="Diagnostics" />
</Imports>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="tcp" port="50003" />
</Endpoints>
</WorkerRole>
</ServiceDefinition>现在,如果你想让你的客户端或者你的“主要”工作者角色连接到world 3,那么你可以发送tcp请求到mygame.cloudapp.net:50003。
如果你想让“地形管理”变得动态化,你可以使用topics and subscriptions。假设每个WorkerRole有1个topic,每个实例是1个subscription。然后,您可以向特定主题发送一条消息,说明应该在该WorkerRole上配置哪些WorkerRole,该worlds的每个实例都将收到该消息并执行必要的配置。当然,您需要考虑到稍后可能会添加实例(当您向上扩展时),因此这些实例还需要知道应该提供哪些worlds (通过从example中的表存储中读取列表)。
发布于 2012-09-14 20:44:36
我的建议是创建一个主/控制器,它是世界的端点(如果你喜欢的话是代理)。所有连接都会到达它,然后它会将它们直接路由到后端特定的服务器。这个连接可能非常薄(我认为一旦连接建立,就只有一个IP隧道),所以它不会增加太多延迟。
现在,这种方法有几个陷阱。
代理只能处理有限数量的活动连接。因此,您必须有一种方法来监控这一点,并将流量路由到辅助代理/中继。Windows Azure的内置负载均衡器应该可以很好地做到这一点,你只需要监控活动连接并使用该信息来控制你的伸缩行为。
此外,空闲连接将被Windows Azure负载均衡器终止,因此您的代理将需要能够检测连接何时被终止,以便它可以释放这些资源来服务于另一个连接。
这种方法的好处是,如果您的世界服务器离线或被移动(它们将在某个时候移动),代理可以检测到工作负载移动到了哪里,并相应地转移连接,使其对外部用户来说看起来更少。
现在,还有另一种方法可以解决所有这些问题。Windows Azure服务总线中继。每个“世界”服务器在服务总线上都有自己的端点,当客户端请求连接时,它会到达控制“代理”,并为其请求的服务器获取端点。您可以进一步启用混合连接,这将鼓励客户端和服务器协商直接连接,从而减少任何中继延迟。并且服务总线端点,因为它是公布的位置,解决了机器特定寻址能力的任何问题。
https://stackoverflow.com/questions/12419479
复制相似问题