매치메이킹을 하려면 ➊의 루프를 보면서 ➋의 조건문을 만족해야 합니다. ➋의 조건문은 데이터 읽기를 합니다. 즉, 비동기 분산 처리를 할 수 없습니다. 비동기 분산 처리에서는 다른 서버에 명령을 보낼 수는 있으나, 그 명령에 대한 응답을 받을 방법이 없습니다. 다시 말해서 ➋의 if 구문은 구현 자체가 불가능합니다. 이렇게 되면 데이터 복제에 기반을 둔 로컬 처리가 불가피합니다. 이 방식에 근거해서 로비 서버를 분산합시다.
이들 로비 서버는 이렇게 작동하게 합시다.
1. 플레이어 정보 목록을 서로 동기화합니다. 플레이어 정보에는 플레이어 실력에 대한 정보와 ‘매칭을 기다리는 중’ 여부를 나타내는 불형 값이 있습니다.
2. 매치메이킹을 할 때 조건을 만족하는 플레이어를 이미 동기화받은 플레이어 정보 목록에서 찾아냅니다.
3. 매치메이킹이 끝난 플레이어를 배틀 서버로 이동시킵니다.
작동 방식을 구체적으로 나열해 봅시다.
1. 당연히 로비 서버를 여러 대 두어야 합니다.
2. 클라이언트는 로비 서버 중 아무것이나 하나 골라 그 안에서 접속하게 합니다.
3. 모든 로비 서버 간 통신을 통해 플레이어 목록을 동기화합시다. 예를 들어 플레이어 A가 매칭 시작 버튼을 누르면, 플레이어 A가 접속된 로비 서버 1은 나머지 로비 서버한테 ‘플레이어 A가 매칭 대기 중 = TRUE’라고 알려 줍니다. 나머지 로비 서버는 이를 자기가 가진 플레이어 목록에 업데이트합니다.
▲ 그림 10-28 로비 서버 1이 플레이어 A의 상태 변화를 알림