심층 분석

Edgegap의 노코드 매치메이커 개념을 심도 있게 알아보고 필요에 맞게 커스터마이즈하세요.

도움이 필요하시면, Discord로 문의해 주세요. 라이브 게임 지원은 저희의 티켓 발급 시스템을 참조하세요.

✔️ 소개

매치 기반 게임에서 매치메이킹의 일반적인 목적은 다음과 같습니다:

  • 다른 플레이어를 찾기 지역, 지연 시간, 실력 또는 게임 매개변수와 같은 기준에 따라;

  • 서버를 검색 사용 가능한 용량[또는 핑, 지역, 실력, 맵, 모드]에 따라 참가할;

  • 새 서버 시작 기존 서버가 가득 차 있거나 플레이어 기준을 만족하지 못하는 경우.

플레이어 경험을 최우선으로 하며, 우리의 핵심 목표를 정의합니다:

  • 높은 매치 채움률 및 소셜 기능 통합(친구와 그룹으로 플레이),

  • 제어된 매치 품질(낮은 지연, 공유된 선호도)로 빠른 매치,

  • 글로벌 가용성을 갖춘 신뢰할 수 있고 예측 가능한 매치메이킹 프로세스.

5분 안에 시작하고 모든 기능을 무료로 테스트하세요. 신용카드는 필요 없습니다.

더 강력하고 프라이빗(전용) 클러스터가 필요할 때 업그레이드하세요. Edgegap과 네이티브 통합 배포 은 플레이어가 어디에 있든 최고 수준의 핑을 제공합니다.

무료 요금제는 재시작 후 3시간의 런타임을 허용합니다. 매치메이커는 제한된 리소스의 공유 인프라에서 실행되며, 테스트에 적합합니다. 퍼블릭 출시 후에는 매치메이커가 24/7 운영되어야 합니다.

각 매치메이커에는 세 가지 핵심 개념이 있습니다:

  • 심층 분석 - 기본 서버 인프라는 Edgegap이 완전히 관리하고 운영합니다.

  • ⚙️ 설정(Configuration) - 매치메이커의 동작 방식을 정의하는 규칙과 설정 집합.

  • 🌐 서비스 인스턴스 - 클러스터에서 24/7 실행되는 라이브 매치메이킹 서비스로, 설정(Configuration)을 사용해 플레이어를 매칭하고 배포(서버) 할당을 생성합니다.

▶️ 매치메이킹 시작

게임 통합을 커스터마이즈, 트러블슈팅, 최적화할 수 있도록 매치메이킹 프로세스를 알아보세요.

매치메이킹 시퀀스
  1. 플레이어 인증 - 불법 복제본의 온라인 플레이를 방지,

  2. 로비 생성 - 친구들과 함께 합류하고 플레이어/매치 선호도를 공유,

  3. 그룹 구성 - 로비를 매치메이킹 그룹으로 등록,

  4. 매치 찾기 - 준비를 마치고 매치(새로운 또는 기존) 탐색 시작,

    1. 서버 할당 및 티켓 주입 - 몇 초 후 서버가 자동으로 할당,

  5. 연결 및 인증 - 게임 서버로의 보안 연결 시도,

    1. 신원 확인 - 서버가 서드파티 토큰으로 게임 클라이언트의 신원을 검증,

    2. 플레이어 수락 또는 강퇴 - 서버가 플레이어의 참가 허용 여부를 결정합니다.

빠르게 시작하기 - 매치메이킹 스타터 샘플을 게임에 추가하세요:

인증

게임 백엔드를 사용한 기존 게임 클라이언트 인증 외에도, 매치메이커에 대한 모든 요청은 다음을 전송해야 합니다 권한 부여 HTTP 헤더와 함께 비밀 인증 토큰:

권한 부여: xxxxxxxx-e458-4592-b607-c2c28afd8b62

개별 플레이어는 클라이언트와 서버에서 사용 가능한 티켓 ID로 식별할 수 있습니다. 선택적으로 다음을 사용하는 커스텀 프록시로 사용자 지정 인증 또는 제한을 추가하세요 서버 간 통신 API.

그룹 구성

그룹(파티)을 생성하면 플레이어가 친구들과 같은 팀과 서버에 참가하도록 보장합니다.

그룹 라이프사이클 활동 다이어그램

로비와 그룹

게임 디자인이 플레이어가 제어하는 매치메이킹 선호(예: 캐릭터 선택, 난이도, 맵 등) 설정을 요구한다면 로비 서비스를 사용하세요. 플레이어가 로비에 입장하거나 떠날 때, 이후 매치 탐색에 대비해 매치메이킹 그룹도 업데이트합니다.

게임 디자인 - 기능 / 요구사항
매치 전 로비
매치메이커 그룹

친구를 초대해 함께 플레이

내 플레이어/매치 선호 수정

다른 로비 멤버의 선호 보기

사용자 지정 키-값 데이터 저장 및 관리

그룹 멤버에게 플레이 준비 완료 알림

매치메이킹 진행 표시 및 매치 찾기

플레이어/그룹의 팀 배정 받기

게임 서버 연결 정보 가져오기

당사 크로스플랫폼 매치메이커는 모든 상용 및 커스텀 로비 서비스를 지원합니다:

로비 서비스(서드파티)
Unreal Engine
Unity
PC
콘솔
VR/XR
모바일

Steamworks 로비 (Valve Corporation)

Nakama 그룹 (Heroic Labs)

Playfab 로비 (Microsoft)

커스텀 로비 (귀사)

로비 소유자(초대를 보내는 플레이어)가 매치메이킹 그룹도 생성해야 합니다.

공유 로비 데이터에 그룹의 ID를 저장하세요, 그러면 다른 로비 멤버들이 서드파티 로비와 연계된 매치메이킹 그룹을 쉽게 찾고 참가할 수 있습니다. 그룹에 초대된 플레이어는 그룹 ID를 사용해 멤버십을 생성(참가)하고, 자신의 매치메이킹 속성.

핑 최적화

만약 ⚙️ 설정(Configuration) 이(가) 지연 시간 규칙을 포함한다면 모든 그룹 멤버는 자신의 핑 비콘 측정값을 에 보내어 먼 지역의 플레이어 매칭을 방지하고 혹은 훨씬 더 높거나 낮은 핑(지연)을 피합니다.

대기열 포기

그룹 소유자는 그룹을 삭제할 수 있으며, 이때 모든 그룹 멤버십이 자동으로 삭제됩니다. 매치메이킹 시작 후 그룹을 삭제하면 모든 멤버십이 취소되고 곧 삭제됩니다.

그룹 멤버(소유자 제외)는 심층 분석전에 언제든 멤버십을 삭제(그룹 떠나기)할 수 있습니다. 이후 멤버십 삭제는 전체 그룹의 매치메이킹을 취소합니다.

매치메이킹이 취소되면, 멤버들은 자동으로 매치메이킹에서 제거되고 멤버십 status:CANCELLED 를 다음 상태 폴링 응답에서 통지받습니다.

한번 취소되면, 그룹이 매치메이킹을 재시작하려면 그룹 소유자가 그룹을 다시 만들고 새 그룹 ID를 멤버에게 공유한 후, 멤버들이 자신의 멤버십을 다시 생성해야 합니다.

매치가 발견되면, 그룹은 삭제할 수 없습니다 (409 Conflict)가 발생하며, 자동으로 제거됩니다. 서버는 플레이어가 포기했다고 판단하기 전에 플레이어가 연결할 시간을 약간(예: 60초) 허용해야 합니다. 이 경우 서버는 다음을 수행할 수 있습니다:

  • 즉시 매치를 시작하기 위해 이탈자를 AI 캐릭터로 대체,

  • 또는 백필 을 생성해 이탈자를 대체할 새 플레이어를 찾기,

  • 혹은 게임 디자인이 가변 플레이어 수를 허용한다면 이탈자를 대체하지 않고 진행하기.

매치 찾기

매치 탐색을 시작하려면, 모든 멤버와 소유자가 자신을 준비 완료로 표시해야 합니다.

최적의 경험을 위해, 인게임 UI를 사용해 플레이어에게 상태 업데이트를 제공하세요.

모든 플레이어는 정기적인 간격으로 자신의 멤버십을 폴링해야 합니다 (권장 5초) 매치메이킹 시작을 감지하고, 인게임 UI를 통해 진행 상황을 전달하기 위해서입니다.

플레이어는 멤버십 및 그룹 ID를 지속적으로 저장해야 하며, 게임 클라이언트가 크래시할 경우 재시작 후 매치메이킹 진행을 재개할 수 있습니다.

동일 팀에 넣기에 충분한 플레이어를 찾고 귀하의 규칙을(를) 준수하면, 멤버십 응답에서 status:TEAM_FOUND.

로 통지됩니다. 이 단계에서 멤버십을 삭제하면 모든 그룹 멤버십이 취소되고 동일 팀에 배정된 다른 그룹들은 status:SEARCHING .

으로 돌아갑니다. 팀은 그룹 간의 겹치는 값(또는 number_difference )의 평균을 사용하여 다른 팀과 계속 매치메이킹을 진행하며, 충분한 팀이 모일 때까지 계속됩니다. 멤버십 응답에는 status:MATCH_FOUND 가 표시되며, 이는 귀하의 배포가 시작되고 있음을 의미합니다.

플레이어가 status:MATCH_FOUND 를 수신하면, 다음 단계로 진행합니다 심층 분석.

모든 플레이어는 고유한 티켓 ID를 받아서 이를 사용하여 심층 분석 게임 서버와

통신할 수 있습니다. 문제가 발생하거나 대기열 시간이 길면, 매치가 발견되기 전에 현재 티켓을 삭제하고 새 티켓을 생성해 프로세스를 재시작할 수 있습니다.

플레이어가 매치되어 게임 서버에 할당되면, 티켓은 자동으로 삭제됩니다. 다음 이후에 대기열을 포기한 플레이어는 status:HOST_ASSIGNED 으로 대체될 수 있습니다 심층 분석.

서버에 연결

일치가 발견된 지 몇 초 후에, 멤버십은 계속 진행하여 status:HOST_ASSIGNED 를 나타냅니다 배포가 이제 준비되었고 게임 서버가 초기화되고 있습니다.

각 플레이어는 자신의 ticket_id할당 를 읽고 다음을 사용해 연결을 시도합니다 FQDN (배포 URL) 외부 포트. 이 시점에 게임 서버가 아직 초기화 중일 수 있으므로 플레이어는 여러 번 연결을 재시도해야 합니다보통 서버 초기화 시간을 초과할 때까지:

하기 위해 PIE(에디터)에서 연결하기 개발 및 테스트 중에는 물결표(틸드) 키를 누르고 ~ 입력하세요 open {URL}:{port} 그리고 에디터가 맵을 로드할 때까지 기다리세요.

하기 위해 게임 클라이언트 빌드에서 연결하기 (라이브 프로덕션 환경에서도) 다음을 시도해 보세요

우리는 가능한 한 게임 플레이로의 시간을 단축하고, 높은 매치 충원율을 제공하며, 대기열 회피와 매치 취소를 최소화하기 위해 플레이어에게 매치를 확인하도록 요청하지 않습니다.

플레이어는 게임 재시작 간에 할당 ID를 영구적으로 저장하세요그래서 게임 클라이언트가 크래시된 경우 연결 정보를 회수하고 재접속을 시도할 수 있습니다.

백필 매치

선택적으로, 일부 게임은 다음과 같은 특별한 매치메이킹 요구사항이 있을 수 있습니다:

  • 진행 중인 게임에 신규 플레이어가 합류하도록 허용(친구 또는 "랜덤")

  • 서버가 시작된 후 포기한 플레이어(탈주자)를 교체하여 매치를 재시작하지 않도록 함

  • 관전자들이 토너먼트나 친구 매치를 관전할 수 있도록 허용(이스포츠)

  • 플레이어들을 더 큰 서버에 중앙집중화하여 더 많은 사회적 상호작용을 제공(MMO)

백필(Backfill)은 서버가 소유한 티켓으로 현재 서버에 연결된 플레이어를 나타냅니다. 이는 새로 추가된 플레이어가 현재 플레이어와 매치될 때 귀하의 매치메이킹 규칙을 준수하도록 보장합니다.

백필 시나리오 시각화

성공적인 백필을 완료하는 단계는:

  1. 서버가 생성합니다 심층 분석 각 팀별로 별도 생성하며, 다음의 값들을 사용합니다:

    • 실제 할당 에서 가져온 데이터 주입된 변수 (배포).

    • 현재 연결된 플레이어의 티켓들:

      • 출처 심층 분석 (매치메이커), 이전 백필의 assigned_ticket 응답, 또는 특정 플레이어에 맞추기 위해 조작된 모의 데이터,

      • 값을 대체 backfill_group_size 가능한 그룹 크기들로 사용 가능한 수용량까지,

  2. 게임 클라이언트는 새로운 심층 분석 다음과 함께: backfill_group_size 배열을 생성하며 값은:

    • "1" 플레이어가 단독으로 매칭 중인 경우.

    • "2" 플레이어가 총 2명의 멤버로 구성된 매치메이킹 그룹의 일부인 경우.

    • "new" 플레이어가 진행 중인 게임에 합류하는 것 외에 새 게임 시작을 허용한 경우.

  3. 게임 클라이언트는 계속하여 심층 분석 를 수행하고 플레이어를 해당 백필과 페어링합니다.

  4. 백필된 그룹이 팀을 완전히 채우지 못한 경우, 서버는 새로 백필된 플레이어들의 티켓으로 이 과정을 반복하여 더 많은 플레이어를 추가하고 원하는 팀 크기에 도달할 수 있습니다.

백필 전용 프로필을 만들려면, min_team_size 를 999,999로 설정하고 티켓 + 티켓 매치를 비활성화하세요.

🥛 백필 예시 (백필 쇼케이스)
🥛 백필 할당 예시 (백필 쇼케이스)

참고 미러 좌석 관리FishNet 좌석 관리 에서 플레이어 연결 모니터링.

게임 서버 초기화가 끝나면, 서버는:

  • 각 신규 플레이어에 대한 포기 타이머를 시작해야 합니다. 풀 3D 씬, 로비형 소셜 UI, 혹은 진행 바가 있는 로딩 화면 등으로 연결된 플레이어에게 로딩 진행 상황을 표시하는 것을 권장합니다.

  • 시간이 지나며 새 플레이어 연결 또는 기존 플레이어 이탈을 추적하세요:

    1. 새 플레이어는 인증 및 연결을 매치메이커에 매핑하기 위해 서버에 티켓 ID를 알리고, 심층 분석 또는 assigned_ticket (백필된 경우)을 전달해야 합니다.

    2. 서버 수명 동안 사용되지 않은 플레이어 수용량(이탈자)에 대해 새로운 백필을 생성하세요.

    3. 만료된 백필을 갱신하세요. 백필은 다음 이후 삭제됩니다 ticket_expiration_period.

  • 남은 백필은 정리(삭제)하세요 다음 시점에 배포:

다음을 사용하여 C#의 GetEnvironmentVariable 또는 C++의 GetEnvironmentVariable 변수 값을 가져오기 위해.

유효한 서버 할당과 최소 하나의 티켓이 제공된다면 어떤 프로필이든 백필에 사용할 수 있습니다. 최소 예시는 매치메이킹 를 참조하세요.

⚙️ 설정(Configuration)

모든 매치메이커는 JSON 설정을 기반으로 하며, 재시작 시 자동으로 검증됩니다.

🍀 간단한 예제 (권장 최소 구성)
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "simple-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 2
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
🏁 고급 예제 (완전한 구성 예제)
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "allowed_cors_origins": [
    "https://*.my-game-server.com"
  ],
  "profiles": {
    "advanced-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 125
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          },
          "selected_game_mode": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "elo_rating": {
              "max_difference": 150
            },
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "60": {
            "elo_rating": {
              "max_difference": 200
            }
          },
          "180": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            },
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    }
  }
}
🎾 맞춤 로비 예시
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "custom-lobby-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "lobby_id": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "10": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            }
          }
        }
      }
    }
  }
}
🥛 백필 구성 예제
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "backfill-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 100,
              "max_latency": 200
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {}
      }
    }
  }
}
⚔️ 경쟁 게임 예시
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "casual-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "selected_maps": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          },
          "180": {
            "beacons": {
              "difference": 99999,
              "max_latency": 99999
            }
          }
        }
      }
    },
    "competitive-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "versus_ranks": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    },
    "challenger-example": {
      "ticket_expiration_period": "5m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m"
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 2,
              "min_team_size": 5,
              "max_team_size": 5
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "elo_rating": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 50
            }
          }
        },
        "expansions": {
          "120": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            }
          }
        }
      }
    }
  }
}
🤝 협동 게임 예시
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "cooperative-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "type": "player_count",
            "attributes": {
              "team_count": 1,
              "min_team_size": 4,
              "max_team_size": 4
            }
          },
          "beacons": {
            "type": "latencies",
            "attributes": {
              "difference": 125,
              "max_latency": 150
            }
          },
          "selected_difficulty": {
            "type": "string_equality"
          },
          "selected_map": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "player_level": {
            "type": "number_difference",
            "attributes": {
              "max_difference": 10
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "moderation_flags": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "30": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            },
            "player_level": {
              "max_difference": 20
            }
          },
          "60": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 2,
              "max_team_size": 4
            }
          },
          "150": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 4
            }
          }
        }
      }
    }
  }
}
🎈 소셜 게임 예시
{
  "version": "3.2.1",
  "inspect": true,
  "max_deployment_retry_count": 3,
  "profiles": {
    "social-example": {
      "ticket_expiration_period": "3m",
      "ticket_removal_period": "1m",
      "group_inactivity_removal_period": "5m",
      "application": {
        "name": "my-game-server",
        "version": "2024.01.30-16.23.00-UTC"
      },
      "rules": {
        "initial": {
          "match_size": {
            "attributes": {
              "team_count": 1,
              "min_team_size": 50,
              "max_team_size": 50
            },
            "type": "player_count"
          },
          "beacons": {
            "attributes": {
              "difference": 125,
              "max_latency": 150
            },
            "type": "latencies"
          },
          "selected_mode": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "backfill_group_size": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          },
          "moderation_flags": {
            "type": "intersection",
            "attributes": {
              "overlap": 1
            }
          }
        },
        "expansions": {
          "15": {
            "beacons": {
              "difference": 125,
              "max_latency": 250
            },
            "match_size": {
              "team_count": 1,
              "min_team_size": 20,
              "max_team_size": 50
            }
          },
          "30": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 10,
              "max_team_size": 50
            }
          },
          "150": {
            "match_size": {
              "team_count": 1,
              "min_team_size": 1,
              "max_team_size": 50
            }
          }
        }
      }
    }
  }
}
애플리케이션 구성은 프로필 XYZ에 대해 유효하지 않습니다.
  • 우리는 귀하의 앱 및 버전를 찾을 수 없으므로, 확인해 주세요 애플리케이션 값들.

'2024.01.30-16.23.00-UTC'의 Docker 이미지가 캐시되지 않았습니다.

🌟 종량제(Pay as You Go) 등급으로 업그레이드 하면 잠금이 해제됩니다 캐싱으로 즉시 배포.

  • 4GB 이상의 비캐시된 이미지는 배포에 더 오래 걸릴 수 있어, 그 결과 배포입니다. 서버 이미지 크기 최적화( 언리얼 엔진 / Unity).

  • 그럼에도 계속 진행할 수 있지만, 배포 시간을 테스트할 것을 권장합니다.

프로필(대기열)

프로필은 동일한 매치메이커 버전을 공유하지만 완전히 분리된 매치메이킹 대기열을 나타냅니다. 각 매치메이커에 대해 원하는 수의 프로필을 설정할 수 있습니다. 플레이어 기반을 여러 프로필로 분할하면 플레이어의 대기열 시간이 길어질 수 있습니다.

각 매치메이커 프로필은 앱 버전 을(를) 템플릿으로 사용하여 새로운 배포(서버)를 시작합니다.

규칙

모든 플레이어와 그룹은 다음을 사용하여 매치메이킹 대기열에 참가하고 매치를 찾습니다 초기 규칙을 우선 적용합니다.

프로필의 다음 경로의 각 항목 .rules.initial 은(는) 규칙을 나타내며, 여기서:

  • key 는 규칙의 이름을 자유롭게 지정하는 문자열 값입니다. 예: match_size , 그리고

  • value 는 표준 규칙 세트를 준수하는 규칙의 유형과 속성을 정의하는 객체입니다.

모든 규칙이 동시에 충족되어야 호스트 할당을 시작하고 배포를 시작하거나 찾을 수 있습니다.

연산자(규칙 유형)

player_count 는 할당을 시작하기 위해 필요한 플레이어 수를 정의하는 특수 규칙입니다.

매치메이커는 지정된 max_team_size :

  1. 까지 매치 충원률을 극대화하려고 노력합니다. 최대 팀 크기에 도달하면 즉시 매치를 성사시키고,

  2. 그렇지 않으면 플레이어는 대기열에서 매치를 채울 때까지 기다리며, expansion (또는 만료)이 임박하면,

  3. 바로 전에 확장 (또는 만료) 시, 부분 매치가 가능(≥ 최소 그리고 < 최대 팀 크기)하다면, 같은 확장 단계의 모든 플레이어로 매치를 성사시킵니다(다른 규칙 통과 가정).

을(를) 설정하세요. 경쟁 게임을 위해 여러 균형 잡힌 팀을 구성하도록 팀 수를 설정할 수 있습니다:

  • 그룹 속성은 평균/겹침 을(를) 기준으로 그룹의 플레이어 속성에서 계산되며,

  • 팀 속성은 평균/겹침 을(를) 기준으로 팀의 그룹 속성에서 계산됩니다.

고정 팀 크기가 4명인 경우를 가정:

예시 매치 시나리오

그룹은 과충원 없이 팀에서 매칭되며, 팀에 전체 그룹이 들어갈 충분한 자리가 있을 때만 성사됩니다.

string_equality 는 동일한 문자열 값을 가진 플레이어를 매칭합니다.

규칙 예시: selected_game_mode

selected_game_mode 규칙은 대소문자를 구분하여 플레이어를 매칭합니다:

Alice + Bob + Dave는 매칭될 수 있고,

Alice + Erin, 또는 Charlie + Frank는 절대 매칭되지 않습니다.

"Free For All"
"Capture The Flag"
"capture the flag"

Alice

Erin

Frank

Bob

Charlie

Dave

number_difference 는 서로 간의 절대 수치 차이 범위 내 플레이어를 매칭합니다.

규칙 예시: elo_rating

elo_rating 위 규칙에서 "max_difference": 50 을(를) 초기값으로 사용할 때:

Alice + Bob은 매칭 가능, Bob + Charlie도 매칭 가능,

Alice + Bob + Charlie는 절대 매칭 불가.

지연 시간 플레이어 매치의 핑을 최적화하는 특수 규칙입니다:

  • 임계값보다 높은 지역을 제거하여 클라이언트-서버 지연 시간을 줄입니다,

  • 유사한 지연 시간을 가진 플레이어들끼리 그룹화하여 매치의 공정성을 향상시킵니다 (차이 이하).

규칙 예시: 비콘

비콘 구성된 규칙 "difference": 100, "max_latency": 200 다음과 매치합니다:

Alice와 Bob은 매치될 수 있습니다:

  • Tokyo는 제외됩니다 (>200 ms),

  • Chicago의 지연 시간은 절대 차이가 100 ms 이내입니다.

비콘 도시
매치 여부
abs(A - B) [ms]
Alice [ms]
Bob [ms]

Chicago

75.0

12.3

87.3

Los Angeles

113.2

145.6

32.4

Tokyo

해당 없음

해당 없음

233.2

253.2

Alice와 Charlie는 절대 매치되지 않습니다:

  • 두 플레이어 모두에 대해 < 200 ms인 비콘이 없습니다,

  • Alice는 북미 - 일리노이에 거주합니다,

  • Charlie는 아시아 - 일본에 거주합니다.

비콘 도시
매치 여부
abs(A - B) [ms]
Alice [ms]
Charlie [ms]

Chicago

해당 없음

해당 없음

12.3

215.6

Los Angeles

해당 없음

해당 없음

145.6

238.3

Tokyo

해당 없음

해당 없음

233.2

24.2

모든 비콘으로의 핑이 높은 일부 플레이어는 다음으로 인해 인터넷 서비스 제공업체(ISP) 문제나 느린 연결(예: 무선/모바일)로 인해 지연이 발생하고 다른 사람들의 게임 경험이 저하될 수 있습니다. 이 문제를 완화하려면:

  • 허용되는 최대 지연 및 차이를 점진적으로 확장하세요(참조 고급 예시 구성),

    • 핑이 높은 플레이어는 매치를 찾는 데 평소보다 더 오래 기다려야 할 수 있습니다.

  • 또는 플레이어가 수동으로 지역을 선택하여 측정을 무시하도록 허용하고, 플레이어가 선택한 지역에 대해서만 가짜 핑 값을 전송할 수 있습니다(예: 빠른 매치는 25ms),

    • 이는 해당 플레이어의 팀원과 상대방의 플레이어 경험에 부정적인 영향을 미칠 수 있습니다.

비콘 핑이 높다고 해서 항상 서버 핑이 높은 것은 아닙니다배포는 비콘보다 더 많은 위치에서 제공됩니다. 비콘은 전 세계 범위 및 신뢰성을 우선시하도록 실시간으로 조정됩니다.

intersection 은 하나 이상의 겹치는 문자열 값을 가진 플레이어를 대소문자 구분으로 매칭합니다.

규칙 예시: selected_map

selected_map 위 규칙에서 "overlap": 1 이면 다음을 매칭:

Alice + Bob + Charlie 또는 Alice + Bob + Dave는 매칭 가능,

Alice + Bob + Charlie + Dave는 절대 매칭 불가.

규칙 확장

선택적으로, 확장(Expansions) 은 대기열에서 일정 시간이 경과한 후 규칙의 속성을 수정해 제한을 완화하고 매칭 가능한 플레이어 풀을 확대하여, 더 빠른 매치를 달성합니다.

예시 시나리오: 확장

초기에는 정확히 4명의 플레이어(그룹으로 분할 가능)로 구성된 1개 팀을 요구합니다 다음 조건과 함께:

  • 동일(임의 1개) 비콘에 대해 최대 125ms 지연,

  • 동일 비콘에 대해 최저/최고 값 간 지연 차이가 125ms 이하,

  • 최저와 최고 등급 플레이어 간 실력 등급 차이가 50점 이하,

  • 완전히 동일(대소문자 구분)한 선택 게임 모드,

  • 플레이어 간 최소 1개 이상의 일치하는 맵 선택(대소문자 구분),

  • 최소 1개의 일치하는 백필 그룹 크기 값.

위 예에서 우리는 속성을 수정하여 탐색 범위를 확장합니다 시간 경과 후:

30초:

  • 4명 플레이어

  • 150 실력 등급 범위

  • 최대 250ms 지연

60초:

  • 4명 플레이어

  • 200 실력 등급 범위

  • 최대 250ms 지연

3분(180초):

  • 1-4명 플레이어

  • 200 실력 등급 범위

  • 지연 제한 없음

확장 미세 조정

플레이어 선호 예측은 움직이는 표적을 맞히는 것과 유사합니다. 출시 시 덜 제한적인 규칙 세트로 시작하고 이후 반복적으로 최적화하세요 심층 분석.

다음 질문이 사고 과정을 정리하는 데 도움이 될 수 있습니다:

  • 내 플레이 세션 길이는?

    • 5분 플레이 세션은 각 플레이어가 5분마다 대기열에 재진입함을 의미하며, 특정 시점의 대기열 인원이 늘어나 간접적으로 대기 시간을 줄입니다.

  • 피크 CCU저조기 CCU?

    • 저조기와 고조기 간 변동 폭이 크면(60% 이상) 저조기용 별도 프로필을 만들어 각 확장에서 더 오래 기다리게 하여 더 많은 플레이어를 모을 필요가 있습니다.

  • 플레이어의 지리적 분포는?

    • 여러 시간대에 고르게 분포하면 피크와 저조기의 분산은 낮지만, 서로 다른 지역의 플레이어는 매칭되어서는 안 되므로 심층 분석 이 올바르게 구성된 경우(높은 핑을 초래) 매치 속도가 개선되지는 않습니다.

  • 실력 등급 분포(지역별)는?

    • 실력 분포는 일반적으로 종모양 곡선 (자연 분포)를 따르므로 평균에서 표준편차가 커질수록 플레이어 수가 줄어듭니다. 평균에 가까운 플레이어는 첫 확장에서 빠르게 매칭되지만, 극단값은 문제입니다.

    • 각 확장에서 허용 차이를 25 -> 50 -> 100처럼 점진적으로 늘릴 것을 권장합니다. 이는 분포의 극단에 있는 플레이어가 더 적음을 고려하기 위함입니다.

    • 챌린저 티어(프로 플레이어)가 있다면 표본이 작고 전체 플레이어 기반의 거시적 추세를 따르지 않는 경우가 많으므로, 사용자 지정 실력 설정의 별도 프로필을 권장합니다. (극단으로 치우친, 역 종곡선 경향)

  • 소규모 플레이어 기반에서 매치 속도와 매치 충원률을 어떻게 개선할 수 있나요?

    • 플레이어와 그들의 선호에 대해 가능한 한 많이 학습하세요!

    • 일부 규칙을 제거하거나 초기에 제한을 완화하는 것을 고려하세요.

    • 시간 경과에 따라 팀 크기나 팀 수를 완화하세요 - 부분 매치가 무매치보다 낫습니다.

    • 확장 사이의 지속 시간을 늘려 더 많은 플레이어를 모으세요.

    • 게임 디자인에 특화된 추가 팁과 요령이 필요하면 문의하세요.

규칙 속성의 어떤 확장이든 해당 속성의 이전 값을 덮어씁니다 (overwrite).

📌 주입 변수

서버는 플레이어에 대한 세부 정보를 알아야 할 수 있습니다. 플레이어 속성, 해결된 매치 값 및 기타 값은 일반적인 앱 및 버전.

서식 미적용 미리보기 🏁 고급 예시 변수:

환경 변수는 문자열화된 JSON으로 저장되며SDK 또는 커스텀 방법으로 파싱하세요.

🧵 플레이어 추적

플레이어에게 문제가 발생하면 서버 로그까지의 경로를 추적하는 데 도움이 됩니다. 각 매치메이커 배포 에는 할당된 플레이어 티켓 ID가 태그로 지정되어 쉽게 배포 하고 찾을 수 있어 배포 문제 해결에 도움이 됩니다.

자세한 SDK와 예제 시나리오는 배포 배포 트러블슈팅에 대해 알아보려면 여기를 참조하세요.

👀 분석

코드나 설정 없이 매치메이커의 부하와 성능에 대한 인사이트를 얻으세요.

🌟 매치메이커를 엔터프라이즈 티어로 업그레이드 하여 매치메이킹 지표와 인사이트를 잠금 해제하세요:

☁️ 호스팅 클러스터

매치메이커는 Edgegap이 24/7 상시로 편리하게 호스팅 및 관리합니다.

목표에 가장 적합한 호스팅 옵션을 선택하세요:

  • 무료 클러스터(공유) 모든 기능을 테스트하고 디자인과의 시너지를 탐색하려면,

    • 3시간 후 자동으로 종료되며 계속 테스트하려면 재시작이 필요합니다.

  • 프라이빗 클러스터 (전용) 프로덕션 요구에 안정적인 환경을 보장하려면,

    • 지역을 선택하고 라이브 게임에 대해 24/7 지원을 받아 안심하고 출시하세요.

프라이빗 클러스터 티어

현재 저희는 3가지 사설 클러스터 등급을 모든 사람의 요구를 충족시키기 위해 제공하고 있습니다:

등급
스튜디오 티어
엔터프라이즈 티어
전체 한도

적합한 사례

열정 있는 사용자, 개인 개발자

상업적 출시

고트래픽 출시

리소스

1 vCPU + 2GB RAM

6 vCPU + 12GB RAM

18 vCPU + 48GB RAM

중복성

1x 가상 노드

3x 가상 노드

3x 가상 노드

요청 한도 (req/s)

200

750

2,000

가격(시간당)

$0.0312

$0.146

$0.548

가격(30일) (연속 사용)

$22.464

$105.12

$394.56

원클릭으로 프라이빗 클러스터로 업그레이드하세요. 출시 후에도 플레이어 다운타임 없이 프라이빗 클러스터 티어 변경이 가능하며, 이는 ⏩ 롤링 업데이트로 가능합니다. 관리형 클러스터는 Edgegap이 유지 관리하는 고가용성 서비스 호스팅을 제공하며 공개 출시된 게임에 24/7 라이브 지원을 제공합니다.

인스턴스의 리소스 요구사항은 다음 요인에 따라 달라집니다:

  • 플레이어 수 - 플레이어가 많을수록 티켓과 API 요청이 증가,

  • 플레이어당 요청 수 - 더 빠른 재시도가 서비스 부하를 증가시키고 리소스를 소모,

  • 구성 복잡도 - 교집합 규칙과 확장은 특히 요구 사항이 큼,

  • 평균 매치 시간 - 세션이 짧을수록 플레이어가 더 자주 매치메이킹에 재진입,

  • 만료 및 제거 기간 - 오래된 티켓이 시간이 지남에 따라 쌓여 리소스 소모,

  • 클라이언트 재시도 폴백 로직 - 지터가 있는 백오프로 재시도하면 트래픽 급증을 분산하는 데 도움.

저희 클러스터는 2.4 - 3.2GHz 클럭 속도의 AMD/Intel CPU가 장착된 클라우드 머신을 사용합니다.

요율 제한

클러스터가 버스트 용량을 초과해 장애가 발생하는 것을 방지하기 위해, 내부 부하 테스트를 기반으로 초당 요청 수를 다음 매치메이킹 구성을 사용해 제한합니다.

API 엔드포인트
무료 티어
하비 티어
스튜디오 티어
엔터프라이즈 티어

전체 제한

100

200

750

2,000

배포 생성

5

10

30

30

비콘 목록

10

20

75

200

그룹 만들기 + 티켓 만들기 + 그룹 티켓 만들기

10

20

75

200

멤버십 읽기 + 그룹 읽기 + 티켓 읽기

10

120

450

1,300

백필 생성

5

10

37

100

요율 제한은 다음으로 표현됩니다 지정된 API 엔드포인트 집합에 대한 합산 초당 요청 수.

게임 클라이언트가 응답을 수신했을 때 요청을 재시도하지 않으면 429 요청이 너무 많음 배포에 플레이어가 누락될 수 있습니다 고부하로 인해 할당 확인을 중단한 플레이어들.

부하 테스트

매치메이킹과 할당은 CPU와 메모리를 사용하므로 각 프라이빗 매치메이커마다 호스팅 비용이 필요합니다. 각 티어에 해당하는 리소스와 가격은 요금제 페이지에서 확인하세요.

부하 테스트를 설계할 때, 현실적인 플레이어 패턴을 고려해주세요:

현실적인 시나리오
비현실적인 트래픽 패턴

✅ 플레이어는 몇 시간에 걸쳐 점진적으로 매치메이킹에 참여하여 초당 요청 수가 증가합니다.

❌ 모든 플레이어가 정확히 같은 초에 티켓을 만들도록 조율합니다.

✅ 플레이어는 재시도 사이에 대기 시간을 점차 늘립니다(예: 1초-5초-10초-10초).

❌ 모든 플레이어가 다음을 받자마자 즉시 재시도합니다 429 요청이 너무 많음 응답.

✅ 대부분의 플레이어는 짧은 시간(10~60초) 내에 할당을 받고 폴링을 중단합니다.

❌ 모든 플레이어가 할당을 받은 후에도 설정된 시간 동안 계속 폴링합니다.

✅ 대부분의 플레이어는 게임을 끝낸 후(시간 소요) 다시 매치메이킹을 시작합니다.

❌ 모든 플레이어가 할당을 받자마자 즉시 다시 매치메이킹을 시작합니다.

✅ 피크 트래픽은 하루 6~8시간 유지되며, 이후 일부 시간대는 트래픽이 감소합니다.

❌ 피크 트래픽이 하루 24시간 지속되어 모든 플레이어가 밤낮으로 플레이합니다.

매치메이커에 높은 부하가 발생하는 경우:

  • CPU가 스로틀링되면 매치메이킹 속도가 느려질 수 있습니다,

  • 매치메이커의 메모리가 부족하면 티켓 정보를 잃지 않고 재시작되며, 클라이언트가 지수적 백오프를 구현하여 버스트가 더 긴 시간에 걸쳐 분산되기를 기대합니다.

⏩ 롤링 업데이트

서버와 클라이언트 버전 간 호환성을 추적하는 일은 복잡해질 수 있습니다. 신뢰할 수 있는 릴리스, 업데이트, 다운타임 또는 호환성 문제 방지를 위한 팁을 따르세요.

매치메이커 URL과 인증 토큰은 재시작 후에도 항상 동일하게 유지됩니다.

⚠️ 라이브 전 확인 사항

미리 여러 개의 매치메이커 복제본을 만들어 두는 것을 권장합니다: 그린, 블루오렌지. 업데이트를 출시할 때 사용 중인 매치메이커를 회전시킬 수 있습니다 (블루/그린 전략).

각 인스턴스에 서로 다른 리전을 선택하여 다운타임을 방지하세요 지역적 장애 동안.

블루/그린 DevOps 환경 예시

🔃 클라이언트 + 서버 업데이트

사전 요구 사항: 이 섹션은 다음을 완료했다고 가정합니다 심층 분석.

다음을 위해 게임 클라이언트 + 서버 업데이트를 릴리스하기 위해, 다음을 수행할 수 있습니다:

  1. 새 서버 앱 버전 준비 v1.2.0-rc Edgegap에서:

    1. 컨테이너 레지스트리에 새 이미지 태그 푸시 t1.2.0,

    2. 새 앱 버전 생성 v1.2.0-rc,

  2. 다음으로 어떤 개발 테스트든 수행: 새 앱 버전을 배포하고 v1.2.0-rc:

    1. 게임 엔진의 에디터를 제공된 URL + 외부 포트에 연결,

  3. 미사용 매치메이커 업데이트 블루 새 이미지 태그로 연결 t1.2.0,

    1. 새 앱 버전에 대한 캐싱 활성화 v1.2.0-rc , 이 버전에 대한 캐시를 활성화하면 해당 이미지는 버전 v-blue 에서도 동일한 태그를 참조하므로 캐시됩니다,

    2. 버전에서 캐싱 지표가 v1.2.0-rc 에 도달할 때까지 대기 🟢 그린,

  4. 새 게임 클라이언트 업데이트 c2 가 새 버전을 사용하도록 v-blue 티켓을 생성할 때:

    1. 게임 클라이언트의 기본 URL과 Authorization 토큰 업데이트,

  5. 새 게임 클라이언트에 대한 QA 테스트 및 최종 검증 수행 c2:

    1. 문제를 발견하고 해결한 경우, 처음부터 과정을 반복,

    2. 매치메이커가 중지된 후(빠른 재시작은 DNS 업데이트나 대기 기간 불필요) 전 세계 ISP에 매치메이커 DNS 변경 사항이 전파되도록 3~7일 대기,

  6. 새 게임 클라이언트 업데이트를 릴리스 c2 게임 배포 플랫폼에서,

  7. 새 게임 클라이언트가 c2 플레이어 기기로 배포될 시간을 허용하세요(일반적으로 최대 3~7일):

    1. 구버전 게임 클라이언트 모니터링 c1 배포를 사용하여 배포,

  8. Edgegap 계정에서 사용하지 않는 리소스 정리:

    1. 이미지 태그 삭제 t1.0.0 로 컨테이너 레지스트리 용량 확보,

    2. 이미지 태그 삭제 t1.1.0 로 컨테이너 레지스트리 용량 확보,

    3. 다음 항목을 끄세요 그린 매치메이커를 꺼서 다음 업데이트까지 요금 청구를 일시 중지합니다.

⚡ 서버 핫픽스

사전 요구 사항: 이 섹션은 다음을 완료했다고 가정합니다 심층 분석.

다음을 위해 게임 클라이언트 업데이트 없이 서버 패치를 릴리스하려면 위해, 다음을 수행할 수 있습니다:

  1. 새 서버 앱 버전 준비 v1.2.0-rc Edgegap에서:

    1. 컨테이너 레지스트리에 새 이미지 태그 푸시 t1.2.0,

    2. 새 앱 버전 생성 v1.2.0-rc,

  2. 다음으로 테스트 및 검증 수행 새 앱 버전을 배포하고 v1.2.0-rc:

    1. 게임 엔진의 에디터를 제공된 URL + 외부 포트에 연결,

    2. 문제를 발견하고 해결한 경우, 처음부터 과정을 반복,

    3. 새 앱 버전에 대한 캐싱 활성화 v1.2.0-rc , 이 버전에 대한 캐시를 활성화하면 해당 이미지는 버전 v-green 나중에 동일한 태그를 참조하게 될 것이므로,

    4. 버전에서 캐싱 지표가 v1.2.0-rc 에 도달할 때까지 대기 🟢 그린,

  3. 버전 업데이트 v-green 새 이미지 태그로 연결 t1.2.0,

    1. 새 매치는 업데이트된 태그로 자동으로 할당을 시작합니다 t1.2.0,

    2. 구버전 게임 클라이언트 모니터링 c1 배포를 사용하여 배포,

  4. Edgegap 계정에서 사용하지 않는 리소스 정리:

    1. 이미지 태그 삭제 t1.1.0 로 컨테이너 레지스트리 용량을 확보합니다.

📗 API

클라이언트와 서버는 API를 직접 호출하거나 게임 엔진 SDK로 호출할 수 있습니다. 또한 다음을 참조하세요 매치메이킹.

Unity/Android - 고려하세요 원시 문자열 보간을 사용하기 하드코딩된 JSON의 코드 스트리핑을 방지하기 위해.

API 명세를 가져오기 Scalar API 웹 클라이언트 또는 Swagger 에디터 세부 정보를 확인하려면.

서버 간 통신

매치메이킹 흐름에 대한 향상되거나 맞춤화된 제어를 추가하세요 - 다음을 사용하여 사용자 지정 프록시를 구현하세요 관리형 클러스터 또는 임의의 클라우드 FaaS 컴퓨팅 플랫폼으로, 다음을 달성하기 위해:

  • 치터 플래그, 실력 등급 등과 같은 민감한 플레이어 속성 첨부,

  • 게임 내 팀과 매치 컨텍스트 제공 - 로딩 중 내 팀원과 상대 목록 표시,

  • 특정 엣지 케이스 제한 - 예: 한 번에 플레이어당 1개의 그룹만 허용,

  • 캐싱 또는 API 속도 제한 추가 - 요청 수와 매치메이커 부하 감소,

  • 로비-그룹 통합 사용자화 - 매치메이킹 전 비대칭/역할 기반 로비 생성.

게임 클라이언트는 ipify.org 의 무료 서비스를 사용해 자신의 공인 IP를 확인할 수 있습니다. VPN은 공인 IP 주소를 가릴 수 있습니다.

서버-서버 매치메이킹 활동 다이어그램

교차 출처 리소스 공유(CORS)

서드파티 배포 플랫폼(예: itch.io)에 호스팅된 webGL 게임의 경우, 게임 클라이언트에서 매치메이커로 요청을 보내면 교차 출처 리소스 공유 정책 위반이 발생할 수 있습니다. 대부분의 최신 웹 브라우저는 프리플라이트 요청 을 보내 백엔드 서비스(매치메이커)가 게임 클라이언트의 통신을 이해하고 허용하는지 확인합니다.

프리플라이트 검사 실패(보안상의 기본값)는 다음을 초래할 수 있습니다 여러 가지 가능한 CORS 관련 오류 중 하나, 가장 흔한 것은 CORS 헤더 'Access-Control-Allow-Origin' 누락 .

이 오류를 해결하려면 다음을 추가하세요 allowed_cors_origin 파라미터를 구성에 추가하여 다음 중 하나를 수행합니다:

  • 정확한 클라이언트 호스팅 도메인을 화이트리스트에 추가:

🍀 간단 예시(특정 도메인 예시)
  • 또는 와일드카드 도메인(모든 서브도메인 포함)을 화이트리스트에 추가:

🍀 간단 예시(와일드카드 도메인 예시)

도메인이 올바르게 구성되어 있다면 매치메이커 프리플라이트 요청에는 자격 증명이 필요하지 않습니다 .

🚨 문제 해결

여러분의 성공이 우리의 최우선입니다. 사용자 지정 요청을 보내거나, 누락된 중요 기능을 요청하거나, 어떤 의견이든 표현하고 싶다면, 우리 커뮤니티 디스코드로 문의해 주세요.

애플리케이션 구성은 프로필 XYZ에 대해 유효하지 않습니다.
  • 우리는 귀하의 앱 및 버전를 찾을 수 없으므로, 확인해 주세요 애플리케이션 값들.

'2024.01.30-16.23.00-UTC'의 Docker 이미지가 캐시되지 않았습니다.

🌟 종량제(Pay as You Go) 등급으로 업그레이드 하면 잠금이 해제됩니다 캐싱으로 즉시 배포.

  • 4GB 이상의 비캐시된 이미지는 배포에 더 오래 걸릴 수 있어, 그 결과 배포입니다. 서버 이미지 크기 최적화( 언리얼 엔진 / Unity).

  • 그럼에도 계속 진행할 수 있지만, 배포 시간을 테스트할 것을 권장합니다.

새 매치메이커를 생성하려고 할 때 왜 오류가 발생하나요?
  • 오류 메시지를 읽어보세요. 식별자, 규칙 또는 연산자를 잘못 입력했을 수 있습니다. - 사용하세요 JSONLint 로 JSON 포맷을 검증하세요. 쉼표나 대괄호를 빠뜨렸을 수 있습니다. - 다음을 통해 문의하세요 커뮤니티 디스코드 에서 도움을 받으세요. 기쁘게 도와드리겠습니다. 🙏

왜 내 매치메이커가 3시간 후 자동으로 꺼졌나요?
  • 무료 티어의 매치메이커는 초기 테스트 용도로 제공되며 3시간 후 자동으로 꺼집니다. 테스트를 계속하려면 매치메이커를 재시작하세요.

  • 무제한 실행 시간을 위해 유료 티어로 업그레이드를 고려하세요.

왜 내 계정에서 두 번째 배포를 시작할 수 없나요?
  • 무료 티어에서는 동시 배포 1개만 실행할 수 있습니다.

  • 무제한 배포를 위해 유료 티어로 업그레이드를 고려해주세요.

왜 무작위 시간에 할당/배포가 발생하나요, 다음을 무시하고 player_count?
  • 이전 테스트 세션 동안 당신 또는 다른 팀원이 할당되지 않은 티켓을 생성했을 수 있습니다. 다음을 수행하세요 매치메이커를 재시작하세요.

내 티켓이 다음 상태에서 멈춰 있습니다 SEARCHING .
  • 구성에 맞는 매칭 티켓을 충분히 생성했는지 확인하세요.

내 티켓이 다음 상태 사이를 전환하며 멈춥니다 MATCH_FOUNDTEAM_FOUND 반복적으로.
  • 무료 티어 계정은 한 번에 1개의 배포로 제한됩니다.

  • 업그레이드를 고려하거나 새 배포를 시작하려면 현재 배포를 중지하세요.

내 티켓이 바로 다음으로 이동합니다 CANCELLED.
  • 티켓이 만료에 도달했습니다. 테스트 목적이라면 새 티켓을 만들거나 구성에서 만료 기간을 늘리세요.

다음과 같은 응답을 받습니다 HTTP 404 Not Found 티켓을 확인할 때.
  • 티켓은 DELETE 요청으로 제거되었거나 제거 기간에 도달했을 수 있습니다(티켓 만료 이후 시작되며, 구성에서 정의). 새 티켓을 다시 생성하거나 테스트 목적이라면 구성에서 만료/제거 기간을 늘리세요.

매치메이커에 오류가 표시됩니다. 어떻게 해야 하나요?
  • 이 인스턴스가 개발 또는 테스트 용도라면 먼저 매치메이커를 재시작해 보세요. - 다음을 통해 모든 이슈를 보고해주세요 커뮤니티 디스코드.

  • 이 문제가 라이브 게임에 영향을 주는 경우, 긴급 지원 요청.

🔖 변경 로그

시맨틱 버전 관리

저희 매치메이커는 공식 시맨틱 버전 관리 지침을 사용합니다. 각 구성 JSON은 서비스의 특정 버전에 연결되어 있습니다. 서비스 버전은 구성 및 API에서 사용할 수 있는 규칙과 설정을 결정합니다. 일단 버전이 출시되면 절대 변경되지 않습니다.

구성 파일은 사용 중인 매치메이커 버전에 따라 검증되므로, 규칙이 매치메이커 버전의 기능과 일치하는지 확인하세요.

최신 매치메이커 버전은 3.2.1입니다. 이 페이지의 모든 예시는 최신 상태입니다. 사용 중인 매치메이커 버전에 대한 지원 종료 공지를 주시하세요. 또한 참조 ⏩ 롤링 업데이트.

3.2.1 (2025년 11월 24일)

🩹 버그 수정:

  • 경미한 배포 버그 수정, 매치메이커 시작 시 발생하던 여러 오류를 해결했습니다.

3.2.0 (2025년 10월 31일)

🩹 버그 수정:

  • 사양의 소규모 수정과 문서 일관성 업데이트를 다수 적용했습니다.

  • 매치메이커 인프라 전반의 안정성과 자기 복구 기능을 개선했습니다.

✨ 개선 및 신규 기능:

  • 다음 소개 심층 분석 기능 - 이제 그룹 관리는 쉬우며 서드파티가 필요하지 않습니다!

    • 이제 더 이상 그룹 구성원 간에 복잡한 티켓 속성을 공유할 필요가 없고, 그룹 ID만 있으면 됩니다.

    • 모든 플레이어가 준비 완료로 표시하면 그룹으로 매칭을 시작하세요.

    • 합류 시 그룹 리더에 대해 그룹 멤버 속성을 검증하여 매칭 불가 그룹을 방지합니다(그룹 플레이어 속성이 프로파일 규칙에 부합하지 않는 경우).

    • 그룹 크기를 검증하고 최대 팀 크기에 도달하면 새 멤버십을 거부합니다.

    • 새 사용자 흐름으로 업데이트된 문서를 읽어보세요. SDK 업데이트가 곧 제공됩니다!

  • 티켓(멤버십)에 이제 매치 ID가 포함됩니다 - 플레이어를 추적하고 팀/상대 팀의 닉네임, 실력 등급 또는 서드파티에 저장된 기타 속성을 공유하는 UI 요소를 추가하세요.

  • 대규모 심층 분석 내부 스트레스 테스트를 기반으로 한 오버홀, 짧은 버스트 처리 향상.

  • 확장 종료까지 부분 매치 크기를 지연하여 매치 충원율이 개선되었습니다.

    • 최대 팀 크기에 도달하면 즉시 매칭합니다.

    • 그렇지 않으면 최소 팀 크기에 도달한 경우 현재 확장 종료 시 매칭합니다.

  • 프로파일별로 만료 및 제거 기간을 설정하여 최적의 플레이어 경험을 제공합니다.

3.1.0 (2025년 6월 10일)

🩹 버그 수정:

  • 이제 서로 다른 규칙을 포함하는 여러 프로파일의 티켓을 올바르게 검증합니다.

✨ 개선 및 신규 기능:

  • 다음과 함께 매치 충원율을 극대화하기 위한 추가 최적화 player_count 규칙을 적용했습니다. 부분 매치만 가능한 경우(최소 초과, 최대 미만) 티켓은 확장 종료(또는 만료)까지 대기합니다.

    • 완전한 매치(최대 팀 크기 도달)는 즉시 이루어집니다(변경 없음).

  • 엔터프라이즈로 업그레이드 심층 분석 하여 매치메이킹 심층 분석을 잠금 해제하세요! 매치메이커의 부하와 성능에 대한 인사이트를 코드나 구성 없이 얻을 수 있습니다. 출시 시 포함된 지표:

    • 사용자 지정 기간 동안의 총 티켓, 백필, 할당 및 배포 수,

    • 위 지표들에 대한 분당 비율(사용자 지정 기간),

    • 만료된 티켓, 확장된 매치, 매치 충원율에 대한 총합 및 시계열 인사이트,

    • API 사용량 지표 등.

  • 개선된 규칙 문서로 더 나은 예시와 시각 자료를 제공합니다.

3.0.0 (2025년 5월 20일)

⚠️ 호환성 파괴 변경:

  • 다음을 사용하여 팀을 효율적으로 채우기 위한 최소/최대 팀 크기 (플레이어 수 확장을 대체):

    • 구성의 player_count 규칙에서, team_sizemin_team_sizemax_team_size 로 교체하여 매치 충원율 극대화를 시도하는 "최선의 노력" 매칭을 달성,

    • 팀당 특정 인원수를 요구하려면 최소와 최대를 동일한 값으로 설정,

    • 백필은 player_count 규칙을 우회하며 항상 1개의 티켓으로 매칭(변경 없음).

  • 모든 지연 시간이 가장 높은 max_latency 를 초과하는 티켓, 그룹 티켓, 백필은 만료 대신 즉시 다음과 함께 거부됩니다 400 잘못된 요청 티켓 생성 요청에 대한 응답으로:

    • 다음의 경우에만 적용됩니다 지연 시간 규칙 이 구성된 경우,

    • 이 동작을 우회하려면 다음으로 확장을 생성하세요 max_latency: 99999 (클라이언트 지연 측정 타임아웃보다 큰 아무 값이나).

  • 주입되는 환경 변수는 티켓 데이터를 포함하며 이제 필드 id (티켓 ID)를 포함하므로 다음을 생성할 때 더 쉽게 재사용할 수 있습니다 심층 분석.

🩹 버그 수정:

✨ 개선 및 신규 기능:

  • 이제 최대 3배 더 많은 잠재적 매치를 고려하여 더 최적의 그룹을 생성하고 매치 충원율을 극대화합니다.

  • 동시성 최적화로 매칭 속도가 최대 200% 빨라졌습니다.

  • 확장 알고리즘 최적화로 매치 충원율이 최대 40% 증가했습니다.

  • 서비스 안정성이 향상되고 빠른 재시작 속도가 증가했습니다.

벤치마크는 다음을 사용한 카오스 생성 데이터로 제작되었습니다 고급 예시 구성.

2.1.0 (2025년 2월 24일)

⚠️ 호환성 파괴 변경:

  • 다음에서 게임 프로파일과 확장 단계 정보를 분리했습니다 심층 분석:

    • MM_MATCH_PROFILE 은 이제 구성에 나타나는 대로 프로파일 이름만 포함합니다.

    • 다음 도입 MM_EXPANSION_STAGE 로, 확장 단계를 문자열(예: "initial", "15", "30")로 포함합니다.

  • 티켓 할당에는 이제 다음일 때 그룹 ID가 포함됩니다 심층 분석. 그룹 ID는 또한 심층 분석로 포함되며, 그룹 ID를 그룹 플레이어 ID 목록에 매핑한 값입니다.

  • 티켓 할당에는 이제 다음일 때 팀 ID가 포함됩니다 심층 분석. 팀 ID는 모든 티켓 데이터에도 포함됩니다 심층 분석.

  • 심층 분석 이제 다음을 반환합니다 409 Conflict HTTP 코드(다음 대신) 204 No Content 배포가 시작 중이라 티켓을 삭제할 수 없음을 나타내기 위해. 이탈자를 대체하려면, 서버가 사전 지정된 타임아웃 이후 발급하는 심층 분석 를 사용하세요.

  • 심층 분석 요청 본문 파라미터 attributes.deployment_request_id 가 다음으로 이동했습니다 attributes.assignment.request_id.

  • 심층 분석 요청 본문은 이제의 일부로 전체 할당 세부 정보를 요구합니다 attributes 파라미터에, 추가로 request_id.

🩹 버그 수정:

  • 해결된 교집합 규칙 값은 이제 심층 분석 에서 MM_INTERSECTION 환경 변수로 제공됩니다.

  • 빠른 재시작 기능이 이제 구성 변경 시 API 엔드포인트와 openAPI 사양을 안정적으로 재생성합니다.

  • 매치메이커 (재)시작 중 시작 시간이 길어지거나 매치메이커가 멈추게 하던 여러 버그를 수정했습니다.

✨ 개선 및 신규 기능:

  • 모든 매치메이커 티어 전반에 걸쳐 모든 API 엔드포인트의 속도 제한과 확장성을 높였습니다.

  • 플레이어를 다음에 할당할 때 심층 분석에, 새 플레이어의 티켓 ID가 백필의 다음에 태그로 추가됩니다 배포.

  • 웹 UI에서 포스트맨 없이 직접 API를 테스트할 수 있도록 스웨거 UI 인증 기능을 추가했습니다.

  • 현실적인 요청과 응답을 더 가깝게 반영하도록 openAPI 예시를 개선했습니다.

  • 새로운 심층 분석 를 추가했으며, 개발 및 디버깅 목적을 위한 것입니다.

    • 현재 플레이어 티켓을 페이지네이션 목록으로 나열할 수 있습니다.

    • 현재 매치를 페이지네이션 목록으로 나열할 수 있습니다.

1.0.0 (2024년 12월 9일)

  • 심층 분석: (많은) 요청에 따라, 플레이어가 세션을 떠날 때 서버 좌석을 재사용할 수 있도록 자동 티켓 할당이 포함된 백필을 추가합니다.

    • 매치가 시작된 후 빈 플레이어 좌석을 채우거나, 매치 중에 떠난 플레이어를 교체하는 데 이상적입니다.

  • 심층 분석: 여러 팀을 플레이어로 채우는 기존 기능에 더해 그룹으로 참가하는 기능을 추가합니다.

    • 친구들과 그룹으로 매치메이킹 대기열에 참여하거나 공통 로비에서 합류할 때 이상적입니다.

  • 개발자 도구개발자 도구 매치메이킹 SDK:

    • 통합을 쉽게 하기 위해 가장 인기 있는 게임 엔진용 소프트웨어 개발 키트를 제공합니다.

  • 다음에서 버그를 수정했습니다 심층 분석 가 올바르게 적용되지 않던 문제.

  • 이제 다음 이후 티켓이 자동으로 취소됩니다 심층 분석 배포에 할당되지 않은 경우.

  • 이제 다음을 수행할 수 있습니다 심층 분석 로 매치메이킹 프로세스의 흐름을 향상시킬 수 있습니다.

  • 매치메이커가 수행한 배포에는 이제 티켓 ID가 태그로 지정됩니다.

  • 매치메이커가 실행 중일 때도 구성을 편집할 수 있습니다. 이는 매치메이커의 완전한 온/오프 사이클 없이 구성의 빠른 리로드를 트리거합니다. 참고: 이 기능은 현재 티켓을 모두 삭제하고 일시적으로 API가 응답하지 않게 만들기 때문에 프로덕션 환경에서는 권장되지 않습니다.

  • 수정: 심층 분석 올바른 프리미티브 타입을 배열 대신 사용하도록

  • 수정: 심층 분석 JSON 값(이전에는 이스케이프된 문자를 포함).

0.2.3 (2024년 10월 8일)

이 버전은 더 이상 지원되지 않습니다. 매치메이커에는 더 최신 버전을 사용하십시오.

  • WebGL 애플리케이션에서 요청이 발생할 때( CORS 정책) 매치메이커가 특정 헤더를 허용하지 않던 버그를 수정했습니다.

0.2.2 (2024년 10월 3일)

이 버전은 더 이상 지원되지 않습니다. 매치메이커에는 더 최신 버전을 사용하십시오.

  • TLS/SSL 인증서 검증 문제로 매치메이커 실행이 방해되던 문제를 수정했습니다.

0.2.1 (2024년 9월 30일)

이 버전은 더 이상 지원되지 않습니다. 매치메이커에는 더 최신 버전을 사용하십시오.

  • 비콘 엔드포인트가 500 오류를 반환하던 버그를 수정했습니다.

0.2.0 (2024년 9월 25일)

이 버전은 더 이상 지원되지 않습니다. 매치메이커에는 더 최신 버전을 사용하십시오.

  • 기본 인증이 모든 엔드포인트에서 필수가 되었습니다.

  • 서버 할당 실패 시 재시도 횟수를 구성할 수 있는 기능을 추가했습니다.

  • 팀 기반 매치메이킹이 모든 매치메이킹 구성의 기본값이 되었습니다.

  • 이제 모든 프로파일에서 애플리케이션과 버전이 필수 필드입니다.

  • 매치메이커 상태를 모니터링하는 새로운 엔드포인트를 도입했습니다.

  • 배포에서 티켓 환경 변수의 형식을 업데이트했습니다.

  • 호스트가 매치메이커와 통신할 수 있도록 하는 구성 옵션을 추가했습니다.

  • 디버그 API는 이제 구성에서 명시적으로 활성화된 경우에만 사용 가능합니다(현재 리워크를 위해 비활성화됨).

  • 다음 game_profile 키는 GET 티켓 응답에서 다음으로 대체되었습니다 profile.

Last updated

Was this helpful?