2009-04-29 5 views
1

많은 테이블을 호스팅하는 포커 게임 서버를 고려해보십시오. 로비에있는 동안 플레이어는 모든 활성 테이블과 통계를 볼 수 있습니다. 이 통계는 플레이어가 테이블에 가입하고 게임을하며 떠날 때마다 지속적으로 변경됩니다. 테이블을 추가하고 닫을 수 있습니다. 어쨌든 이러한 변경 사항은 클라이언트에 알려야합니다.많은 클라이언트와 서버의 목록을 동기화하는 방법은 무엇입니까?

이 기능을 구현하는 방법은 무엇입니까? 로비에 TCP/UDP를 사용 하시겠습니까? (즉, 사용자가 로비를 관찰하기 위해 서버에 연결해야합니까, 아니면 요청 - 응답 메커니즘을 사용할 것입니까?) 서버가 클라이언트에게 각 이벤트를 알리겠습니까? 아니면 클라이언트가 서버를 폴링해야합니까?

명심하십시오. 아마도 이러한 시스템의 가장 중요한 목표는 확장 성입니다. 모든 사용자는 여러 대의 서버로 구성된 하나의 큰 목록을보아야하는 반면, 더 많은 서버를 추가하여 쉽게 처리 할 수 ​​있어야합니다.

답변

1

이 특정 문제는 응용 프로그램 디자인에서 클라이언트가 서버에 연결하는 방법과 관련하여 매우 기본적인 문제가 있음을 나타냅니다.

확장 성이 문제가되면 Reactor design pattern과 같은 비 차단 I/O 패턴을 사용하여 항상 확장 가능한 솔루션을 사용해야합니다. 이러한 패턴의 작동 및 테스트가 이미 완료된 표준 솔루션을 사용하는 것이 훨씬 더 바람직합니다.

지속적으로 업데이트되는 신속한 게임이 포함 된 특히 귀하의 경우에는 TCP를 통해 각 클라이언트에 대한 연결을 보유하는 확장 가능한 서버 (다시 말해 비 차단 I/O) 그가 알아야 할 정보를 업데이트합니다.

요청 응답주기가 적절하지 않은 것으로 들리지만 응용 프로그램의 정확한 사양에 맞는지 확인해야합니다.

서버가 목록에 적용된 작업의 고정 된 길이의 큐를 유지 인터페이스를 통해 (추가, 제거 및 exsisting 항목을 변경) 목록을 업데이트 : 내 기본 제안의

+0

내가 확장성에 대해 메모하는 이유는 정확한 사양을 알지 못한다는 것입니다.하지만 예를 들어 반복적으로 업데이트되는 활성 테이블 목록이있는 온라인 포커 게임의 로비를 예로 들겠습니다. 구체적인 번호가 필요하다면 PokerStarts에 200,000 명의 플레이어와 30,000 개의 테이블이 있습니다 – Meat

0

. 각 작업에는 타임 스탬프가 제공됩니다. 대기열이 가득 차면 가장 오래된 작업이 순차적으로 폐기됩니다.

사용자가 처음으로 목록을 검색해야하는 경우 서버는 전체 목록을 보내도록 서버에 요청합니다. 서버는 현재 시간 소인과 함 2 목록을 보냄니다.

각각의 임의의 시간 (10-30 초?)에 한번 클라이언트는 서버에 그가받은 타임 스탬프 이후에 목록에 적용된 모든 작업을 보내도록 요청합니다. 그런 다음 서버는 타임 스탬프가 여전히 목록에 표시되는지 (즉, 첫 번째 항목의 타임 스탬프보다 큼) 체크하고, 그렇다면 클라이언트가 그 시간부터 현재까지 발생한 작업 목록을 플러스 현재의 타임 스탬프 너무 오래되면 서버는 전체 목록을 다시 보냅니다.

UDP는 "업데이트주기"가 사라지면 큰 문제가 아니기 때문에이 접근 방식에 적합합니다.

+0

원래 질문에 이와 같은 정보를 추가하고 자신에 대한 답변을 열지 마십시오. –

+0

왜? 그것은 하나 이상의 해결책을 가질 수있는 열린 질문입니다.이것이 제가 제안하는 하나의 해결책이며, 그것은 질문과 무관합니다. – Meat

관련 문제