【问题标题】:nkzawa socket.io java client connection not upgrading to websocket when hitting haproxy(loadbalancer) in front of two socketio serversnkzawa socket.io java客户端连接在两个socketio服务器前命中haproxy(负载均衡器)时未升级到websocket
【发布时间】:2015-03-09 03:40:45
【问题描述】:

我在 haproxy 后面有两个 socketio 服务器,出于粘性的目的,我将 cookie 插入到 haproxy,以识别来自哪个服务器的响应。现在的问题是,当我使用下面的代码这样做时,我的连接没有升级到'websocket',我尝试调试问题并意识到'transport'事件仅在engineio套接字类的'setTransport'方法中发出,而不是在'createTransport'方法中,(简而言之,在探测'transport'事件期间不会发出,导致websocket握手请求在不同的socketio服务器上进行,而不是客户端已经使用xhrpolling连接的地方)。

我想知道是否有其他解决此问题的方法,或者问题是真实的。请帮忙。提前致谢。

链接到 - issue with code that i have tried

final StringBuffer buf = new StringBuffer();
socket.io().on(Manager.EVENT_TRANSPORT, new Emitter.Listener() {
    @Override
    public void call(Object... args) {
        final Transport transport = (Transport)args[0];

        if(transport.name.equalsIgnoreCase(WebSocket.NAME)){
            transport.once(Transport.EVENT_REQUEST_HEADERS, new Emitter.Listener() {
                @Override
                public void call(Object... args) {
                    @SuppressWarnings("unchecked")
                    Map<String, String> headers = (Map<String, String>)args[0];
                    if(buf.length()!=0){
                        headers.put("Cookie", buf.toString());
                    }
                }
            });
        }
        if(transport.name.equalsIgnoreCase(PollingXHR.NAME)){
            transport.once(Transport.EVENT_RESPONSE_HEADERS,
                    new Emitter.Listener() {
                        @Override
                        public void call(Object... args) {
                            @SuppressWarnings("unchecked")
                            Map<String, String> headers = (Map<String, String>) args[0];
                            String cookie = null;
                            if (headers.containsKey("Set-Cookie") && headers.get("Set-Cookie").contains("SERVERID")) {
                                cookie = headers.get("Set-Cookie").split(";")[0];
                            }
                            if (cookie != null) {
                                final String stickyCookie = cookie;
                                if(buf.length()==0){
                                    buf.append(stickyCookie);
                                }
                                transport.on(
                                        Transport.EVENT_REQUEST_HEADERS,
                                        new Emitter.Listener() {
                                            @Override
                                            public void call(Object... args) {
                                                @SuppressWarnings("unchecked")
                                                Map<String, String> headers = (Map<String, String>) args[0];
                                                // set header                                               
                                                headers.put("Cookie", stickyCookie);
                                            }
                                        });
                            }
                        }
                    });
        }            
    }
});

【问题讨论】:

  • 您应该在问题中包含您的代码,以防您链接的网站出现故障。
  • 确定 ... 添加完整的代码 .. :)

标签: java socket.io haproxy session.socket.io


【解决方案1】:

我现在找到了解决我的问题的方法,因为 haproxy 提供了另一种平衡算法“源”,它将来自同一“ip”的请求定向到同一服务器……因为它对请求的源进行哈希处理。这样我就不必使用上面的所有代码..(即,我不必对传输事件做任何事情)。 haproxy 负责处理一切...... :)

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 2015-09-12
    相关资源
    最近更新 更多