# 지속성

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

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

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

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

## ✔️ 준비

중단 없이 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 %}

## 🔑 서버 소유권

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

### 스튜디오 호스팅

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

👍 **장점**

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

👎 **단점**

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

### 커뮤니티 서버

플레이어가 직접 서버를 호스팅하고 비용을 부담하도록 하여 제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 %}

### 확장

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

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

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

<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), 물리적 부하의 순간적 변동은 예측 불가능한 가용성을 초래할 수 있기 때문입니다.

### 축소

효율적인 축소 정책은 비용 최적화의 핵심이지만, [서버를 종료하는 것](/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) - 심각한 피해가 발생하기 전에 허용되는 다운타임 시간.

## 👀 가시성

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

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

우리의 [엔드포인트 저장소](/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에


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/persistence.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
