【问题标题】:Web role scaling in windows azureWindows azure 中的 Web 角色缩放
【发布时间】:2013-02-27 08:50:46
【问题描述】:

我已经实现了一个 websocket 服务器作为 WebRole.cs 的一部分,到目前为止它可以工作,用户可以使用网站的 URL 和指定的端点连接到服务器。现在假设我有 50,000 个用户想要连接到 websocket 服务器,我将需要更多该 web 角色的实例来处理负载。

我的问题是,如果有多个 Web 角色实例,这是否也会导致多个 Web 套接字服务器?即用户是否仍然只使用一个 URL/IP 进行连接并且都相互连接(例如,在广播消息时),或者用户是否需要输入不同的 IP 才能连接到不同的 websocket 服务器(每个实例一个)并且仅连接到同一服务器/实例上的用户?

编辑:具体问题

因此,如果在连接时将用户添加到:

private static List<UserContext> Users = new List<UserContext>();

在 WebRole.cs 中。我有一个广播方法:

private static void Broadcast(String message)
        {
            foreach (UserContext uc in Users)
            {
                uc.Send(message);
                Console.WriteLine("Broadcasting to: " + Users.IndexOf(uc));
            }
        }

消息会广播给网站上的所有用户,还是每个实例都有自己的用户列表,因此只广播给连接到特定实例的用户?

【问题讨论】:

  • 您使用的是哪个 UserContext(网络套接字库)?
  • Alchemy Web 套接字 - alchemywebsockets.net

标签: azure websocket azure-web-roles


【解决方案1】:

虽然 Simon 关于负载均衡器将处理所有请求这一事实是正确的(您无需担心需要连接到哪个实例),但您还需要考虑其他事项帐户。从您的问题中,我了解到您想要广播消息。

假设您将应用程序扩展到 2 个实例:

  • 实例 1
  • 实例 2

负载均衡器会确保对 yourapp.cloudapp.net 的所有请求都转到这些实例之一(循环)。现在假设用户 A、B 和 C 被路由到实例 1,用户 D、E 和 F 被路由到实例 2:

  • 实例 1:用户 A、用户 B、用户 C
  • 实例 2:用户 D、用户 E、用户 F

所以让我们假设用户 A 在您的应用程序中执行了某项操作,并且您希望将其广播给您的所有用户。实例 1 只会看到 2 个其他已连接的用户:用户 B 和 C,并将向这些用户发送消息。这里的问题是您还想将消息发送给用户 D、E 和 F,即使它们位于不同的实例上。

这就是为什么您的 WebSocket/broadcast/... 框架(如 SignalR)需要使用可从所有实例访问的服务总线之类的东西。看看 SignalR 如何使用Windows Azure Service Busredis 解决这个问题。

【讨论】:

  • 好的,从我在 Azure 服务总线上阅读的内容来看,我可以创建一个主题并在我的 Web 套接字服务器 (webrole.cs) 类中订阅它。每当从 Web 套接字接收到一条消息时,就会在服务总线上发送一条消息。每当在总线上收到一条消息时,它就会调用广播。这样,所有实例都应该订阅服务总线并广播所有消息。我会试试看,让你知道它是怎么回事。感谢 Sandrino 的建议,您的回答对我所有的 Azure 问题都有帮助:)
【解决方案2】:

您要连接的网站 URL 实际上是负载均衡器的 URL,而不是特定实例(与公共 IP 相同,它是负载均衡器中的虚拟 IP)。当您添加更多实例时,负载均衡器会将流量定向到底层实例(通过循环)。除了公共 URL 和 IP 地址之外,您永远不必担心其他任何事情(虚拟网络除外,其中不使用负载平衡器)。

Alchemy UserContext 具有端点客户端地址。单个服务器将只有连接到它的用户的源地址,而不是其他服务器。您必须从两台服务器进行广播。因此,如果您在所有服务器上广播(),您将捕获所有用户。小心重复。由于 NLB 不执行粘性会话,因此单个用户可能存在于多个服务器上。确保您的客户端代码可以处理来自多个服务器的相同消息

【讨论】:

  • 那么就好像所有用户都连接到同一个服务器?例如。如果我写:'对于服务器上的每个用户发送广播',每个实例上的每个用户都会收到消息?
  • 可能不会。单个服务器将只有连接到它的用户的源地址,而不是其他服务器。您必须从两台服务器进行广播。但是你可能会得到重复,因为单个用户可以为每个请求在两个服务器之间切换。
  • 感谢您迄今为止的帮助!最后一件事,我编辑了我原来的问题,给出了一个更具体的广播示例,你能看看它来确认一下吗?再次感谢:)
  • Alchemy UserContext 具有端点客户端地址。所以是的,如果您在所有服务器上广播(),您将捕获所有用户。小心重复。由于 NLB 不执行粘性会话,因此单个用户可能存在于多个服务器上。确保您的客户端代码可以处理来自多个服务器的相同消息。
  • 非常感谢大家的帮助:)
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 2012-06-11
  • 2012-03-04
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多