실시간/채팅
채팅방 접속자 수는 서버가 어떻게 실시간으로 세고 있을까
채팅방이나 온라인 게임 로비 한쪽에 표시되는 현재 접속자 12명 같은 숫자는 단순해 보이지만, 이 숫자를 정확하게 유지하는 것은 생각보다 까다로운 문제입니다. 접속과 퇴장이 언제든지 발생할 수 있고, 사용자가 브라우저를 그냥 닫아버리는 경우처럼 서버에 알리지 않고 사라지는 상황도 흔하기 때문입니다.
가장 기본적인 방식은 웹소켓 연결을 기준으로 삼는 것입니다. 사용자가 채팅방에 들어오면 서버와의 연결이 새로 맺어지고, 서버는 이 연결을 해당 채팅방의 참가자 목록에 추가합니다. 반대로 사용자가 명시적으로 방을 나가거나, 연결이 끊어지는 이벤트가 발생하면 목록에서 제거하는 방식으로 실시간 인원수를 관리합니다.
문제는 사용자가 브라우저를 강제로 종료하거나 네트워크가 갑자기 끊기는 등, 서버에게 나 나갈게라고 알릴 기회 없이 연결이 사라지는 경우입니다. 이런 상황을 대비해 대부분의 실시간 시스템은 하트비트(heartbeat)라는 장치를 사용합니다. 클라이언트가 일정 주기마다 나 아직 여기 있어라는 짧은 신호를 서버에 보내고, 서버는 일정 시간 이상 이 신호가 오지 않는 연결을 자동으로 끊어진 것으로 간주해 접속자 목록에서 제거합니다.
여러 서버 인스턴스가 함께 운영되는 환경에서는 이 접속자 정보를 한 서버의 메모리에만 두면, 다른 서버에 접속한 사용자의 존재를 알 수 없다는 문제가 생깁니다. 이런 경우에는 Redis처럼 여러 서버가 공유할 수 있는 저장소에 접속자 정보를 함께 기록해, 어느 서버가 요청을 처리하든 전체 접속자 수를 정확히 집계할 수 있도록 설계합니다.
이 사이트의 실시간 채팅과 사다리타기 대기방 등은 웹소켓 연결과 하트비트를 함께 활용해, 실제로 활성 상태인 사용자만 정확히 집계해 화면에 반영하고 있습니다.
바로 직접 체험해보세요
🚀 실시간 채팅 사용해보기