建议在这种情况下使用哪个ZeroMQ套接字?

时间:2015-07-06 18:25:44

标签: message-queue zeromq netmq

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

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

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

  1. 强制一组类似的玩家加入同一个节点。但是,对于我们的场景,这种方法带来的问题多于修复的问题(特别是在故障转移恢复期间)。我不会详细介绍。
  2. 允许节点相互通信,因此当node1需要向连接到node2的客户端发送消息时,node1将在node2的帮助下执行此操作(类似于node1 - > node2 - > client)。在这种情况下,每个节点都将连接到每个其他节点。
  3. 正如您可能已经猜到的那样,我们选择了第二种解决方案。正如我已经提到的,服务器响应时间应该非常低,最大50ms,因此在服务器端添加额外的通信层是一个问题。服务器通信应尽可能高效。

    这就是我们决定使用ZeroMQ的原因。我们测试了它(REQ-REP)并且性能超过了我们可接受的余量。但是有一个问题。我已多次阅读documentation,但它让我更加困惑,而不是给了我一些想法。简而言之,我不知道在我的场景中使用哪种套接字类型。如果节点脱机,我不需要排队消息,只是为了忽略它。

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

1 个答案:

答案 0 :(得分:1)

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

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