문제

나의 비트를 통해 다시 생각하는 대규모의 게임에서 연령의 Facebook 애플리케이션과 클라우드 컴퓨팅에 있습니다.

가정 내가 뭔가를 구축에 최고의 기존 프로토콜,그리고 내가 원하는 봉사하 1,000,000 동시 플레이어,다만 범위는 문제입니다.

가정은 각 플레이어가 들어오는 메시지 큐(채팅,이것 저것),및 평균 중 하나 더 들어오는 메시지 큐(길드,지역 경우,경매,...)그래서 우리는 2,000,000 큐입니다.플레이어를 듣고 1-10 큐니다.각 큐에 있을 것이 평균 어쩌면 초당 1 개의 메시지,하지만 특정 큐가 있을 것이 훨씬 더 높은 속도와 높은 수의 청취자(예를 들어,"실체의 위치"큐 수준에 대한 인스턴스).가정하자 보다는 더 이상 100 밀리초 시스템의 큐 대기 시간,확인을 위해 약간 작업 중심의 게임(하지만 같은 게임을 지진 또는 Unreal Tournament).

다른 시스템에서,내가 알고있는 제공 10,000 명의 사용자에 단일 1U 또는 블레이드 상자가 합리적인 기대를(가정용의 비싼 것에,같은 물리학 시뮬레이션 또는 이것 저것).

그래서,크로스바 클러스터 시스템,클라이언트에 연결 연결 게이트웨이에 연결하는 메시지 큐,서버는 우리가 얻을 10,000 당 사용자 게이트웨이는 100 게이트웨이 기계,20,000 메시지 큐 큐당 서버 100 큐 기계입니다.다시,그에 대한 일반적인 범위 지정합니다.숫자의 연결에서 각 MQ 기계 것이 작은:약 100 이야기하고,각각의 게이트웨이.숫자의 연결에서 게이트웨이 될 것이 많이 더 높은:10,100 한 클라이언트+연결하는 모든 큐에 서버에 있습니다.(이런 상황에서,추가부 연결을 위한 게임이 시뮬레이션 서버는 이것 저것 하지만,나는 유지하려는 별도에 대한제)

지 않은 경우를 구축하고 이 처음부터 나를 사용하여 어떤 메시지 및/또는 큐 인프라는 존재합니다.두 개의 프로토콜을 나는 찾을 수 있는 디버깅 심볼이 들고 부릅니다..사용 용도의 XMPP 이 조금 더 좋아 이게 무슨 게임 시스템 것이 필요하지만,오버헤드가 매우 눈에 띄는 XML(더 자세한 존재 데이터 플러스,기타 다양한 채널을 구축되어야에서 최고).실제 데이터의 모델그램에 가까운 무엇인가 위에서 설명하지만,모든 사용자가 될 것 같형,기업형 기업,그리고 이 작업을 것 같와 관련된 워크플로,실시간 게임 업데이트 관련이 있습니다.

가 낮은 경험으로 이러한 기술,또는 그 구현할 수 있는 공유?

도움이 되었습니까?

해결책

@msalters

Re 'Message Deue':

RabbitMQ의 기본 작업은 정확히 귀하가 설명하는 것입니다 : 일시적인 pubsub. 그러나 UDP 대신 TCP가 있습니다.

최종 전달 및 기타 지속성 및 복구 기능을 보장하려면이를 가질 수 있습니다. 옵션입니다. 그것이 RabbitMQ와 AMQP의 요점입니다. 하나의 메시지 전달 시스템만으로 많은 동작을 가질 수 있습니다.

당신이 설명하는 모델은 기본 동작이며, 이는 일시적, "화재 및 잊어 버린"및 수신자가있는 곳으로 메시지를 라우팅합니다. 사람들은 RabbitMQ를 사용하여 EC2에서 멀티 캐스트 발견을 수행합니다. Unicast TCP PubSub보다 UDP 유형 동작을 얻을 수 있습니다. 깔끔 했어?

RE UDP :

UDP가 여기서 유용한 지 확실하지 않습니다. nagling을 끄면 RabbitMQ 단일 메시지 Roundtrip Latency (Client-Broker-Client)는 250-300 마이크로 초에서 측정되었습니다. Windows 대기 시간과 비교하려면 여기를 참조하십시오 (조금 더 높았습니다) http://old.nabble.com/high%28er%29-latency-with-1.5.1--p21663105.html

300 마이크로 초 미만의 라운드 트립 대기 시간이 필요한 많은 멀티 플레이어 게임을 생각할 수 없습니다. TCP로 300US 이하로 얻을 수 있습니다. TCP 윈도우 ~이다 RAW UDP보다 비싸지 만 UDP를 사용하여 더 빨리 이동하고 사용자 정의 손실 회복 또는 Seqno/ACK/Resend Manager를 추가하면 다시 속도가 느려질 수 있습니다. 그것은 모두 당신의 사용 사례에 따라 다릅니다. 실제로 UDP와 Lazy Ack 등을 사용해야한다면 RabbitMQ의 TCP를 제거하고 아마도 그것을 뽑을 수 있습니다.

이것이 Jon의 유스 케이스에 RabbitMQ를 추천했는지 명확히하는 데 도움이되기를 바랍니다.

다른 팁

나는 건물은 지금 시스템,실제로.

나는 양의 평가의 여러 가지 지정해 놓은 상태에서 가능합 포함,Shapes,그램,그리고 설치하십.대기 시간 및 처리의 모든 사람들보다 더한 적절한 이러한 유형의 응용 프로그램입니다.무엇이 좋지 않다,그러나,큐 생성 시간 속에서의 반 만에 큐나 더 있습니다.합니다.특히 저하 아주 심각한 후에 몇 천 큐입니다.을 회피하는 문제 당신은 일반적으로 만들려 자신의 라우팅 메커니즘(작은 총 큐,그리고 소비자들에 큐는 메시지를 받지 않는 것에 관심을 가지고).

현재 시스템이 사용하여 설치하십하지만,상당히 제한적으로, 의 클러스터입니다.에서 클라이언트의 연결을 처리와 사용자 지정 시뮬레이션입니다.데몬을 구성하기를 사용하여 패키고 전적으로 하나의 스레드(그리고 보여주는 매우 좋은 스케일링-그것을 처리할 수 있어야 합니다 50,000 연결 중 하나에 상자를 아무 문제없이 우리의 시뮬레이션입니다.틱 속도가 매우 낮지만,없는 물리학).

XML(따라서 XMPP)은 매우 적합하지 않습 이 대로,당신이 말뚝을 CPU 를 XML 을 처리하기 전에 긴 될 수밖에 I/O 지 않는 당신이 무엇을 원합니다.우리가 사용하여 Google 프로토콜 버퍼에서는 순간,그리고 그 것에 적합하의 특정 필요합니다.우리는 또한 사용에 대한 TCP 클라이언트 연결이 있습니다.나는 경험을 모두 사용하여 UDP,TCP 이 과거에 지적으로 다른 사람에 의하여,UDP 가,몇 가지만 약간 더 어려워집니다.

희망이 있을 때 우리는 좀 더 가까이 시작할 수 있을 더 많은 것을 공유하는 정보.

Jon, 이것은 AMQP 및 RabbitMQ의 이상적인 사용 사례처럼 들립니다.

AMQP 사용자가 모두 대규모 엔터프라이즈 유형 기업이라고 왜 말하는지 잘 모르겠습니다. 고객의 절반 이상이 거대한 회사에서 작은 회사에 이르는 '웹'공간에 있습니다. 많은 게임, 베팅 시스템, 채팅 시스템, Twittery 유형 시스템 및 클라우드 컴퓨팅 인프라가 Rabbitmq에서 구축되었습니다. 휴대 전화 응용 프로그램도 있습니다. 워크 플로는 많은 사용 사례 중 하나 일뿐입니다.

우리는 여기서 무슨 일이 일어나고 있는지 추적하려고 노력합니다.

http://www.rabbitmq.com/how.html (del.icio.us의 사용 사례 목록을 클릭하십시오!)

봐주세요. 우리는 도와주기 위해 여기 있습니다. info@rabbitmq.com으로 이메일을 보내 주시거나 트위터 (@monadic)에 나를 때리십시오.

FWIW, 중간 결과가 중요하지 않은 경우 (포지셔닝 정보와 같은) QPID에는 가입자에게 최신 값만 전달할 수있는 "마지막 값 큐"가 있습니다.

저의 경험은 개봉되지 않은 대안 인 Biztalk에 대한 경험이었습니다. 우리가 배운 가장 고통스러운 교훈은 이러한 복잡한 시스템이 빠르지 않다는 것입니다. 하드웨어 요구 사항에서 알 수 있듯이 중요한 비용으로 직접 변환됩니다.

이런 이유로 코어 인터페이스의 경우 XML 근처에 가지 마십시오. 서버 클러스터는 초당 2 백만 개의 메시지를 구문 분석합니다. XML의 2-20GB/초일 수 있습니다! 그러나 대부분의 메시지는 몇 가지 대기열에 대한 것이고 대부분의 대기열은 실제로 교통량이 적습니다.

따라서 COTS 큐 서버로 쉽게 시작할 수 있도록 아키텍처를 설계 한 다음 병목 현상을 식별 할 때 각 큐 (유형)를 사용자 정의 큐 서버로 이동하십시오.

또한 비슷한 이유로 메시지 대기열 아키텍처가 응용 프로그램이 필요로하는 모든 구현에 가장 적합하다고 가정하지 마십시오. "인스턴스의 엔티티 위치"예제를 취하십시오. 이것은 당신이 당신의 고전적인 경우입니다 ~하지 않다 보장 된 메시지 전달을 원합니다. 이 정보를 공유 해야하는 이유는 항상 변경되기 때문입니다. 따라서 메시지가 손실되면 메시지를 복구하는 데 시간을 보내고 싶지 않습니다. 영향을받는 엔티티의 기존 위치 만 보내드립니다. 대신, 당신은 보내고 싶을 것입니다 현재의 그 엔티티의 위치. 기술적으로 이것은 TCP가 아닌 UDP를 원한다는 것을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top