【问题标题】:Which ZeroMQ socket is recommended for this scenario?在这种情况下推荐使用哪个 ZeroMQ 套接字?
【发布时间】:2015-07-06 18:25:43
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 阅读the guide,这将比手册页更能帮助您理解。确保你至少完成了第 5 章,不要仅仅因为你认为你已经解决了你的特定问题而提前跳过。

标签: message-queue zeromq netmq


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多