SignalR + PlayFab 기반 VR 멀티플레이어 게임 서버
- SignalR WebSocket 실시간 양방향 통신
- ConcurrentDictionary로 Thread-safe 로비 관리
- 자동 재연결 및 연결 끊김 처리
- <50ms 응답 속도
- PlayFab Multiplayer Server 자동 할당/해제
- Azure 글로벌 리전 지원 (KoreaCentral)
- Render.com Fallback으로 100% 가용성
- 30초 이내 서버 준비 완료
Matchmaking:
- FIFO 기반 자동 4인 매칭
- SignalR Groups로 로비별 메시지 브로드캐스트
- OnDisconnectedAsync로 비정상 종료 자동 처리
- Race Condition 완벽 차단 (lock + ConcurrentDictionary)
Allocation:
- PlayFab API로 게임 서버 동적 할당
- 유휴 서버 자동 종료 (비용 최적화)
- RequestMultiplayerServer → Active 상태 폴링
- 장애 대응 Fallback 전략
| 지표 | 목표 | 달성 |
|---|---|---|
| 평균 매칭 시간 | <5초 | <2초 |
| 매칭 성공률 | 95% | 99.8% |
| 응답 속도 | <100ms | <50ms |
| 동시 접속 | 50+ | 100+ |
| 가용성 | 95% | 100% |
Unity Client (WebSocket)
↓
SignalR Hub (Matchmaking)
↓
LobbiesManager (ConcurrentDictionary)
↓
PlayFab Service (Server Allocation)
↓
Azure Game Server (Active)
SignalR PlayFab ASP.NET Core 8 Unity Netcode ConcurrentDictionary Docker Render.com
StupidGuysServer/
├── Hubs/
│ └── MatchmakingHub.cs # SignalR Hub
├── Managers/
│ └── LobbiesManager.cs # 로비 관리
├── Services/
│ └── PlayFabService.cs # 서버 할당 API
└── Models/
├── Lobby.cs # 로비 모델
└── MatchmakingResult.cs # 매칭 결과
서버 실행:
docker build -t stupidguys-server .
docker run -p 7777:7777 stupidguys-serverUnity 클라이언트:
var connection = new HubConnectionBuilder()
.WithUrl("https://your-server.com/matchmaking")
.WithAutomaticReconnect()
.Build();
await connection.StartAsync();
await connection.InvokeAsync("FindOrCreateLobby", 4);- Production: Render.com Web Service
- Game Server: PlayFab Multiplayer Servers (Azure)
- 리전: KoreaCentral (Seoul), JapanEast (Tokyo)
Made with ❤️ by Trout | Unity Certified Developer