【问题标题】:How to handle socket connections in a docker-swarm environment如何在 docker-swarm 环境中处理套接字连接
【发布时间】:2020-01-10 21:09:56
【问题描述】:

我正在构建一个使用 nodejs 作为服务器和 Docker Swarm 来处理复制和负载平衡的 web 应用程序。

现在,我需要处理客户端和复制服务器之间的实时数据更新,所以我想到了使用 Socket.IO 来处理连接。所有请求都通过 NGINX 服务器传递,该服务器将其重定向到 swarm 的管理器节点,并由他处理平衡。 由于网络的拓扑可以根据网络的负载快速变化,我不愿意让 NGINX 处理平衡和应用粘性会话......(也许是错的)

根据我对这种设置的理解,如果客户端连接到我的服务器,docker 的负载均衡器会将请求发送到我的 N 个复制服务器之一,并且只有这台服务器会知道客户端已连接。 因此,如果某些传统的 HTTP-Request 更新我在另一个副本上的数据,则可能由于给定服务器中不存在此连接而无法发送信息。

有没有办法处理这种情况?我想在服务器之间包含一个消息队列以将数据发送给所有服务器,然后包含连接的那个将发送数据,但这是推荐的做法吗?

非常感谢

【问题讨论】:

    标签: node.js docker socket.io docker-swarm


    【解决方案1】:

    自提出问题以来,我进行了进一步调查。我会发布我发现的内容,以防它对遇到类似问题的人有所帮助。

    我发现的一个选项是使用 MessageQueue 或类似的东西将消息广播到所有副本,然后每个副本只过滤可以发送的消息,因为副本本身知道该副本中可用的 TCP 连接。

    但我认为这会给副本带来过大的压力,因为它们都在接收所有消息,因此一种解决方案是创建一个队列或服务,将给定连接的 id 链接到副本,并且仅将消息转发给那些感兴趣的副本。 我认为可以很容易地使用主题或为每个 tcp 连接以某个 id 作为标识符创建一个队列,然后推送到相应的队列。

    如果有人看到任何问题或想添加一些东西,将非常感激!

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2015-02-25
      相关资源
      最近更新 更多