2012년에 약속한 접속자 목록, 이제 나왔습니다
이 글의 내용
2012년 8월 25일, 이 블로그의 한 글이 통계 항목이 스스로 갱신되기 시작했다고 알리며 이런 문장으로 끝맺었습니다: "예정된 기능인 '누가 접속 중인가' 목록도 곧 나옵니다!"
그 글은 아직 여기 있습니다. 그 글이 알린 목록은 도착하는 데 열네 해가 걸렸습니다. 이제 존재하고, 그 글이 걸었던 카운터는 그 내내 돌아가고 있었습니다.
무엇을 보여 주는가
통계 페이지에 실시간 패널이 있습니다. 지금 이 순간 사이트에 몇 사람이 있는지, 그리고 그 가운데 가장 최근 사람들을 나열합니다. 접속한 나라, 알 수 있는 경우의 도시, 어느 페이지에 있는지, 마지막으로 보인 지 얼마나 지났는지. 한 번에 열두 명, 최신순입니다.
"지금 이 순간"은 지난 5분을 뜻합니다. 한 시간이 지나면 그 줄은 아예 지워집니다.
"누가"가 뜻하지 않는 것
그 목록의 누구도 신원이 밝혀지지 않습니다. 쿠키 없이 세기에 관한 글에 설명한 것과 같은 16바이트 일일 해시로 만들어지며, 어느 줄 뒤에도 이름도, 계정도, 쿠키도, 저장된 IP 주소도 없습니다.
또한 전체 주소가 아니라 페이지의 경로만 남깁니다. /shop/boots이지, 검색 엔진이나 소식지가 끝에 붙인 것까지 담은 전체 링크가 아닙니다.
그리고 같은 도시에서 같은 페이지를 보는 두 사람은 그저 두 줄입니다. 이 체계의 어떤 것도 두 독자와, 휴대전화와 노트북을 쓰는 한 독자를 구별하지 못합니다. 나중 판에서 정리할 빠뜨림이 아닙니다. 그것이 설계이고, 카운터가 다른 모든 곳에서 하는 것과 같은 맞바꿈입니다. 쓸모 있을 만큼은 되고, 누군가를 따라다닐 만큼은 되지 않습니다.
연결을 열어 두지 않고 실시간으로
이것을 짓는 현대적인 방법은 웹소켓이나 서버 전송 이벤트입니다. 브라우저가 연결 하나를 열어 두면 서버가 그리로 갱신을 밀어 넣습니다. 우아한 답이고, 여기서는 잘못된 답이었을 것입니다.
이 사이트의 웹 서버는 열린 연결마다 프로세스 하나를 씁니다. 그리고 그 실제 임무는 몇천 개 웹사이트를 위한 카운터 요청에 답하는 것입니다. 열린 채로 있는 연결은 다른 누구에게도 답하지 못하는 프로세스입니다. 쉰 사람이 자기 실시간 페이지를 보고 있다면, 몇 분마다 바뀌는 숫자 하나를 전하려고 쉰 개의 프로세스가 놀며 기다리는 셈입니다.
그래서 페이지가 대신 15초마다 물어보고 작은 JSON 덩어리를 가져옵니다. 그 둘레에는 간격보다 더 중요한 결정 셋이 있습니다:
- 요청이 실패하기 시작하면 1분에 한 번으로 물러납니다. 이미 힘들어하는 것이 분명한 서버를 두드려 대는 대신에 말입니다.
- 배경 탭에서는 아예 묻기를 멈추고, 탭이 앞으로 돌아오는 순간 갱신합니다. 숨은 탭을 보는 사람은 없고, 그 요청은 쓸모 있는 요청과 똑같은 값을 치릅니다.
- 화면의 N초 전에 갱신됨 줄은 1초마다 한 번씩 그 자리에서 올라가며, 비용은 전혀 없습니다. 데이터를 바꾸는 데에만 요청이 들지, 나이를 먹이는 데에는 들지 않습니다.
이 가운데 영리한 것은 없습니다. 분수에 맞을 뿐이고, 작은 서버에서는 그쪽이 둘 가운데 더 값진 성질입니다. 실시간 보기가 지켜보는 대상보다 운영비가 더 들어서는 안 됩니다.
돌아오지 않은 한 부분
2015년 9월에 한 글이 있었습니다. Users 탭이 페이지를 실제로 읽고 있는 사람과, 배경 탭에 열어 두고 잊은 사람을 구별하는 법을 배웠다는 내용입니다.
그 구별은 돌아오지 않았습니다. 지금 목록은 방문자가 마지막으로 언제 보였는지는 알지만, 보고 있는지는 모릅니다. 알 값어치가 분명히 있습니다. 어느 사이트든 "방문자"의 상당수는 버려진 탭이니까요. 그래서 만들 것 목록에 올라 있습니다.
부디 또 열네 해는 아니기를.
직접 보기
2012년의 글은 실시간 예시로 링크를 걸며 끝났고, 이 글도 그렇게 끝내는 편이 맞아 보입니다. 참고로 그 원래 링크는 아직 열립니다. 그 뒤의 카운터는 그 내내 돌아갔고 130만 방문을 넘겼습니다.
여기 실시간 예시가 있습니다. 보는 데 계정은 필요 없습니다.