【问题标题】:How to start Azure worker roles and redirect the client to them如何启动 Azure 辅助角色并将客户端重定向到它们
【发布时间】:2012-09-14 20:44:36
【问题描述】:

我正在开发在 Azure 云上运行的游戏服务器,但遇到了一些障碍。游戏本身基于一系列世界,每个世界都以不同的工人角色运行并具有单独的地形数据。但是,我不知道如何使我用于管理这些世界的主要工作角色启动世界角色并配置它们以加载正确的地图。我也不知道如何确保客户端连接到请求的世界而不是随机的其他世界。

如果有人可以将我链接到正确的 API 来执行此操作,我将不胜感激。

【问题讨论】:

  • 工作者角色是后台进程。它们相当于桌面或服务器上的 Windows 服务。您的用户不应该直接与他们打交道。他们应该与您的 Web 角色进行交互。
  • Azure 项目使用辅助角色进行直接 TCP 和 UDP 连接,不使用 Web 角色。

标签: c# .net-4.0 azure load-balancing


【解决方案1】:

在您的解决方案中,您可以创建多个工作角色并为每个角色创建一个具有特定端口的端点(同一端口不能用于不同角色)。请注意,我使用输入端点来平衡端点负载。

<?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

如果您想让“地形管理”以某种方式动态化,您可以使用topics and subscriptions。假设每个 WorkerRole 有 1 个主题,每个实例是 1 个订阅。然后,您可以向特定主题发送一条消息,说明应该在该 WorkerRole 上配置哪些世界,并且该 WorkerRole 的每个实例都将接收该消息并进行必要的配置。当然,您需要考虑到以后可能会添加实例(当您扩大规模时),因此这些实例还需要知道应该配置哪些世界(通过从示例中的表存储中读取列表)。

【讨论】:

  • 在云项目上运行的世界数量比这实际上允许的要大得多,是否可以更改特定实例使用的端口? (因此,默认情况下,它会接受例如端口 50001 上的连接,然后从主要的世界经理工作者角色接收它必须加载的世界以及应该使用的端口)
  • 如果您想连接到特定实例,您应该查看 InstanceInput 端点。这些允许您指定将在实例上映射的端口范围。更多信息:haishibai.blogspot.be/2012/06/quick-look-at-cloud-service.html。请注意,您需要考虑到实例可能会离线。
【解决方案2】:

我的建议是创建一个主/控制器作为世界的端点(如果您愿意,可以代理)。所有连接都到达它,然后将它们直接路由到后端世界特定的服务器。这个连接可能很细(一旦建立连接,我认为只是一个 IP 隧道),所以它不会增加太多延迟。

现在这种方法有几个问题。

代理只能处理有限数量的活动连接。因此,您必须有一种方法来监控这一点并将流量路由到辅助代理/中继。 Windows Azure 的内置负载平衡器应该可以很好地做到这一点,您只需要监控活动连接并使用该信息来控制您的扩展行为。

此外,空闲连接将被 Windows Azure 负载平衡器终止,因此您的代理需要能够检测到连接何时被终止,以便它可以释放这些资源来为另一个连接提供服务。

这种方法的好处是,如果您的世界服务器离线或被移动(它们将在某个时候移动),代理可以检测工作负载移动的位置并相应地转移连接,从而使您的外部用户。

现在还有另一种方法可以解决所有这些问题。 Windows Azure 服务总线中继。每个“世界”服务器在服务总线上都有自己的端点,当客户端请求连接时,它会到达控制“代理”并为其请求的服务器获取端点。您可以通过启用混合连接更进一步,这将鼓励客户端和服务器协商直接连接,从而减少任何中继延迟。并且服务总线端点,因为它是一个发布的位置,解决了机器特定可寻址性的任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2013-02-15
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多