SocketIOdocker 副本+ Nginx + 浏览器 = 按副本总数复制的发射事件

问题描述

我在 docker swarm + Nginx for load balancing 内运行了一个 SocketIO 服务器,它运行良好。

但是我有一个重复的发射事件的小问题。

示例:我有 SocketIO server 的 30 个副本(副本); 1 Nginx gateway 以及在 Docker Swarm

中运行的所有内容

我的 Nginx 配置:

server {
listen 80;

server_name  10.10.10.212;

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://loadbalancer;
    # enable WebSockets
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }
 }

我的 SocketIO 服务器发出

socketio.emit('warehouse_scan:added','HB10790')

浏览器结果

30 results

我该如何解决这个问题?

解决方法

发出重复事件是我的错误。 我在使用 nginx 设置所有内容时设置了错误的参数,匹配客户端版本等...

后端配置错误:

socketio = SocketIO(app,logger=True,engineio_logger=True,policy_server=True,async_mode='eventlet',manage_session=True,cors_allowed_origins="*",message_queue=socket_io_msg_q)

修复重复的正确方法:

socketio = SocketIO(app,manage_session=True)

问题出在这一行:

message_queue=socket_io_msg_q <-- error!

这将触发从后端服务器到 REDIS 的所有发出事件,然后返回到客户端。如果我有 50 个副本,客户端将收到来自这些副本的消息量。