백만 개의 체스보드

3 hours ago 1

  • 누구나 동시에 조작할 수 있는 백만 개의 체스보드를 제공하는 실험적 웹사이트 One Million Chessboards
  • 한 사람이 말을 움직이면 모든 사용자에게 실시간 반영되며, 턴 없이 자유롭게 보드 간 이동도 가능
  • 모든 체스판 상태는 64밀리언 uint64로 구성된 2차원 메모리 배열로 저장되며, 서버는 단 하나임
  • Go 언어로 작성된 첫 프로젝트이며, WebSocket 기반의 zstd 압축된 Protobuf 메시지로 동기화가 이루어짐
  • 낙관적 적용 + 롤백 방식의 클라이언트 로직 구현에만 일주일이 소요될 만큼 기술적으로 도전적인 프로젝트였음

One Million Chessboards

  • One Million Chessboards백만 개의 체스보드를 제공하고, 누구나 동시에 말을 움직일 수 있음
  • 턴 기반이 아님, 한 사람이 말을 움직이면 모든 사용자에게 즉시 반영
  • 보드 간 이동도 자유롭게 가능하며, 전례 없는 체험을 제공함

배경

  • 이전에 만든 One Million Checkboxes 프로젝트에 이은 실험적 작품으로, 더 큰 규모와 도전 과제를 목표로 함
  • 제작자는 이 프로젝트에 많은 시간을 투자했으며, 재미있게 즐겨주길 바람

기술적 구현 방식

  • 이 프로젝트는 최근 작업한 것 중 가장 기술적으로 도전적인 작업이었음
  • 주요 기술 개요:
    • 확장성 고려한 설계
    • 단일 서버에서 구동
    • 전체 체스보드를 메모리 내 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개임
  • 당신의 색상: 당신은 검은색 말로 플레이 중임

Read Entire Article