ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TroubleShooting - Socket Transports 설정
    TIL. 2024. 9. 3. 18:52

     

    서버 부하를 효율적으로 관리하기 위해 로드밸런서를 도입하고 Redis 어댑터를 설정했지만, 지속적으로 요청이 전송되면서도 연결은 이루어지지 않는 문제가 발생했습니다.

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

     

    Polling

    해당 문제를 해결하기 위해서 처음 요청이 이루어지는 서버와 지속적인 연결을 유지시켜야만 했습니다.

    공식 문서를 통해 전송 방식을 WebSocket 방식으로 바꿀 수 있음을 알게 되었습니다. 

     

    해결 방법 1 : Polling -> WebSocket 

    WebSocket

    웹소켓 방식은 클라이언트와 서버 간에 지속적인 연결을 유지하여, 데이터가 발생할 때마다 즉시 서버에서 클라이언트로 전송하는 양방향 통신 방식입니다. 즉 처음 요청 이후에도 연결 유실을 방지할 수 있습니다. 

     

    Socket.IO의 전송 방식을 websocket으로 설정하였습니다.

    클라이언트 설정

     

    위 설정을 통해 문제를 효과적으로 해결할 수 있었습니다.

     

    해결 방법 2 : Sticky Session 

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

     

    마무리 

    이번 문제를 해결하면서 분할 서버 환경에서 고려해야 할 다양한 상황들을 경험했습니다. 특히 Sticky Session은 이번에 새롭게 알게 된 기술로, 앞으로 필요한 프로젝트에 적용해 볼 수 있겠다는 생각이 듭니다.

Designed by Tistory.