• 문제 발생: 서버 부하를 효율적으로 관리하기 위해 로드밸런서를 도입하고 Redis 어댑터를 설정했음에도, Socket 연결이 불안정한 문제가 발생했습니다.

  • 원인: Socket.IO의 기본 전송 방식은 polling으로 설정되어 있습니다. polling은 주기적으로 HTTP 요청을 보내어 연결을 유지하지만, 분산된 환경에서는 요청이 다른 서버로 전달될 경우 소켓 연결이 끊어질 수 있습니다.

    스크린샷 2024-08-24 오전 1.42.36.png

    위 사진에서 볼 수 있듯이, 지속적으로 요청이 전송되지만 연결이 이루어지지 않는 문제가 발생했습니다.

  • 해결 방법: 이 문제를 해결하기 위해 Socket.IO의 전송 방식을 websocket으로 설정하여, 초기 연결이 이루어진 서버에서 지속적으로 통신이 유지되도록 했습니다.

    웹소켓 게이트웨이 설정

    웹소켓 게이트웨이 설정

    위 설정을 통해 분산 환경에서도 일정한 서버와의 소켓 연결을 유지하고, 연결 유실을 방지할 수 있었습니다.

    클라이언트 설정

    클라이언트 설정

    이를 통해 클라이언트도 안정적인 소켓 연결을 유지할 수 있었습니다.

  • 해결 방법 2:
    로드밸런서의 Sticky Session 기능을 사용하여 동일한 클라이언트의 소켓 연결이 항상 동일한 서버로 라우팅되도록 설정하는 방법도 고려할 수 있습니다. 이렇게 하면, 클라이언트가 1번 서버에서 세션을 생성한 경우, 이후 모든 요청이 1번 서버로만 전달되므로 polling 방식을 사용할 때도 소켓 연결이 유실되지 않게 됩니다.