2 분 소요

노션에 기록했던 내용을 다듬어 옮긴 내용입니다.

친구들과 함께 즐기는 서비스를 만들기 위해 실시간 통신이 필요하다.
같은 방에 있는 모든 사용자가 같은 화면을 볼 수 있어야 하기 때문이다.
어떤 실시간 통신 방식을 사용할까?

조사한 실시간 통신 방식 종류

  • 폴링 (polling)
  • 롱폴링 (long polling)
  • 웹소켓 (websocket)
  • SSE (Server Sent Event)

📘 서비스 내에 실시간 데이터 처리가 필요한 부분

다른 사용자가 방에 들어왔는가?
게임이 시작되었는가?
투표가 종료되었는가?
다음 라운드로 이동했는가?
최종 결과 확인 후 대기화면으로 돌아갔는가?

📘 논의

  • 웹소켓과 SSE는 고려 ❌

    • 0.1초 때문에 문제가 생기는 서비스가 아니기 때문에 완벽한 실시간성을 보장하지 않아도 된다.
    • 러닝 커브가 존재하며, 사용해보지 않은 기술을 무작정 도입하는 건 리소스가 크다.

📘 폴링 vs 롱폴링

폴링 : 지속적으로 서버에 요청을 보내 변경을 확인하는 방식

롱폴링 : 요청을 대기시켰다가 이벤트 발생 시 응답을 보내는 방식


폴링은 단순하게 fetch 요청을 계속 보내서 데이터가 변경되었는지 확인하는 방식이다.

하나를 예시로 들면, 현재 방에 접속한 사용자가 누구인지 계속 요청을 보내 확인하는 것이다.

다른 사용자가 접속하면 추가된 유저 정보를 서버에서 넘겨줘 실시간으로 화면이 업데이트되는 것이다.


이와 달리, 롱폴링은 요청을 보내면 서버가 그 요청을 대기시킨다.

다른 사용자가 들어왔다는 이벤트가 서버에 들어오면 해당 요청에 대한 응답을 보내는 것이다.

요청이 끝나면 커넥션을 해제하며, 응답이 오래 걸리면 Timeout 되었다가 다시 요청을 보낸다.

폴링에 비해 네트워크 요청은 줄어들지만, 커넥션을 유지하기 때문에 서버 리소스가 크다.

폴링 롱폴링

📘 폴링 서버 부하 테스트

  • 서버에 너무 많은 요청이 발생할 것 같아 롱폴링을 고려하다가 폴링으로 선택
  • 실제로 폴링 방식이 서버에 과부하를 주는지 백엔드 팀원과 함께 테스트 진행
  • 방의 최대 인원인 12명의 트래픽을 생성하고 2분간 게임을 진행한 결과, 약 1.6% CPU 사용량 차지
  • 1초를 주기로 요청했을 때 CPU 80% 점유율을 기준으로 약 600명 동시 접속 가능성 측정
  • 문제가 생기는지만 확인하기 위한 테스트이므로, 정확한 성능 테스트는 추후 서버측에서 진행할 예정
폴링 부하 테스트 화면 EC2 대시보드

폴링 부하 테스트 영상 링크

✅ 결론

폴링으로 실시간 통신 방식을 구현한다.
추후에 서버 부하가 커질 경우 개선을 고민한다.

🚨 사용자가 많아지면 서버 부하가 커질 것 같은데, 그땐 어떻게 개선할 생각인가?

단기적으로는 데이터가 변경된 경우에만 응답값을 주도록 개선할 수 있고, 장기적으로는 웹소켓을 도입하여 실시간 통신을 효율적으로 관리할 수 있다.

일반적인 폴링 방식은 데이터가 변경되지 않았음에도 동일한 데이터를 계속 전송하여 네트워크 비용이 증가하며, 불필요한 요청과 응답으로 서버 리소스가 낭비된다.

이를 단기적으로는 데이터 변경 여부를 확인하여 변경된 경우에만 응답값을 주도록 개선할 수 있다.

예를 들어, 클라이언트가 요청할 때 Last-Modified 헤더를 포함하여 전송하고, 서버는 데이터가 변경되지 않았을 경우 304 Not Modified 상태 코드로 응답하여 개선할 수 있을 것이다.

장기적으로는 웹소켓을 도입하여 해결할 수 있는데, 웹소켓은 서버와 클라이언트 간에 양방향 프로토콜이므로, 데이터가 변경되었을 때만 서버에서 클라이언트로 데이터를 푸시할 수 있다. 또한, HTTP의 헤더 오버헤드 없이 작은 패킷 크기로 데이터 전송이 가능하여 payload 크기를 줄일 수 있다.

이를 통해 불필요한 네트워크 비용을 줄이며 서버 리소스 낭비를 개선할 수 있다.

📘 reference

댓글남기기