客户端在负载均衡器后面使用多个SignalR服务器进行管理

时间:2016-01-15 13:19:10

标签: websocket signalr scaling

假设我有2个股票代码服务器正在向网络浏览器客户端推送报价。 2台服务器位于负载均衡器(循环模式)之后。 请考虑以下情形:

  1. 客户A订阅Server1上的Google股票,如下所示:Groups.Add(Context.ConnectionId, "Google");

  2. 客户B订阅Server2上的Yahoo库存:Groups.Add(Context.ConnectionId, "Yahoo");

  3. 客户C订阅Server2上的Google股票:Groups.Add(Context.ConnectionId, "Google");

  4. 现在两台服务器已经与股票市场同步,因此当股票更新时,它们都会实时获得更新。

    我的问题是:

    当server2推送新的更新时:

    Clients.Group("Google").tick(quote);
    

    谁是将邮件发送给的客户?它会永远是客户C吗?我猜不是,我们之间有一个负载均衡器,所以在给定时间连接的客户端可能会改变,对吗?它现在可能是C,但接下来它可以是客户A& C或只有A.网络套接字的连接假设保持打开,那么负载均衡器将如何处理它,它是否总是将连接从1个客户端转发到特定的服务器?

    背板在这里不会帮助我,因为我的2台服务器已经同步并且会同时发送相同的消息。所以,如果我强迫他们通过背板将消息路由到另一台服务器,最终会向客户端发送重复消息,如下所示:

    server1在10:00向Google发送自动收报机X - >到背板的路线 - >路由到服务器2 server2在10:00向Google发送自动收报机X - >到背板的路线 - >路由到服务器1

    服务器1向其客户发送2 X Google代码 服务器2向其客户发送2 X Google代码

1 个答案:

答案 0 :(得分:0)

好的,最终我已经通过共享缓存(Redis)同步了所有组订阅,因此所有服务器都知道所有用户及其子目录。这样每个服务器都会知道他的当前客户端注册组,并将推送相关数据。

更新

经过深思熟虑后,这就是我们最终做的事情:

  1. 负载均衡器会为传入连接分配粘性会话,因此每个新连接都有一个常量SignalR服务器。
  2. 第1节将使Redis同步冗余,因为每个服务器都会知道他的所有客户端。
  3. 如果服务器\网络出现故障,SignalR客户端将重新连接,负载均衡器将为其分配一个新服务器(如果服务器出现故障)。
  4. 重新连接后,SignalR客户端将重新订阅相关股票(如果故障在网络上并且负载均衡器将其重定向到旧的SignalR服务器,则可能是多余的,但我会接受它)。< / LI>