원문: https://technology.riotgames.com/news/determinism-league-legends-introduction
번역: chatgpt 와 나 (영어4등급)
오역, 의역 있음. 댓글로 알려주시면 감사하겠습니다.

안녕하세요, 저는 Deterministic Disaster Recovery 팀의 엔지니어, Rick Hoskinson입니다. 저는 리그 오브 레전드에서 어떻게 시간을 되돌릴 수 있었는지에 대해 이야기하고자 합니다. 이 블로그 포스트 시리즈를 통해, 저희가 어떤 작업을 했는지와, 흥미진진했던(juicy) 기술적 도전들에 대해 설명드리고자 합니다. 첫 번째 포스트에서는 문제점과 저희가 이 문제점을 어떻게 해결했는지에 대해 설명하겠습니다.

이 시리즈의 포스트들:

PROJECT CHRONOBREAK

PROJECT CHRONOBREAK(프로젝트 크로노브레이크) 는 e스포츠 관계자들이 실시간 게임을 특정 시점으로 "되돌릴" 수 있게 하는 e스포츠 기능입니다. 이 기능은 가끔 발생하는 소프트웨어 버그나 예기치 못한 오류(event hiccup)로 인해 게임을 처음부터 전부 다시 시작해야 하는 상황에 대응하기 위해 개발되었습니다. 저희는 LoL 게임 서버를 deterministic 하게 만들어 기록된(recorded) 게임을 다시 시작하고 서버를 이전의 특정한 시점으로 복원할 수 있도록 이 기능을 구현했습니다.

THE ORIGINS OF SERVER DETERMINISM

리그 오브 레전드에서의 determinism은 프로젝트 크로노브레이크에서 영감을 받은 것이 아닙니다. determinism은 오히려 기록 가능한 입력값들을 바탕으로 빠르고 반복 가능한 테스트를 생성하고자 하고자 만들어졌습니다. 이 도구는 Delta Checker라고 불렸으며, Delta Checker가 신뢰성 있게 동작하기 위해서는 클라이언트-서버 determination이 필요했습니다.

FROM DELTA CHECKER TO CHRONOBREAK

2016년 4월경에, 작업 중이던 deterministic 서버 기술을 공유하다가 재밌는(interesting) 기회가 생겼습니다. 당시 리그 오브 레전드 e스포츠 기능 부서는 라이브 게임을 다시 시작해야 할 정도의 드문 버그가 발생했을 경우, 게임 중 발생한 참사(on-stage disaster)를 복구할 수 있는 방법을 찾고 있었습니다. 리그 오브 레전드 게임의 재시작은 누구에게도 좋은 경험이 아닙니다; 비로 인해 지연된 야구 경기를 첫 이닝부터 다시 하는 것과 같습니다. 이러한 재시작은 e스포츠 선수들과 팬들에게 실망감을 안겨주었고, 이에 대한 해결책을 찾는 것이 높은 우선순위였습니다.

determinism을 고려하기 전에, e스포츠 팀은 이미 게임 메모리의 save-state 스냅샷, Practical Tool 같은 것을 사용해 버그 발생 전의 게임 상태를 재현하는 방법, 실시간 게임보다 몇 분 늦게 게임을 진행하는 virtual machine을 활용하는 더욱 근본적인(radical) 해결책 등의 다양한 재시작 옵션을 고려했습니다. 하지만 이 모든 것들은 여러 문제에 부딪혔고, e스포츠 관계자들에게 게임 내에서 정확한 시간으로 복구할 수 있도록 하는 툴을 제공하는 데에 실패했습니다.

Delta Checker의 determinism 기능은 여러 팀의 엔지니어들을 모아 Deterministic Disaster Recovery라는 새로운 팀을 구성하게 했고, 이는 프로젝트 크로노브레이크의 내부 작업명이 되었습니다. 이 작업에는 다음이 필요했습니다:

  • 서버를 deterministic으로 만들기 위한 recording 기술, 시스템 변경, 검증 기술의 생성
  • 파이프라인된 test-and-fix 방법론을 통한 서버 determinism의 구현
  • e스포츠 관계자들이 게임을 다시 시작하는 데에 사용할 수 있는 도구의 생성

우리는 2016년 12월에, 2017년 봄 스플릿에 맞춰 최소한의 실행 가능한 프로덕트를 제공할 수 있었으며, 프로젝트 크로노브레이크는 LCS의 두 번째 주 C9 대 Fly Quest의 두 번째 게임에서 대포 미니언이 Altec의 미스 포츈 궁극기를 막아서 처음으로 사용되었습니다.

2017년 5월에, 더욱 강력한 GUI 기반 도구와 앞으로 수년간 기능이 작동하는 것을 보장하기 위한 통합(comprehensive) 자동화 테스트 시스템을 갖춘 버전 2.0을 완성했습니다.

ANATOMY OF A CHRONOBREAK

관계자들이 크로노브레이크를 사용하기 전에, 우리는 먼저 e스포츠 게임 서버를 구성하여 각 게임을 기록(record)해야 합니다. 이러한 기록들은 Server Network Recordings 또는 SNRs이라고 불리며 이는 e스포츠 게임 서버에서 플레이된 모든 게임의 모든 입력값, 매치 세팅, 설정을 말합니다.

이렇게 해두면 이러한 기록들을 사용하여 e스포츠 관계자가 선택한 시점으로 게임 서버를 되돌릴 수 있습니다. 이러한 playbacks는 서버를 nominal refresh rate로 throttling하지 않기 때문에 매우 빠르게 실행될 수 있습니다. 예를 들어, 40분으로의 복구는 3분 미만이 걸립니다.

우리는 버그가 발생한 서버 인스턴스를 특정한 명령어을 사용하여 종료함으로써 크로노브레이크에 "commit"합니다. 이 명령은 플레이어와 방송 관람객 모두를 disconnect 합니다. 그런 다음, 플레이어는 리그 클라이언트를 통해 새로운 서버 프로세스에 다시 연결할 수 있습니다.

전체 실행 흐름은 다음과 같습니다:

GOING DEEPER

지금까지 프로젝트의 기술적 세부 사항을 심층적으로 다루지는 않았지만, 다음 게시물에서는 우리가 리그 오브 레전드 코드베이스를 어떻게 deterministic하게 변환했는지에 대해 다룰 것입니다. 또한 저희는 이러한 노력의 결과로 개편된 주요한 게임 엔진 시스템 하나 이상에 대해 다룰 것입니다.

profile
소비자에서 생산자로

0개의 댓글