繁体   English   中英

Windows Azure中的Web角色缩放

[英]Web role scaling in windows azure

我已经将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));
            }
        }

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

虽然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)需要使用类似于可从所有实例访问的服务总线的原因。 通过使用Windows Azure Service Busredis来了解SignalR如何解决此问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM