gpt4 book ai didi

websocket - 如何负载平衡 Websocket 应用程序。在 Docker Swarm 中?

转载 作者:行者123 更新时间:2023-12-02 23:58:29 25 4
gpt4 key购买 nike

我有一个聊天应用程序,我想在 docker swarm 中扩展它。我也使用redis来管理应用程序。状态。

我创建了一个包含 3 个节点的集群

docker-machine create --driver virtualbox node1 // master
docker-machine create --driver virtualbox node2 // worker
docker-machine create --driver virtualbox node3 // worker

一个覆盖网络(用于服务到服务通信)

docker network create --driver overlay webnet

两项服务

docker service create --name redis --network webnet --replicas 1 redis:alpine
docker service create --name chatapp --replicas=4 --network webnet --publish 80:3000 anandkr/chatapp-prod

问题

Swarm 负载均衡器使用循环技术在 4 个 chatapp 容器之间分配端口 80 上的请求,这些容器使用 websockets 进行客户端通信。因此,由于一个客户端容器之间不存在粘性,因此 Websocket 握手会中断。

即使我使用外部负载均衡器,它仍然会将服务发现的责任转移给群负载均衡器。

如何处理这种情况?我在这里做错了什么?

最佳答案

Swarm 默认使用虚拟 IP(端点模式 vip)。因此,每个服务都会获得自己的 IP 地址,而集群负载均衡器(位于 OSI 第 4 层)会根据其认为合适的方式分配请求。要防止服务拥有 IP 地址,您可以运行 docker 服务更新 webnet --endpoint-mode dnsrr这将允许内部负载均衡器针对服务名称运行 DNS 查询,以发现给定服务的每个任务/容器的 IP。

从那里你可以做你自己的负载平衡(可能是哈希IP)如果您这样做,则需要确保负载均衡器可以使用客户端 IP(在虚拟机或 Docker 网关之前设置 x-forwarded-for header 。

关于websocket - 如何负载平衡 Websocket 应用程序。在 Docker Swarm 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42875572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com