비어있으면 잠들고 접속 시 깨는 마인크래프트 서버: 클라이언트가 포기할 때까지 TCP 로그인 유지하기
요약
이 시스템은 유휴 상태일 때 전력을 아끼는 마인크래프트 서버 호스팅 환경을 구축했습니다. 핵심은 엣지 프록시가 주기적인 로그인 질의를 보내 연결을 유지하고, 접속 시 버퍼링된 데이터를 재전송하여 즉각적인 응답성을 보장하는 것입니다.
핵심 포인트
- 엣지 프록시는 주기적 로그인 질의로 서버 연결 상태를 활성하게 유지합니다.
- 클라이언트 데이터는 엣지에 버퍼링되었다가 접속 시점에 재전송됩니다.
- 서버 목록 표시 및 라우트 변경 과정에서 안정성을 확보했습니다.
- 과부하(Floods) 방지 기능으로 서버 간의 속도 저하를 막습니다.
저는 아무도 플레이하지 않을 때는 모든 서버가 잠들고, 친구가 접속하면 다시 깨어나는 마인크래프트 서버 호스팅 시스템을 구축했습니다. 가장 어려웠던 부분은 접속 자체였으므로, 작동 방식에 대해 설명하겠습니다.
문제는 이렇습니다. '잠든(sleeping)' 상태에서 일시 중지된 서버는 약 2초 만에 재개됩니다. 하지만 부팅해야 하는 경우(최초 시작, 변경 사항 적용 후, 또는 스냅샷이 사라진 경우)에는 40~50초가 걸립니다. 마인크래프트 클라이언트는 아무런 응답이 없는 연결에 대해 30초 후에 포기합니다.
트릭은 이렇습니다. 모든 연결은 먼저 엣지 프록시(edge proxy)로 들어옵니다. 서버가 잠들어 있는 경우, 엣지는 로그인을 열어둔 상태를 유지하며 몇 초마다 로그인 질의(login query)를 보내서 살아있게 만듭니다. 1.13 버전 이후 모든 클라이언트는 이에 응답하며, 이는 서버가 작동하고 있다는 것으로 간주됩니다. 엣지는 이 답변들을 자체적으로 보관하고, 클라이언트가 전송한 나머지 모든 데이터를 버퍼링했다가, 플레이어가 방금 접속한 것처럼 서버에 재전송합니다.
다른 기능들
서버 목록에는 잠든 서버의 고유 메시지와 함께 회색 '잠듦(sleeping)' 표시줄이 나타나는데, 이는 기본 글꼴의 글리프 너비를 측정하여 목록의 305px 행 높이에 맞게 잘린 것입니다. 서버 목록에서 오는 핑(ping)은 서버를 미리 깨울 수 있게 해주며, 네트워크당 한 번만 요청할 수 있어 무작위 스캐너들이 계속해서 서버를 깨우는 것을 방지합니다. 라우트는 mc-router의 API를 통해 한 호스트 이름씩 변경되는데, 이는 라우트 파일을 다시 로드하면 재로드 도중에 도착하는 플레이어들을 떨어뜨리기 때문입니다. 과부하(Floods)는 엣지에서 서버별로 거부되므로, 하나의 바쁜 서버가 다른 모든 서버의 접속 속도를 느리게 만들지 않습니다.
이 시스템은 오픈 소스이며 (TypeScript, AGPL): github.com/cubepals/cubepals를 참조하십시오 (엣지는 apps/edge에 있습니다). 이 중 어떤 부분이라도 더 깊이 논의할 준비가 되어 있습니다. /u/v0id_user 님이 제출하셨습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 r/webdev (top/week)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기