如何解决SignalR在后端扩展中的限制问题

24
我使用ASP.NET MVC和C#。我发现了SignalR可以实时传输数据,但是SignalR有一些限制。根据这个问题

使用后端总线时,最大消息吞吐量低于客户端直接与单个服务器节点通信的情况。这是因为后端总线将每条消息转发到每个节点,所以后端总线可能成为瓶颈。是否存在此限制取决于应用程序。例如,以下是一些典型的SignalR场景:

  • 服务器广播(例如股票行情):后端总线适用于此场景,因为服务器控制发送消息的速率。
  • 客户端对客户端(例如聊天):在此场景中,如果消息数量随着客户端数量增加而增加,即消息速率与加入的客户端数量成比例增长,则后端总线可能成为瓶颈。
  • 高频率实时性(例如实时游戏):不建议在此场景中使用后端总线。

我的项目需要高频率实时性(例如实时游戏)。

同时我需要实时视频聊天。

我的场景:

我有一个主服务器和多个从服务器,客户端连接到从服务器,从服务器连接到主服务器。

例如:

服务器Slave-1和服务器Slave-2连接到主服务器,客户端A和客户端B连接到Slave-1,客户端C和客户端D连接到Slave-2。

客户端A向客户端D发送消息或数据或进行实时聊天。

我该如何实现这个场景?

[更新-1]

如果我不使用SignalR解决这个问题,那我应该使用什么?

[更新-2]

在我的场景中,主服务器充当路由器的角色,从服务器充当交换机的角色。客户端连接到交换机,交换机连接到路由器。如果客户端A发送数据包给客户端C,则数据包应该被发送到路由器并由路由器处理。从服务器的可能数量超过2000台,并且每个服务器的用户数量超过10,000人。谢谢。

3
不要在那个问题中使用SignalR? - Ritch Melton
4
那么我应该使用什么? - Amir Movahedi
嗨,阿米尔,我正在研究如何做这件事。你愿意通过GitHub分享任何示例代码吗? - Fred Johnson
1个回答

29
一个背板会导致消息传递的延迟,这对于要求低延迟的工作来说并不好。如果你一定需要多个服务器来处理客户端,并且你一定需要最小的延迟,那么背板可能不适合你。
然而,在ASP论坛上查看这个对话。该帖子者在一个服务器上连接了3,000个客户端,每秒发送60,000条信息的平均延迟约为25毫秒。
通常情况下,这里的权衡是延迟和复杂度之间的折衷。最优解决方案是仅将消息路由到包含目标客户端的服务器。要实现这一点,您需要一种跟踪每个客户端连接、处理重新连接到不同服务器等的方法。您可能需要花费几十个小时的艰苦编程来解决这个问题,但这样做会破坏SignalR的大部分有用功能。
至于替代方案,首先想到的是ZeroMQ。如果您的客户端是基于浏览器的,则需要更多的工作,但低延迟和高吞吐量是ZeroMQ的项目目标。不过,您需要自己处理扩展问题...然后您需要跟踪多个服务器上的连接点和重新连接。
如果这两者都无法解决您的问题,则可能需要考虑更改架构。 MMO的常见方法是将相关客户端连接到同一台服务器以减少服务器间通信要求。需要实时通信数据的客户端被放在一个单独的服务器上,该服务器则仅向“主”服务器发送维护世界状态等所需的信息。
在问题出现之前规划您的架构以减少问题...但不要花费数周时间来开发可能并不必要的东西。在SignalR上进行一些测试,看看背板对延迟的实际影响如何,然后再深入探究。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接