1

我们正在 WebApi 和 SignalR 之上构建一个在线游戏(基于浏览器)平台。我们的首要任务之一是低延迟响应时间和可扩展性。在可扩展性方面,我们正在考虑横向扩展方法,将应用程序负载分布在多个服务器节点上。然而,这种架构并非没有额外的复杂性。

在我提出问题之前,让我先描述一下问题。考虑到我们有 2 个服务器节点用于负载平衡。我们说有 50,000 名在线玩家。50% 的玩家使用 SignalR/Websockets 连接到 Node1,另外 50% 连接到 Node2。现在,当 Node1 需要向连接到 Node2 的玩家传递消息时,问题就出现了。Node1 和播放器之间没有物理连接。

所以现在我们有两种可能的解决方案:

  1. 强制一组相似的玩家加入同一个节点。但是,对于我们的场景,这种方法带来的问题多于它解决的问题(尤其是在故障转移恢复期间)。我不会详述。
  2. 允许节点相互通信,所以当 node1 需要向连接到 node2 的客户端发送消息时,node1 将在 node2 的帮助下完成(类似于 node1 --> node2 --> 客户端)。在这种情况下,每个节点都将连接到其他每个节点。

您可能已经猜到了,我们选择了第二种解决方案。正如我已经提到的,服务器响应时间应该非常低,最多低于 50 毫秒,因此在服务器端添加额外的通信层是一个问题。服务器通信应尽可能高效。

这就是我们决定使用ZeroMQ的原因。我们对其进行了测试(REQ-REP),性能远远超过我们可接受的利润。但有一个问题。我已经多次阅读文档,但它让我感到困惑,而不是给了我想法。简而言之,我不知道在我的场景中使用哪种套接字类型。如果节点离线,我不需要排队消息,只是忽略它。

所以任何推荐/帮助都会很好。另外,如果有人能抽出时间简短地描述为什么特定的套接字/模式对我们来说是更好的方法会更好:)

4

1 回答 1

1

实现这一点的一种方法是允许每个客户端(播放器)拥有一个路由器套接字,套接字的身份是播放器的身份,以允许节点和播放器之间的通信。然后,您可以使用0MQ - The Guide上可用的一些代理模式来支持您的目标。路由器套接字文档也可通过链接获得。

一个例子是让每个节点充当代理,允许客户端向他们发送请求,如果他们知道所请求的客户端驻留在该节点上,他们将为请求提供服务,否则他们会将其广播到其他节点。

于 2015-07-06T19:54:39.910 回答