如何在 docker-swarm 环境中处理套接字连接
How to handle socket connections in a docker-swarm environment
我正在构建一个网络应用程序,使用 nodejs 作为服务器,Docker Swarm 来处理复制和负载平衡。
现在,我需要处理客户端和复制服务器之间的实时数据更新,所以我想到使用 Socket.IO 来处理连接。所有请求都通过 NGINX 服务器传递,该服务器将其重定向到 swarm 的管理节点,并由他处理平衡。
由于网络拓扑可以根据网络负载快速变化,我不愿让 NGINX 处理平衡和应用粘性会话...(也许是错误的)
根据我对这个设置的理解,如果客户端连接到我的服务器,docker 的负载均衡器会将请求发送到我的 N 个复制服务器之一,只有这个服务器知道客户端连接。
因此,如果某些传统的 HTTP 请求在另一个副本上更新我的数据,则可能不会发送信息,因为给定服务器中不存在此连接。
有没有办法处理这种情况?我想在服务器之间包含一个消息队列以将数据发送给所有服务器,然后包含连接的服务器将发送数据,但这是推荐的做法吗?
非常感谢
自提问以来,我进行了进一步调查。我会 post 我发现的东西,以防它能帮助遇到类似问题的人。
我发现的一个选项是使用 MessageQueue 或类似的东西将消息广播到所有副本,然后每个副本只过滤可以发送的消息,因为副本本身知道该副本中可用的 TCP 连接.
但我认为这会给副本带来过大的压力,因为它们都在接收所有消息,因此一种解决方案是创建一个队列或服务,将给定连接的 ID 链接到副本,并将消息仅转发给那些感兴趣的副本。
我认为这可以很容易地通过主题或为每个 tcp 连接创建一个队列并使用一些 id 作为标识符,然后推送到相应的队列。
如果有人看到任何问题或想补充什么,将不胜感激!
我正在构建一个网络应用程序,使用 nodejs 作为服务器,Docker Swarm 来处理复制和负载平衡。
现在,我需要处理客户端和复制服务器之间的实时数据更新,所以我想到使用 Socket.IO 来处理连接。所有请求都通过 NGINX 服务器传递,该服务器将其重定向到 swarm 的管理节点,并由他处理平衡。 由于网络拓扑可以根据网络负载快速变化,我不愿让 NGINX 处理平衡和应用粘性会话...(也许是错误的)
根据我对这个设置的理解,如果客户端连接到我的服务器,docker 的负载均衡器会将请求发送到我的 N 个复制服务器之一,只有这个服务器知道客户端连接。 因此,如果某些传统的 HTTP 请求在另一个副本上更新我的数据,则可能不会发送信息,因为给定服务器中不存在此连接。
有没有办法处理这种情况?我想在服务器之间包含一个消息队列以将数据发送给所有服务器,然后包含连接的服务器将发送数据,但这是推荐的做法吗?
非常感谢
自提问以来,我进行了进一步调查。我会 post 我发现的东西,以防它能帮助遇到类似问题的人。
我发现的一个选项是使用 MessageQueue 或类似的东西将消息广播到所有副本,然后每个副本只过滤可以发送的消息,因为副本本身知道该副本中可用的 TCP 连接.
但我认为这会给副本带来过大的压力,因为它们都在接收所有消息,因此一种解决方案是创建一个队列或服务,将给定连接的 ID 链接到副本,并将消息仅转发给那些感兴趣的副本。 我认为这可以很容易地通过主题或为每个 tcp 连接创建一个队列并使用一些 id 作为标识符,然后推送到相应的队列。
如果有人看到任何问题或想补充什么,将不胜感激!