커리큘럼
home
React
home

로드밸런서 환경에서의 Socket 연결 (Transports : Polling → WebSocket 변경, StickySession) (1)

문제 발생: 서버 부하를 효율적으로 관리하기 위해 로드밸런서를 도입하고 Redis 어댑터를 설정했음에도, Socket 연결이 불안정한 문제가 발생했습니다.
원인: Socket.IO의 기본 전송 방식은 polling으로 설정되어 있습니다. polling은 주기적으로 HTTP 요청을 보내어 연결을 유지하지만, 분산된 환경에서는 요청이 다른 서버로 전달될 경우 소켓 연결이 끊어질 수 있습니다.
위 사진에서 볼 수 있듯이, 지속적으로 요청이 전송되지만 연결이 이루어지지 않는 문제가 발생했습니다.
해결 방법: 이 문제를 해결하기 위해 Socket.IO의 전송 방식을 websocket으로 설정하여, 초기 연결이 이루어진 서버에서 지속적으로 통신이 유지되도록 했습니다.
웹소켓 게이트웨이 설정
위 설정을 통해 분산 환경에서도 일정한 서버와의 소켓 연결을 유지하고, 연결 유실을 방지할 수 있었습니다.
클라이언트 설정
이를 통해 클라이언트도 안정적인 소켓 연결을 유지할 수 있었습니다.
해결 방법 2: 로드밸런서의 Sticky Session 기능을 사용하여 동일한 클라이언트의 소켓 연결이 항상 동일한 서버로 라우팅되도록 설정하는 방법도 고려할 수 있습니다. 이렇게 하면, 클라이언트가 1번 서버에서 세션을 생성한 경우, 이후 모든 요청이 1번 서버로만 전달되므로 polling 방식을 사용할 때도 소켓 연결이 유실되지 않게 됩니다.