> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/persistence.md).

# 영속성

24/7 항상 온라인 배포로 지속형 월드를 관리하는 방법을 알아보세요 on [전용 플릿](/docs.edgegap.com-ko/learn/orchestration/private-fleets.md).

많은 장르(MMO, 샌드박스, 소셜 게임)는 지속형 월드를 활용해 플레이어가 다음을 할 수 있게 합니다:

* 새로운 친구를 만나고 어울리며, 유기적인 플레이어 커뮤니티를 육성하고,
* 플레이어가 배치한 사용자 생성 콘텐츠로 가득한 살아 있는 오픈 월드를 탐험하고,
* 대규모 그룹이나 길드 전체와 함께 수시간 동안 이어지는 장대한 레이드 전투에 참여합니다.

전략을 살펴보세요 **최상의 플레이어 경험을 제공하고, 비용을 통제하며, 장애나 롤백으로 인한 플레이어의 불만을 줄이기 위해**. 게임 개발자가 쉽게 사용할 수 있도록 패키징된 엣지 컴퓨팅의 장점을 도입해 기존 서버 모델을 강화하세요.

{% hint style="success" %}
&#x20;또는 다음을 참조하세요 [배포](/docs.edgegap.com-ko/learn/orchestration/deployments.md#match-bound) 부분 vCPU 가격 책정을 활용하는 클라우드 오케스트레이션.
{% endhint %}

## ✔️ 준비

중단 없이 24/7 항상 온라인 지속형 배포를 가능하게 하려면:

* [우리 API로 새 App Version을 만들거나(또는 기존 것을 업데이트)](/docs.edgegap.com-ko/docs/api/versioning.md#post-v1-app-app_name-version),
  * 지정하세요 `"max_duration": -1`  를 사용하여 24시간 후 자동 종료를 방지하고,
* 사용하세요 [private fleet deploy API](/docs.edgegap.com-ko/docs/api/dedicated-servers.md#post-private-fleets-deploy) 를 시작하려면 [대기 서버](/docs.edgegap.com-ko/learn/orchestration/deployments.md#regional-standby) 와 함께 [영속성](/docs.edgegap.com-ko/learn/orchestration/persistence.md).
  * 가상 머신(성능) 또는 베어메탈(오버드라이브) 사양 중에서 선택하세요.

{% hint style="warning" %}
**서버 확장과** [**종료 프로세스를 테스트하여**](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-5.-deployment-stopped) **비용 제어의 신뢰성을 검증하세요. 메모리에 저장된 서버 상태는 배포가 중지되면 손실됩니다. 다음을 참조하세요** [#configuration-and-state](#configuration-and-state "mention").
{% endhint %}

{% hint style="info" %}
도움이 필요하시면 [디스코드를 통해 문의해 주세요](https://discord.gg/MmJf8fWjnt). 실시간 게임 지원은 저희의 [티켓 시스템](https://edgegap.atlassian.net/servicedesk/customer/portal/3).
{% endhint %}

## 🔑 서버 소유권

엣지 컴퓨팅 요소가 더해진 현대적 및 전통적 소유권 모델의 장단점을 살펴보세요.

### 스튜디오 호스팅

서버 호스팅은 전통적으로 스튜디오가 관리하며, 게임 수익으로 호스팅 비용을 충당합니다.

👍 **장점**

* 투명한 제품 가격 책정 - 호스팅 비용은 플레이어의 라이선스/구독으로 충당됩니다,
* 클라이언트, 서비스, 스케일링이 느슨하게 결합된 뛰어난 클라이언트/서버 호환성,
* 서버의 폐쇄형 소스 특성으로 인해 치팅 및 리버스 엔지니어링에 더 강합니다.

👎 **단점**

* 커뮤니티 모딩 지원은 서버 무결성과 안정성을 보장하기 위해 제한됩니다.

### 커뮤니티 서버

플레이어가 직접 서버를 호스팅하고 비용을 부담하도록 하여 제3자 대여 서비스의 필요성을 없애세요. 최종 사용자 경험 품질에 대한 인사이트가 부족한 제3자 대신 스튜디오를 통해 수익을 흐르게 하세요.

👍 **장점**

* 선별된 모드된 목록을 통한 향상된 모딩 지원 [앱 및 버전](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md),
* 커뮤니티와의 더 긴밀한 협업으로 인한 플레이어 피드백 루프 개선,
* 플레이어가 호스팅 비용을 부담하므로 재정적 위험 감소.

👎 **단점**

* 스튜디오의 운영 증가 - 플레이어 요청 조율 및 결제 수금,
* 모드된 버전 수 증가로 인한 클라이언트/서버 호환성 약화,
* 분산된 코드베이스와 리버스 엔지니어링 가능성 때문에 치터에 취약합니다.

## 🥛 용량 및 스케일링

서버 가용성, 호스팅 비용, 서비스 품질을 최적화하는 고급 기법을 알아보세요.

### 용량

**배포는 활성 플레이어 연결을 추적하거나 관리하지 않습니다** 이후 [/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-1.-start-a-deployment](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-1.-start-a-deployment "mention") 어떤 설계든 구현할 수 있도록 절대적인 제어권과 자유를 제공합니다.

서버가 다음을 충족하도록 용량 관리를 구현하세요:

* 비용 절감 극대화 - [벤치마크하고](/docs.edgegap.com-ko/learn/orchestration/deployments.md#container-metrics) 서버 리소스를 효율적으로 활용하며,
* 원활한 게임 플레이 제공 - 너무 많은 동시 플레이어로 서버가 과부하되는 것을 방지하고,
* 충돌로 인한 악평을 방지 - 예기치 않은 예외를 포착하고 처리합니다.

효율적인 서버 용량 관리를 보장하려면:

* 플레이어 슬롯을 해제하세요, 만약 [게임 서버에 매칭된 플레이어가](/docs.edgegap.com-ko/learn/matchmaking/matchmaker-in-depth.md#player-tickets) 몇 초 내에 연결하지 않으면,
* 활동을 추적하기 위해 클라이언트에서 서버로 최소한의 하트비트 메시지를 자주 보내고,
* 몇 초 동안 활동이 감지되지 않으면 클라이언트를 연결 해제하고 플레이어 슬롯을 해제하며,
* 용량이 가득 차고 사용 가능한 플레이어 슬롯이 없는 서버에 플레이어가 추가되는 것을 방지합니다.

{% hint style="success" %}
참조 [서버 브라우저](/docs.edgegap.com-ko/learn/server-browser.md) 우리의 관리형 서비스를 통한 자동 용량 처리용.
{% endhint %}

{% hint style="warning" %}
**예약된 배포 리소스의 양은 런타임 동안 변경할 수 없습니다.** 조정된을 활용하는 새로운 서버 인스턴스로 수평 확장 [애플리케이션 버전](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md) 더 많은 CPU 또는 메모리 리소스를 요구합니다.
{% endhint %}

### 확장

**지속형 서버의 확장은 "대충 짐작"할 필요가 없습니다** 지역 트래픽 또는 서버 비용. 용량을 예약하세요 [전용 플릿](/docs.edgegap.com-ko/learn/orchestration/private-fleets.md) 용량을 저수위용으로[^1] 예상치 못한 피크 시에는 자동으로 클라우드로 오버플로우하세요.

{% hint style="success" %}
**활성화** [**앱 버전에서 활성 캐싱**](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md#active-caching) **몇 초 내에 서버를 배포하려면.**
{% endhint %}

서버 확장 전략을 구현하여:

* 남용을 신중하게 방지하면서 대규모 호스팅을 가능하게 하고,
* 비어 있는 대기 서버로 인한 낭비 서버 비용을 최소화하고,
* 증가한 플레이어 수요에 신속히 대응하여 긴 대기 시간을 방지하세요.

<figure><img src="/files/25d8be1eebb57b6af17b7f4fd61e434deb0cc0e3" alt=""><figcaption><p>자동 확장 참조 아키텍처</p></figcaption></figure>

#### 통합 핵심 포인트

1. 클라이언트는 Scaling Authority와 통합합니다 - [매치메이킹](/docs.edgegap.com-ko/learn/matchmaking.md), [서버 브라우저](/docs.edgegap.com-ko/learn/server-browser.md)또는 맞춤형 솔루션.
   1. 다른 플레이어를 찾고, 실행 중인 서버에서 용량을 예약하거나, 필요하면 새 서버를 요청하세요.
2. Scaling Authority는 실행 중인 서버를 할당하거나 플레이어에게 서비스를 제공하기 위해 새 서버를 시작합니다.
3. 서버는 서버 시작/중지 및 플레이어 연결 변경 사항을 Scaling Authority에 실시간으로 알립니다.
   1. Scaling Authority는 응답하지 않는(충돌한) 서버의 오래된 기록을 삭제(만료)합니다.
4. 클라이언트는 서버에 직접 연결하여 게임 세션을 수립하고, 게임 플레이를 진행합니다.

**물리적 부하 대신 연결 수를 기준으로 확장하는 것을 강력히 권장합니다** (CPU 및 RAM), 물리적 부하의 순간적 변동은 예측 불가능한 가용성을 초래할 수 있기 때문입니다.

{% hint style="warning" %}
**예약된 배포 리소스의 양은 런타임 동안 변경할 수 없습니다.** 조정된을 활용하는 새로운 서버 인스턴스로 수평 확장 [애플리케이션 버전](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md) 더 많은 CPU 또는 메모리 리소스를 요구합니다.
{% endhint %}

### 축소

효율적인 축소 정책은 비용 최적화의 핵심이지만, [서버를 종료하는 것](/docs.edgegap.com-ko/docs/api/dedicated-servers.md#v1-self-stop-request_id-access_point_id) 을 신중하지 않게 수행하면 플레이어 경험에 부정적인 영향을 줄 수 있습니다. **출시 전에 다음 요소를 고려하고 변경 사항을 테스트하세요:**

**플레이어 활동 / 연결 해제 감지가 신뢰할 수 있나요?**

* 입력 부재가 플레이어 비활동을 신뢰성 있게 나타내나요? 플레이어는 대기 시간을 피하기 위해 봇, 매크로, 기타 기법을 사용해 활동을 가장하고 활성 연결을 유지하는 경우가 많습니다.
* 활성 플레이어가 자주 수행하며, 가장하기 어려운 행동이 있나요?
* 봇이나 매크로 사용이 문제인가요, 아니면 다음에서 기능인가요 [#studio-hosting](#studio-hosting "mention") 서버에서?

**서버를 끄는 것이 쉽고 빠르게 되돌릴 수 있나요(다시 확장)?**

* 도달하면 [/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-3.-deployment-ready](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-3.-deployment-ready "mention")서버는 엔진 초기화와 [#state-management](#state-management "mention") (상태 복원)을 수행하기 위해 추가 시간이 필요할 수 있습니다. 게임 서비스와 관련하여 컴퓨트 또는 데이터 전송에 추가 비용이 발생하나요? 이 대기 시간이 플레이어 경험에 영향을 미치나요?
* 로딩 장면, 미니게임, 로비 또는 다른 수단을 통해 서버 로딩을 숨길 수 있나요?

**플레이어가 특정 서버 인스턴스에 묶여 있나요, 아니면 쉽게 이동할 수 있나요?**

* 다른 서버에 연결하는 것이 플레이어의 계정, 구매 내역, 소셜 경험, 진행도, 인벤토리 및 기타 게임플레이 측면에 어떤 영향을 미치나요?
* 검토하세요 [#recovery-objectives](#recovery-objectives "mention") 그리고 중요한 데이터가 손실되지 않도록 하세요.
* 중요 데이터 복원을 위한 자동화된 방법이나 플레이어 도구를 구현하세요.
* 인간 지원을 제공하고 장애 및 문제에 대해 커뮤니티와 소통하세요.

## 🔎 발견 가능성

새 플레이어의 접속을 허용하는 활성 서버를 찾으려면 하나 이상의 검색 방법을 구현하세요:

* 플레이어가 서버를 둘러보고 목록에서 선택할 수 있게 하세요 [서버 브라우저](/docs.edgegap.com-ko/learn/server-browser.md).
* 충분한 플레이어가 참여하면 새 게임 시작 [매치메이킹](/docs.edgegap.com-ko/learn/matchmaking.md).
  * 플레이어를 추가하여 [기존 매치에서 나간 사람을 백필로 대체](/docs.edgegap.com-ko/learn/matchmaking/matchmaker-in-depth.md#backfill).
* [서버를 찾기 위해 사용자 지정 또는 서드파티 게임 백엔드를 구현](/docs.edgegap.com-ko/learn/advanced-features/managed-clusters.md#nakama-by-heroic-labs).

## 💭 구성 및 상태

초기 서버 요구 사항을 정의하고 플레이어 및 서버 상태를 관리하는 서비스들을 통합하세요.

### 구성 관리

구성은 **배포 중 서버에 전달되는 초기 데이터를 의미합니다:**

* [환경별 주입 변수](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md#other-parameters-optional):
  * 예: 클라이언트/서버 버전 호환성 데이터,
* [서버 위치](/docs.edgegap.com-ko/learn/orchestration/deployments.md#arbitrium_deployment_location-detailed-information-about-deployment-location), [서버 포트](/docs.edgegap.com-ko/learn/orchestration/deployments.md#arbitrium_ports_mapping-detailed-information-about-your-internal-and-external-ports) 및 [기타 서버 정보](/docs.edgegap.com-ko/learn/orchestration/deployments.md#injected-environment-variables),
* [매치메이킹 정보](/docs.edgegap.com-ko/learn/matchmaking/matchmaker-in-depth.md#injected-environment-variables) 또는 [사용자 지정 배포 변수](/docs.edgegap.com-ko/learn/orchestration/deployments.md#custom-variables),
* 서드파티 통합 파라미터, 키, 시크릿.

{% hint style="info" %}
**구성은 변경 불가합니다** - 서버를 시작한 후 한 번만 읽히며 이후에는 변경되지 않습니다.
{% endhint %}

### 상태 관리

상태는 다음을 설명하는 데이터입니다 **이전 플레이어 행동과 서버 이벤트의 연속된 결과:**

* 플레이어 연결, 플레이어가 제어하는 상태 변경(예: [Pawn](https://dev.epicgames.com/documentation/en-us/unreal-engine/pawn-in-unreal-engine)),
* 레벨/씬에 포함된 오브젝트와 관련된 변경(예: [Actor](https://dev.epicgames.com/documentation/en-us/unreal-engine/actors-in-unreal-engine), [Game Object](https://docs.unity3d.com/6000.0/Documentation/Manual/GameObjects.html)),
* 다음과 관련된 변경 [게임 모드](https://dev.epicgames.com/documentation/en-us/unreal-engine/game-mode-and-game-state-in-unreal-engine#gamemodes), [게임 상태](https://dev.epicgames.com/documentation/en-us/unreal-engine/game-mode-and-game-state-in-unreal-engine#gamestate), 또는 [게임 씬](https://docs.unity3d.com/6000.0/Documentation/Manual/CreatingScenes.html) 정보.

{% hint style="info" %}
**상태 데이터는 자주 변경됩니다.** 클라이언트는 서버 권한에 의해 관련 정보만 선택적으로 업데이트됩니다.
{% endhint %}

{% hint style="success" %}
**데이터 손실을 방지하기 위해 상태 백업을 자주 수행하세요** 예기치 않은 클라이언트 또는 서버 문제 발생 시:

* 서드파티 서비스를 사용하여 비동기적으로 실시간으로, 예: [Heroic Labs의 Nakama](/docs.edgegap.com-ko/learn/advanced-features/managed-clusters.md#nakama-by-heroic-labs),
* 클라이언트/서버 시작 또는 종료 시, 직렬화 해제된 상태 파일로 [클라우드 오브젝트 스토리지](https://www.linode.com/products/object-storage/).
  {% endhint %}

게임 오브젝트는 일반적으로 이를 제어하는 소유자를 지정하며, 이는 서버 또는 플레이어일 수 있습니다.&#x20;

#### 서버 소유 오브젝트

서버 소유 오브젝트는 서버만 조작할 수 있습니다. 연결된 플레이어는 서버 소유 오브젝트에 대해 제한된 읽기 권한만 가집니다. 서버 소유 오브젝트는 보통 다른 서버와 공유되지 않습니다.

{% hint style="success" %}
서버 소유 오브젝트는 **예상치 못한 서버 충돌 시 대체 서버에 의해 로드될 수 있습니다**. 다음을 사용하세요 [배포 ID](/docs.edgegap.com-ko/learn/orchestration/deployments.md#basic-information) 를 사용하여 처음 실행될 때 새 저장 파일을 식별하고 서버 소유 오브젝트 상태를 저장하세요.
{% endhint %}

#### 플레이어 소유 오브젝트

플레이어 소유 오브젝트는 플레이어와 서버 모두가 조작할 수 있습니다. 지속형 오브젝트의 소유권을 플레이어에게 할당하면 나중에 다른 서버로의 마이그레이션이 더 쉬워집니다.

{% hint style="success" %}
**플레이어 소유 오브젝트의 상태를 플레이어 기기 또는 게임 백엔드에 백업하세요** 플레이 세션 사이에.
{% endhint %}

{% hint style="info" %}
서버 권한으로 변경 사항을 검증하여 치팅을 방지하세요. 권한과 소유권은 분리될 수 있습니다.
{% endhint %}

### 복구 목표

문제가 발생할 경우 일부 데이터 범주는 데이터 손실에 더 민감할 수 있습니다. 예를 들어:

* 계정, 구독, 구매 및 마이크로트랜잭션 데이터 - **중요**,
* 진행도, 업적, 리더보드 및 인벤토리 데이터 - **중요**,
* 치트 감지, 모더레이션, 성능 및 오류 추적 데이터 - **중요**,
* 플레이어 행동, 소셜, 채팅 데이터 - **낮은 중요도**.

{% hint style="success" %}
**독립적인 거래 내역 소스에서 구매 복원을 구현하세요** 최상의 경험을 위해.
{% endhint %}

팀 내에서 다음 사항을 논의하는 것을 강력히 권장합니다:

* 게임 클라이언트와 서버에서 처리되는 데이터 범주,
* 각 범주의 비즈니스와 플레이어에게 대한 중요도와 민감도,
* 복구 지점 목표(RPO) - 심각한 피해가 발생하기 전에 허용되는 데이터 손실량,
* 복구 시간 목표(RTO) - 심각한 피해가 발생하기 전에 허용되는 다운타임 시간.

{% hint style="danger" %}
**서버 충돌은 귀하의** [**프로세스 재시작 정책에 따라 처리됩니다**](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md#safety-guardrails)**.** [서버 상태가 손실될 수 있습니다](/docs.edgegap.com-ko/learn/orchestration/persistence.md#state-management).
{% endhint %}

## 👀 가시성

장시간 실행되는 지속형 서버는 모니터링, 로깅, 버그 추적에서 특히 이상 징후를 탐지하는 새로운 관측 가능성 과제를 가져옵니다.

우리는 **서버 재시작 알림을 구현할 것을 강력히 권장합니다** 문제에 대한 가시성을 높이기 위해.

우리의 [엔드포인트 저장소](/docs.edgegap.com-ko/docs/endpoint-storage.md) **로그 통합** **은 로그만 전송합니다** **이후** [/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-5.-deployment-stopped](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#id-5.-deployment-stopped "mention")에 사용자 지정 로그와 버그 추적(예: [Sentry](https://sentry.io/welcome/))을 추가하여 부분 장애와 버그를 해결하세요.

{% hint style="success" %}
예약을 고려하세요 [전용 플릿](/docs.edgegap.com-ko/learn/orchestration/private-fleets.md) 예측 가능한 트래픽 패턴을 가진 게임을 위한 대기 용량.
{% endhint %}

[^1]: 하루 중 가장 낮은 CCU에
