【问题标题】:Closing SockJS connection关闭 SockJS 连接
【发布时间】:2023-09-13 19:57:01
【问题描述】:

我在SockJS servers 前面使用HAProxy 并且遇到SockJS 连接似乎无法正常关闭的问题。

我的 NodeJS 代码:

var sockjsSockets = {};


/**
 * SockJS Server
 */
var echo = sockjs.createServer({
    log: function (severity, message) {
        // Skip logging
    },
    disconnect_delay: 20
});
echo.on('connection', function (conn) {

    // Identify this connection
    sockjsSockets[conn.id] = conn;

    conn.on('data', function (message) {

        // Write...

    });
    conn.on('close', function () {

        try {
            delete sockjsSockets[conn.id];

            conn.close(); 
        } catch (er) {
            console.log("EXCEPTION CLOSE SOCKJS ::::::::>>>>>>> " + er.stack);
        }
    });
});

sockjsSockets 计数例如可以显示:400 但HAProxy 显示与NodeJS instance 的当前连接数为 3000 次

我在这里的关闭过程中遗漏了什么吗?

有什么想法可能是错的吗?

编辑

这是我的HAProxy 配置

global
      maxconn     400000
      ulimit-n    800019
      nbproc      1
      debug
      daemon
      log         127.0.0.1   local0 notice

  defaults
      mode        http
      option      httplog
      log         global
      stats       enable
      stats       refresh 60s
      stats uri   /stats
      maxconn     32768


  frontend  secured
      timeout     client 86400000

      mode http
      timeout client 120s

      option httpclose
      option forwardfor

      bind        0.0.0.0:443 ssl crt /etc/nginx/ssl/ssl-bundle.pem ciphers RC4-SHA:AES128-SHA:AES:!ADH:!aNULL:!DH:!EDH:!eNULL


      acl is_sockjs path_beg /echo /broadcast /close # this is sockjs
      use_backend sockjs if is_sockjs

【问题讨论】:

    标签: node.js haproxy sockjs


    【解决方案1】:

    SockJS 可以使用不同的协议,从 WebSockets 开始,到 Long Poll、AJAX 等等。每一个都有不同的保持联系的逻辑。

    在 WebSockets 的情况下,它是持久的 TCP 连接,如果它被关闭,那么它应该被关闭。虽然网络服务器仍然可以保持它作为代理的行为。

    要解决此类问题,您需要为您的 Web 服务器设置诸如保持活动、超时等,并找到解决方案以确保 HAProxy 尊重 node.js 关闭连接逻辑。

    【讨论】: