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

如何平衡Websocket应用程序的负载。在Docker Swarm?,websocket,docker-swarm,Websocket,Docker Swarm,我有一个聊天应用程序,我想在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 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 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上的请求,该容器使用WebSocket进行客户端通信。因此,websocket握手会中断,因为一个客户端容器之间没有粘性

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


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

Swarm默认使用虚拟ip(端点模式vip)。因此,每个服务都有自己的IP地址,swarm负载平衡器(位于OSI第4层)根据自己的需要分配请求。要防止服务具有IP地址,可以运行 docker服务更新webnet--端点模式dnsrr 这将允许内部负载平衡器对服务名称运行DNS查询,以发现给定服务的每个任务/容器的IP

从那里你可以做你自己的负载平衡(可能是散列ip) 如果要这样做,则需要确保负载平衡器可以使用客户端IP(在vm或docker网关之前设置x-forwarded-for头)

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