Azure上的SignalR连接与负载均衡器

时间:2017-01-20 20:34:26

标签: azure websocket signalr load-balancing

我在Azure资源管理器中有下一个设置:

在两个来自规模集的虚拟机上,我已经部署了一个测试网络应用程序,它使用.Net 4.5.2上的SignalR 2。 测试Web应用程序使用Azure Redis缓存作为背板。 Web应用程序项目可以在github上找到:https://github.com/gaclaudiu/SignalrChat-master

在测试期间,我注意到在打开信号器连接后,客户端发送的所有数据,在下一个请求中,从比例集到达同一服务器,在我看来,SignalR连接知道哪个从设定的比例切断。

我很想知道更多关于它是如何工作的,我试图在互联网上做一些研究,但在这一点上找不到清楚的东西。

另外,我很想知道下一个案例会发生什么: 客户端1具有与服务器A的信号器打开连接。 客户端1通过SignalR的下一个请求转到服务器B.

这会导致错误吗? 或者只是通知客户端没有打开任何连接,它会尝试打开一个新的连接?

5 个答案:

答案 0 :(得分:3)

我很惊讶它一直在工作。问题是:signalr执行多个请求,直到连接启动并运行。无法保证所有请求都转到同一个VM。特别是如果没有启用会话持久性。我遇到了类似的问题。您可以在Load Balancer中激活会话持久性,但正如您所指出的那样,在OSI上执行第4层将使用客户端IP执行此操作(想象来自同一办公室的所有人使用相同的IP命中您的API)。在我们的项目中,我们使用Azure应用程序网关,它使用cookie亲和力 - > OSI应用层。到目前为止它似乎按预期工作。

答案 1 :(得分:0)

SignalR仅知道您在启动连接时提供的URL,并使用它向服务器发送请求。我相信Azure App Service默认使用粘性会话。您可以在此处找到有关此内容的详细信息:https://azure.microsoft.com/en-us/blog/azure-load-balancer-new-distribution-mode/ 当使用多个服务器和横向扩展时,客户端可以向任何服务器发送消息。

答案 2 :(得分:0)

在Azure负载均衡器上,您需要配置会话持久性。这将确保当客户端请求被定向到服务器A时,来自该客户端的任何后续请求将转到服务器A.

  

会话持久性指定来自客户端的流量应在会话期间由后端池中的同一虚拟机处理。 “无”指定来自同一客户端的连续请求可由任何虚拟机处理。 “客户端IP”指定来自同一客户端IP地址的连续请求将由同一虚拟机处理。 “客户端IP和协议”指定来自同一客户端IP地址和协议组合的连续请求将由同一虚拟机处理。

答案 3 :(得分:0)

谢谢你的回答。 做一些阅读,似乎天蓝色的负载均衡器默认使用5-touple分配。 这是文章https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-distribution-mode 5-touple的问题在于每个传输会话都是粘性的。 而且我认为这导致使用信号器的客户端请求在比例集中达到相同的Vm。我认为平衡器将信号器连接解释为单个传输会话。

应用程序网关从一开始就不是一个选项,因为它有许多我们不需要的功能(因此支付我们不使用的东西是没有意义的。)

但是现在似乎应用网关是azure中唯一能够在平衡流量时进行循环的平衡器。

答案 4 :(得分:0)

我认为您误解了负载均衡器的工作原理。每个TCP连接必须将其所有数据包发送到相同的目标VM和端口。如果发送数个数据包后突然将其余的数据包发送到另一个VM和/或端口,则TCP连接将无法工作。因此,负载平衡器将在建立TCP连接时一次决定TCP连接的目标,并且仅一次。一旦建立了TCP连接,在连接期间,其所有数据包都将发送到相同的目标IP /端口。我认为您假设来自同一个TCP连接的不同数据包可以最终位于不同的VM,而事实并非如此。

因此,当您的客户端创建WebSocket连接时,将发生以下情况。负载平衡器接收到TCP连接的传入请求。由分发模式确定,它将请求发送到哪个目标VM。它在内部记录此信息。该TCP连接的所有后续传入数据包都会自动发送到同一VM,因为它会从该内部表中查找适当的VM。因此,WebSocket上的所有客户端消息最终都将位于相同的VM和端口上。

如果创建一个新的WebSocket,它可能会以不同的VM结尾,但是来自客户端的所有消息都将以相同的不同VM结尾。

希望有帮助。