我正在开发在 Azure 云上运行的游戏服务器,但遇到了一些障碍。游戏本身基于一系列世界,每个世界都以不同的工人角色运行并具有单独的地形数据。但是,我不知道如何使我用于管理这些世界的主要工作角色来启动世界角色并配置它们以加载正确的地图。我也不知道如何确保客户端连接到请求的世界而不是随机的其他世界。
如果有人可以将我链接到正确的 API 来执行此操作,我将不胜感激。
我正在开发在 Azure 云上运行的游戏服务器,但遇到了一些障碍。游戏本身基于一系列世界,每个世界都以不同的工人角色运行并具有单独的地形数据。但是,我不知道如何使我用于管理这些世界的主要工作角色来启动世界角色并配置它们以加载正确的地图。我也不知道如何确保客户端连接到请求的世界而不是随机的其他世界。
如果有人可以将我链接到正确的 API 来执行此操作,我将不胜感激。
在您的解决方案中,您可以创建多个工作角色并为每个角色创建一个具有特定端口的端点(同一端口不能用于不同的角色)。请注意,我使用输入端点来平衡端点负载。
<?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>
现在,如果您希望您的客户端或您的“主要”工作者角色连接到世界 3,例如,您可以将 tcp 请求发送到mygame.cloudapp.net:50003。
如果您想让“地形管理”以某种方式动态化,您可以使用主题和订阅。假设每个 WorkerRole 有 1 个主题,每个实例是 1 个订阅。然后,您可以向特定主题发送一条消息,说明应该在该 WorkerRole 上配置哪些世界,并且该 WorkerRole 的每个实例都将接收该消息并进行必要的配置。当然,您需要考虑到以后可能会添加实例(当您扩大规模时),因此这些实例还需要知道应该配置哪些世界(通过从示例中读取表存储中的列表)。
我的建议是创建一个主/控制器,它是世界的端点(如果你愿意,可以代理)。所有连接都到达它,然后将它们直接路由到后端世界特定的服务器。这个连接可能非常细(一旦建立连接,我认为只是一个 IP 隧道),所以它不会增加太多延迟。
现在这种方法有几个问题。
代理只能处理有限数量的活动连接。因此,您必须有一种方法来监控这一点并将流量路由到辅助代理/中继。Windows Azure 的内置负载平衡器应该可以很好地做到这一点,您只需要监控活动连接并使用该信息来控制您的扩展行为。
此外,空闲连接将被 Windows Azure 负载平衡器终止,因此您的代理需要能够检测到连接何时被终止,以便它可以释放这些资源来为另一个连接提供服务。
这种方法的好处是,如果您的世界服务器离线或移动(它们将在某个时候移动),代理可以检测工作负载移动的位置并相应地转移连接,使您的外部用户看起来.
现在还有另一种方法可以解决所有这些问题。Windows Azure 服务总线中继。每个“世界”服务器在服务总线上都有自己的端点,当客户端请求连接时,它会到达控制“代理”并为其请求的服务器获取端点。您可以通过启用混合连接更进一步,这将鼓励客户端和服务器协商直接连接,从而减少任何中继延迟。并且服务总线端点,因为它是一个发布的位置,解决了机器特定可寻址性的任何问题。