그런 생각을 했다.
이중화된 서버에 Socket 통신을 하면 요청 전달의 오류가 있진 않을까?
예를 들어, Socket.connect()로 HTTP 요청이 일어났다. 그리고 LoadBalancer가 Tomcat1로 전달한다.
이후, Socket.publish()로 메시지를 발행했다. 그리고 LoadBalancer가 Tomcat2로 전달한다
이러한 발상에 로드밸런서 측에 stickySession을 적용해야하는 게 아닌가 싶었으나, 조금 더 파해친 결과 해당 생각의 오류가 있었다.
1. Socket.connect() 호출 시
- socket.connect()가 호출되면, WebSocket 연결이 설정된다. 이 시점에는 HTTP 통신이 이루져 Gateway에서 로드밸런싱이 일어날 것이다.
- 초기 'connect()' 시점에 HTTP요청이 서버에 전송 된 후, 서버가 '101 Switching Protocols' 응답을 반환하고 이후 클라이어간의 연결이 WebSocket으로 전환된다.
- 결론적으로 HTTP통신이 아닌 WebSocket 프로토콜을 통한 양방향 통신이 이루어지게 된다
2. socket.publish() 호출 시
- socket.publish()와 같은 메소드는 이미 설정된 WebSocket 연결을 통해 데이터를 전송한다
- 이 시점에는 HTTP 통신이 아니라, WebSocket 프로토콜을 사용하여 데이터를 서버로 직접 전송한다
- 다시 말해, Gateway나 로드 밸런서를 다시 통과하지 않고 직접적인 양방향 통신 채널을 유지하고 사용한다.
즉, 추가적인 라우팅이나 중계과정없이 바로 해당 서버로 데이터가 전달된다.
WebSocket이 지원이 안 되어 SocketJS가 지원하는 HTTP 폴백 메커니즘이 이용된다면?
다음의 시나리오가 충분히 우려되는 상황인지, 해결방법으로 무엇이 적합한지 더 알아봐야 한다
- 클라이언트가 WebSocket 연결을 시도했으나, WebSocket 지원이 되지 않아 폴백 매커니즘(ex. HTTP 롱 풀링)을 사용하기로 했다
- Client가 server에 Message를 보냈다
- Server1이 해당 Client에게 응답을 보낼 것이 생겼다
- Client는 자신에게 응답이 있는지 없는지 Server에게 주기적으로 요청(HTTP)을 보낸다
- 4번의 HTTP요청에 대하여, 로드밸런서는 Server1이 아닌 Server2에게 전달한다