# 지속성

항상 온라인으로 24/7 지속되는 배포로 영구적인 월드를 관리하는 방법을 알아보세요 [private-fleets](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/private-fleets "mention").

다양한 장르(MMO, 샌드박스, 소셜 게임)는 영구 월드를 활용하여 플레이어가 다음을 할 수 있게 합니다:

* 새로운 친구를 만나고 소셜 활동을 하며 유기적인 플레이어 커뮤니티를 육성하기 위해,
* 플레이어가 배치한 사용자 생성 콘텐츠로 가득한 살아있는 오픈 월드를 탐험하고,
* 대규모 그룹이나 전체 길드와 함께 몇 시간이나 지속되는 대규모 공격전(레이드)에 참여합니다.

다음 전략을 살펴보세요 **최상의 플레이어 경험을 제공하고 비용을 통제하며 정전이나 롤백으로 인한 플레이어의 좌절을 제거하세요**. 게임 개발자가 쉽게 사용할 수 있도록 패키지화된 엣지 컴퓨팅의 장점을 전통적인 서버 모델에 더하세요.

## ✔️ 준비

지속적이고 중단 없는 24/7 항상 온라인 배포를 활성화하려면:

* [API로 새 앱 버전을 생성(또는 기존 버전 업데이트)하세요](https://docs.edgegap.com/docs.edgegap.com-ko/docs/api/versioning#post-v1-app-app_name-version),
  * 지정하세요 `"max_duration": -1`  24시간 후 자동 종료를 방지하려면,
* )과 각 내부 포트에 대한 외부 포트가 할당됩니다. [프라이빗 플릿 배포 API](https://docs.edgegap.com/docs.edgegap.com-ko/docs/api/dedicated-servers#post-private-fleets-deploy) 시작하려면 [대기 서버](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#regional-standby) 사용: [persistence](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/persistence "mention").
  * 가상 머신(성능) 또는 베어 메탈(오버드라이브) 사양 중에서 선택하세요.

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

## 🔑 서버 소유권

엣지 컴퓨팅의 변형을 포함한 현대적 및 전통적 소유권 모델의 장단점을 살펴보세요.

### 스튜디오 호스팅

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

👍 **장점**

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

👎 **단점**

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

### 커뮤니티 서버

플레이어가 자체 서버를 호스팅하고 비용을 부담하도록 하여 제3자 임대 서비스의 필요를 제거하세요. 엔드 유저 경험 품질에 대한 통찰이 부족한 제3자 대신 수익을 스튜디오로 유입하세요.

👍 **장점**

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

👎 **단점**

* 플레이어 요청 중재 및 결제 수금 등 스튜디오의 운영 업무 증가,
* 모드된 버전 수 증가로 인한 약화된 클라이언트/서버 호환성,
* 분산된 코드베이스와 리버스 엔지니어링 가능성으로 치팅에 취약함.

## 🥛 용량 및 스케일링

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

### 용량

**배포는 활성 플레이어 연결을 추적하거나 관리하지 않습니다** 귀하가 [#id-1.-start-a-deployment](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#id-1.-start-a-deployment "mention") 모든 설계를 구현할 수 있는 절대적 제어와 자유를 제공하기 위해.

서버 용량 관리를 구현하여 서버가 다음을 보장하도록 하세요:

* 비용 절감 극대화 - [벤치마크](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#container-metrics) 및 서버 자원을 효율적으로 활용하세요,
* 원활한 게임 플레이 제공 - 동시에 너무 많은 플레이어로 서버 과부하를 방지하세요,
* 충돌로 인한 나쁜 리뷰를 방지 - 예기치 않은 예외를 포착하고 처리하세요.

효율적인 서버 용량 관리를 위해:

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

{% hint style="success" %}
보기 [Broken link](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/broken-reference "mention") 당사 관리 서비스로 자동 용량 처리를 위해.
{% endhint %}

### 스케일 업

**영구 서버의 스케일링은 지역 트래픽이나 서버 비용을 "어림짐작"할 필요가 없습니다** 지역 트래픽이나 서버 비용. 예비 예약하세요 [private-fleets](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/private-fleets "mention") 용량을 비수기[^1] 예상치 못한 급증 시 자동으로 클라우드로 오버플로우되도록 하세요.

다음의 서버 스케일링 전략을 구현하세요:

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

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FWVZEdEvyAcAROhqNYbKQ%2Fimage.png?alt=media&#x26;token=a26d6f3a-9071-41aa-b27f-ee96555f84a9" alt=""><figcaption><p>자동 스케일링 참조 아키텍처</p></figcaption></figure>

#### 통합 핵심 포인트

1. 클라이언트는 스케일링 권한(Scaling Authority)을 통합합니다 - [matchmaking](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking "mention"), [server-browser](https://docs.edgegap.com/docs.edgegap.com-ko/learn/server-browser "mention"), 또는 맞춤형 솔루션.
   1. 다른 플레이어를 발견하고 실행 중인 서버에서 용량을 예약하거나 필요하면 새 서버를 요청하세요.
2. 스케일링 권한은 실행 중인 서버를 할당하거나 플레이어를 위해 새 서버를 시작합니다.
3. 서버는 서버 시작/중지 및 플레이어 연결 변경에 대해 실시간으로 스케일링 권한에 알립니다.
   1. 스케일링 권한은 응답이 없는(충돌한) 서버의 오래된 레코드를 삭제(만료)합니다.
4. 클라이언트는 서버에 직접 연결하여 게임 세션을 설정하고 게임 플레이를 진행합니다.

**물리적 부하(CPU 및 RAM)의 일시적 변동이 예측 불가능한 가용성으로 이어질 수 있으므로 연결 수를 기준으로 스케일링하는 것을 강력히 권장합니다** (CPU 및 RAM), 순간적인 물리적 부하 변동이 예측 불가능한 가용성으로 이어질 수 있으므로.

### 스케일 다운

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

**플레이어 활동/연결 끊김 탐지가 신뢰할 수 있나요?**

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

**서버를 끄는 것이 쉽게 그리고 빠르게 되돌릴 수 있나요(다시 스케일 업 가능)?**

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

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

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

## 🔎 검색성

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

* 플레이어가 서버를 찾아보고 목록에서 선택하게 하려면 [server-browser](https://docs.edgegap.com/docs.edgegap.com-ko/learn/server-browser "mention").
* 충분한 플레이어가 모이면 새 게임을 시작하세요 [matchmaking](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking "mention").
  * 플레이어를 추가하여 [백필로 기존 매치의 이탈자를 교체하세요](https://docs.edgegap.com/docs.edgegap.com-ko/matchmaking/matchmaker-in-depth#backfill).
* [서버를 발견하기 위해 커스텀 또는 서드파티 게임 백엔드를 구현하세요](https://docs.edgegap.com/docs.edgegap.com-ko/advanced-features/managed-clusters#nakama-by-heroic-labs).

## 💭 구성 및 상태

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

### 구성 관리

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

* [환경별 주입 변수](https://docs.edgegap.com/docs.edgegap.com-ko/learn/application-and-versions#other-parameters-optional):
  * 예: 클라이언트/서버 버전 호환성 데이터,
* [서버 위치](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#arbitrium_deployment_location-detailed-information-about-deployment-location), [서버 포트](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#arbitrium_ports_mapping-detailed-information-about-your-internal-and-external-ports) 및 [기타 서버 정보](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#injected-environment-variables),
* [매치메이킹 정보](https://docs.edgegap.com/docs.edgegap.com-ko/matchmaking/matchmaker-in-depth#injected-environment-variables) 또는 [맞춤 배포 변수](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#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), [게임 오브젝트](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 [클라이언트/서버 시작 또는 종료 시, 역직렬화된 상태 파일로](https://docs.edgegap.com/docs.edgegap.com-ko/advanced-features/managed-clusters#nakama-by-heroic-labs),
* 클라우드 오브젝트 스토리지에 [게임 오브젝트는 일반적으로 그것을 제어하는 소유자를 지정하며, 이는 서버거나 플레이어일 수 있습니다.](https://www.linode.com/products/object-storage/).
  {% endhint %}

서버 소유 오브젝트&#x20;

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

서버 소유 오브젝트는

{% hint style="success" %}
예기치 않은 서버 충돌 시 교체 서버에 의해 로드될 수 있습니다 **. 사용하세요**배포 ID [처음 실행할 때 새 저장 파일을 식별하고 서버 소유 오브젝트 상태를 저장하려면.](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#basic-information) 플레이어 소유 오브젝트
{% endhint %}

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

플레이 세션 간 플레이어 소유 오브젝트의 상태를 플레이어 기기나 게임 백엔드에 백업하세요.

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

{% hint style="info" %}
복구 목표
{% endhint %}

### 문제가 발생할 경우 일부 데이터 카테고리는 데이터 손실에 더 민감할 수 있습니다. 예를 들면:

계정, 구독, 구매 및 마이크로트랜잭션 데이터 -

* 중요 **진행도, 업적, 리더보드 및 인벤토리 데이터 -**,
* 치트 탐지, 중재, 성능 및 오류 추적 데이터 - **중요합니다**,
* 플레이어 행동, 소셜, 채팅 데이터 - **중요합니다**,
* 중요도 낮음 **최상의 경험을 위해 독립 거래 내역 소스에서 구매 복원을 구현하세요.**.

{% hint style="success" %}
**다음 사항을 팀 내에서 논의할 것을 강력히 권장합니다:** 게임 클라이언트와 서버에서 처리되는 데이터 카테고리,
{% endhint %}

각 카테고리가 비즈니스와 플레이어에게 가지는 중요도와 민감도,

* 복구 지점 목표(RPO) - 심각한 손해가 발생하기 전에 허용되는 데이터 손실량,
* 복구 시간 목표(RTO) - 심각한 손해가 발생하기 전에 허용되는 다운타임.
* 장기간 실행되는 영구 서버는 모니터링, 로깅 및 버그 추적에서 이상을 감지하는 등 새로운 가시성(관찰성) 문제를 가져옵니다.
* 우리는

## 신호가 전송되어 배포가 중지됩니다.

서버 재시작에 대한 경고를 구현할 것을 강력히 권장합니다

문제에 대한 가시성을 높이기 위해. **로그 통합** 는 로그만 전송합니다

저희의 [endpoint-storage](https://docs.edgegap.com/docs.edgegap.com-ko/docs/endpoint-storage "mention") **후에** **부분적 실패와 버그를 해결하기 위해 맞춤 로그와 버그 추적(예:** **Sentry** [#id-5.-deployment-stopped](https://docs.edgegap.com/docs.edgegap.com-ko/learn/deployments#id-5.-deployment-stopped "mention"))를 추가하세요. [예측 가능한 트래픽 패턴을 가진 게임의 경우](https://sentry.io/welcome/)대기 용량을 예약하는 것을 고려하세요.

{% hint style="success" %}
대기 용량을 예약하는 것을 고려하세요. [private-fleets](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/private-fleets "mention") 대기 용량을 예약하는 것을 고려하세요.
{% endhint %}

[^1]: 하루 중 최소 동시 접속자 수(CCU)에 대해
