-
누구나 동시에 조작할 수 있는 백만 개의 체스보드를 제공하는 실험적 웹사이트 One Million Chessboards
-
한 사람이 말을 움직이면 모든 사용자에게 실시간 반영되며, 턴 없이 자유롭게 보드 간 이동도 가능함
- 모든 체스판 상태는 64밀리언 uint64로 구성된 2차원 메모리 배열로 저장되며, 서버는 단 하나임
-
Go 언어로 작성된 첫 프로젝트이며, WebSocket 기반의 zstd 압축된 Protobuf 메시지로 동기화가 이루어짐
-
낙관적 적용 + 롤백 방식의 클라이언트 로직 구현에만 일주일이 소요될 만큼 기술적으로 도전적인 프로젝트였음
One Million Chessboards
-
One Million Chessboards는 백만 개의 체스보드를 제공하고, 누구나 동시에 말을 움직일 수 있음
-
턴 기반이 아님, 한 사람이 말을 움직이면 모든 사용자에게 즉시 반영됨
-
보드 간 이동도 자유롭게 가능하며, 전례 없는 체험을 제공함
배경
기술적 구현 방식
- 이 프로젝트는 최근 작업한 것 중 가장 기술적으로 도전적인 작업이었음
- 주요 기술 개요:
-
확장성 고려한 설계
-
단일 서버에서 구동
-
전체 체스보드를 메모리 내 2차원 uint64 배열로 구성 (총 64밀리언 셀)
-
Go 언어로 작성된 백엔드, 제작자의 첫 Go 프로젝트
-
단일 writer 스레드 + 다수의 reader 스레드, mutex로 접근 제어
-
클라이언트는 낙관적 업데이트 적용, 서버로부터 충돌 업데이트가 오면 롤백 처리
-
zstd 압축된 protobuf 메시지를 WebSocket으로 클라이언트에 전송
- 클라이언트는 50x50 존으로 구분, 인접 존의 움직임만 수신
-
전역 데이터(통계, 미니맵 등)는 HTTP GET으로 폴링, Cloudflare 캐시 활용
클라이언트 동작 방식의 핵심
-
낙관적 적용 + 롤백 방식(optimistic update with rollback) 은 약 1,600줄 코드로 구성, 7일간 전념하여 개발
“최근 들어 가장 어렵게 싸운 문제였음”
출시 후 반응
- 출시 8시간 만에 130만 건 이상의 말 이동 기록, 동시 사용자 약 400명
- 서버의 부하는 무시할 수준으로 낮음
현재 통계
-
온라인 플레이어 수 : 199,276명
-
총 움직임: 5,238,978회
-
말의 총 수: 1,490,061,914개
-
킹의 수: 9,035,389개
체스보드 통계
-
플레이어 수: 현재 온라인 플레이어는 199,276명임
-
당신의 캡처: 현재 캡처한 말의 수는 0임
-
당신의 움직임: 현재까지의 움직임 수는 0임
-
총 움직임: 전체 게임에서의 총 움직임 수는 5,238,978회임
-
말의 총 수: 체스보드에 있는 말의 총 수는 1,490,061,914개임
-
킹의 수: 체스보드에 있는 킹의 수는 9,035,389개임
-
당신의 색상: 당신은 검은색 말로 플레이 중임