10

我有一个节点服务器在 EC2 实例上运行,客户端也在同一个 EC2 实例上运行,客户端打开 websocket 连接以通信节点服务器,它在 QA 和开发 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));
});
    
    

节点服务器代码如下:

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: {}
    };
        
 });
});
4

2 回答 2

16

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

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

请注意,通过定期发送流量以保持连接处于活动状态,最能满足您的兴趣。您可以在 Application Load Balancer 中将空闲超时设置为最多 4000 秒,但您会发现有状态的中间网络基础设施(防火墙、NAT 设备)往往会在连接真正空闲这么长时间之前重置连接。

于 2018-02-13T10:40:47.430 回答
2

平!

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

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

于 2018-02-13T04:29:55.200 回答