使用AWS ELB在连接节点服务器闲置60秒后Websocket关闭

时间:2018-02-13 00:00:32

标签: node.js amazon-web-services amazon-ec2 websocket aws-elb

我有一个节点服务器在EC2实例上运行,客户端也运行在同一个EC2实例上,客户端打开websocket连接来与节点服务器通信,它在QA和Dev AWS环境中工作,但是相同的Web连接在60秒后关闭在prod环境中闲置,我在aws环境中运行ELB后面的客户端和节点服务器。

客户代码:

 ws = new WebSocket('ws://localhost:8443');


            ws.onclose = function () {
                console.log("Websocket connection has been closed.");
                clientObj.emit('LogoffSuccess', 'LogoffSuccessfully');
            };
            ws.onerror=function(event)
            {
               console.log(event.data);
            };
            ws.addEventListener('open', function (event) {
                console.log('Websocket connection has been opened');
                ws.send(JSON.stringify(loginCreds));
            });


    Node server Code below:

    const wss = new WebSocket.Server({ server: app });
    const clients = {};
    const idMap = {};

    wss.on(`connection`, ws => {
      const headers = ws.upgradeReq.headers;
      const host = headers.host;
      const key = ws.upgradeReq.headers[`sec-websocket-key`];

      ctiServer.on(`responseMessage`, message => {
        clients[message.AgentId].send(JSON.stringify(message));
      });

      ws.on(`message`, message => {
        log.info(`Message received. Host: ${host}, Msg: ${message}`);
        if (JSON.parse(message).EventName === `Login`) {
          clients[JSON.parse(message).AgentId] = ws;
          idMap[key] = JSON.parse(message).AgentId;
        }
        ctiServer.processIncomingRequest(message);
      });

      ws.on(`close`, () => {
        log.info(`Connection closed. Host: ${host}`);
        const message = {
          EventName: `Logoff`,
          AgentId: idMap[key],
          EventData: {}
        };

      });
    });

2 个答案:

答案 0 :(得分:7)

  

默认情况下,Elastic Load Balancing将空闲超时值设置为60秒。因此,如果目标在请求处于运行状态时至少每60秒发送一些数据,则负载均衡器可以关闭前端连接。要确保文件上传等冗长的操作有时间完成,请在每个空闲超时周期结束前发送至少1个字节的数据,并根据需要增加空闲超时时间的长度。

     

https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#connection-idle-timeout

请注意,定期发送流量以保持连接处于活动状态,可以最好地满足您的兴趣。您可以在应用程序负载均衡器中将空闲超时设置为最多4000秒,但您会发现有状态的中间网络基础结构(防火墙,NAT设备)往往会在连接实际空闲这么久之前重置连接。

答案 1 :(得分:0)

PING!

编写ping实现(或nil消息实现)...

...否则AWS代理(可能是nginx)将在一段时间不活动后关闭连接(在您的情况下为60秒,但在不同的系统上它有点不同)。