Ниска латентност, голям мащаб на опашка от съобщения

Преминавам през известно преосмисляне на мащабните мултиплейър игри в ерата на Facebook приложенията и облачните изчисления.

Да предположим, че трябва да създам нещо върху съществуващи отворени протоколи и искам да обслужвам 1 000 000 играчи едновременно, само за да обхвана проблема.

Да предположим, че всеки играч има опашка от входящи съобщения (за чат и какво ли още не) и средно още една опашка от входящи съобщения (гилдии, зони, инстанции, търг, ...), така че имаме 2 000 000 опашки. Играчът ще слуша 1-10 опашки наведнъж. Всяка опашка ще има средно може би 1 съобщение в секунда, но определени опашки ще имат много по-висока скорост и по-голям брой слушатели (да речем, опашка за „локация на обект“ за екземпляр на ниво). Нека приемем, че латентността на системната опашка е не повече от 100 милисекунди, което е добре за умерено ориентирани към действие игри (но не и игри като Quake или Unreal Tournament).

От други системи знам, че обслужването на 10 000 потребители на една 1U или блейд кутия е разумно очакване (ако приемем, че не се случва нищо друго скъпо, като симулация на физика или какво ли още не).

И така, с кръстосана клъстерна система, където клиентите се свързват към шлюзове за връзка, които от своя страна се свързват със сървъри за опашки за съобщения, ще получим 10 000 потребители на шлюз със 100 шлюзови машини и 20 000 опашки за съобщения на сървър за опашки със 100 машини за опашки. Отново, само за общ обхват. Броят на връзките на всяка MQ машина ще бъде малък: около 100, за да се говори с всеки от шлюзовете. Броят на връзките на шлюзовете ще бъде много по-висок: 10 100 за клиентите + връзки към всички сървъри на опашка. (Освен това добавете някои връзки за сървъри за симулация на света на играта или какво ли още не, но засега се опитвам да запазя това отделно)

Ако не исках да създам това от нулата, трябваше да използвам някаква инфраструктура за съобщения и/или опашка, която съществува. Двата отворени протокола, които мога да намеря, са AMQP и XMPP. Предназначеното използване на XMPP е малко повече като това, от което тази игрова система би се нуждаела, но режийните разходи са доста забележими (XML, плюс подробните данни за присъствие, плюс различни други канали, които трябва да бъдат изградени отгоре). Действителният модел на данни на AMQP е по-близък до това, което описвам по-горе, но всички потребители изглеждат големи корпорации от корпоративен тип и работните натоварвания изглежда са свързани с работния процес, а не с актуализация на играта в реално време.

Някой има ли дневен опит с тези технологии или техни реализации, който можете да споделите?


person Jon Watte    schedule 17.12.2009    source източник
comment
Бих искал да обобщя какво направихме в крайна сметка. Rabbit, Qpid, ZeroMQ и останалите всички имаха повече бизнес-ey и по-малко ниска латентност-ey дизайнерски решения и паднаха на необходимостта да се доверят на клиента или не поддържат високи нива на присъединявания/напускания/създаване/изтриване на опашка, или подобен. XMPP не се обединява добре в първата физическа кутия. JMS е дори по-лош от Rabbit and friends. Redis Pub/Sub е интересен, но отново не обединява/групира. В крайна сметка написахме наши собствени върху Erlang/OTP (същия език, използван за Rabbit и ejabberd), използвайки буфери на протокола на Google като IDL на ниско ниво.   -  person Jon Watte    schedule 05.12.2010
comment
благодаря за споделянето, какво имаш предвид под XMPP не се обединява добре в първата физическа кутия?   -  person alex    schedule 27.09.2012
comment
Имах предвид не се обединява добре /след/ първата физическа кутия. Добавянето на хардуер не прави много за мащабирането, защото XMPP е грешният избор на протокол там.   -  person Jon Watte    schedule 27.09.2012


Отговори (5)


@MSalters

Повторно „опашка за съобщения“:

Операцията по подразбиране на RabbitMQ е точно това, което описвате: преходен pubsub. Но с TCP вместо UDP.

Ако искате гарантирана евентуална доставка и други функции за устойчивост и възстановяване, тогава МОЖЕТЕ да имате и това - това е опция. Това е целият смисъл на RabbitMQ и AMQP - можете да имате много поведения само с една система за доставка на съобщения.

Моделът, който описвате, е поведението ПО ПОДРАЗБИРАНЕ, което е преходно, „изстрелва и забравя“ и насочва съобщенията до мястото, където са получателите. Хората използват RabbitMQ за откриване на мултикаст на EC2 точно поради тази причина. Можете да получите UDP тип поведение през unicast TCP pubsub. Чисто, а?

Re UDP:

Не съм сигурен дали UDP би бил полезен тук. Ако изключите Nagling, латентността на единично съобщение RabbitMQ (клиент-брокер-клиент) е измерена на 250-300 микросекунди. Вижте тук за сравнение със забавянето на Windows (което беше малко по-високо) http://old.nabble.com/High%28er%29-latency-with-1.5.1--p21663105.html

Не мога да се сетя за много игри за мултиплейър, които се нуждаят от латентност при двупосочно предаване под 300 микросекунди. Можете да стигнете под 300us с TCP. Прозорецът на TCP е по-скъп от необработения UDP, но ако използвате UDP, за да работите по-бързо, и добавите персонализиран мениджър за възстановяване на загуба или seqno/ack/resend, това може да ви забави отново. Всичко зависи от вашия случай на употреба. Ако наистина наистина трябва да използвате UDP и мързеливи acks и т.н., тогава можете да премахнете TCP на RabbitMQ и вероятно да го направите.

Надявам се това да помогне да се изясни защо препоръчах RabbitMQ за случая на използване на Jon.

person alexis    schedule 18.12.2009
comment
Благодаря за предложенията. Алтернатива на Rabbit е Qpid, който изисква 6 милиона съобщения в секунда на един 8-ядрен сървър (!), когато се изпълнява на ядрото с ниска латентност на Red Hat. Съмнявам се обаче, че тази кутия също е имала 10 000 потребители, свързани едновременно. Ако имате добра връзка за сравнение на Rabbit срещу Qpid, ще се радвам да я видя! - person Jon Watte; 19.12.2009
comment
Джон, моля, можеш ли да ме насочиш към препратката 6M? Имам чувството, че се отнася за случай, който RabbitMQ и Qpid са тествали с (данни за финансовия пазар) OPRA канал преди известно време. Това е добър случай, но доколкото си спомням, и двамата използвахме пакетиране и компресиране, за да получим по-висока скорост. Обърнете внимание, че в случая на OPRA използването както на групиране, така и на компресиране е стандартна практика. При сравняване на двамата брокери в подобни случаи наскоро, нищо не идва веднага на ум, но гугълът може да разкрие повече. Наздраве Алексис - person alexis; 21.12.2009
comment
Да, това вероятно е тестът. Цифрата 6 милиона беше на сайта на Red Hat за тяхното внедряване на Qpid с ниска латентност, базирано на Linux. И този тестов случай няма почти нищо общо със случая, който ме интересува, който има проблем с 1 000 000 свързани потребители, всеки от които получава само няколко съобщения в секунда... - person Jon Watte; 22.12.2009

Сега всъщност изграждам такава система.

Направих доста оценка на няколко MQ, включително RabbitMQ, Qpid и ZeroMQ. Забавянето и пропускателната способност на всяко от тях са повече от достатъчни за този тип приложение. Това, което не е добре обаче, е времето за създаване на опашка в средата на половин милион опашки или повече. По-специално Qpid се влошава доста сериозно след няколко хиляди опашки. За да заобиколите този проблем, обикновено ще трябва да създадете свои собствени механизми за маршрутизиране (по-малък брой общи опашки и потребителите на тези опашки получават съобщения, които не ги интересуват).

Текущата ми система вероятно ще използва ZeroMQ, но по доста ограничен начин, вътре в клъстера. Връзките от клиенти се обработват с персонализирана SIM карта. демон, който създадох с помощта на libev и е изцяло еднонишков (и показва много добро мащабиране -- би трябвало да може да обработва 50 000 връзки на една кутия без никакви проблеми -- скоростта на sim. tick обаче е доста ниска и има без физика).

XML (и следователно XMPP) не е много подходящ за това, тъй като ще закрепите процесора за обработка на XML много преди да се обвържете с I/O, което не е това, което искате. В момента използваме Google Protocol Buffers и те изглеждат подходящи за нашите конкретни нужди. Ние също използваме TCP за клиентски връзки. Имах опит с използването както на UDP, така и на TCP за това в миналото и както беше посочено от други, UDP наистина има известно предимство, но е малко по-трудно да се работи с него.

Надяваме се, че когато сме малко по-близо до стартирането, ще мога да споделя повече подробности.

person Tim McClarren    schedule 03.02.2010

Джон, това звучи като идеален случай за използване на AMQP и RabbitMQ.

Не съм сигурен защо казвате, че всички потребители на AMQP са големи корпорации от корпоративен тип. Повече от половината от нашите клиенти са в „уеб“ пространството, вариращо от големи до малки компании. Много игри, системи за залагания, системи за чат, системи от тип twitter и инфра облачни изчисления са изградени от RabbitMQ. Има дори приложения за мобилни телефони. Работните процеси са само един от многото случаи на използване.

Опитваме се да следим какво се случва тук:

http://www.rabbitmq.com/how.html (уверете се, че щракнете върху списъците със случаи на употреба на del.icio.us също!)

Моля, разгледайте. Ние сме тук, за да помогнем. Чувствайте се свободни да ни пишете на [email protected] или да ми пишете в twitter (@monadic).

person alexis    schedule 18.12.2009

Моят опит беше с неотворена алтернатива, BizTalk. Най-болезненият урок, който научихме, е, че тези сложни системи НЕ са бързи. И както разбрахте от хардуерните изисквания, това се превръща директно в значителни разходи.

Поради тази причина дори не се доближавайте до XML за основните интерфейси. Вашият сървърен клъстер ще анализира 2 милиона съобщения в секунда. Това лесно може да бъде 2-20 GB/sec XML! Повечето съобщения обаче ще бъдат за няколко опашки, докато повечето опашки всъщност са с нисък трафик.

Затова проектирайте архитектурата си така, че да е лесно да започнете със сървъри за опашки COTS и след това да преместите всяка опашка (тип) към персонализиран сървър за опашки, когато се идентифицира пречка.

Освен това, поради подобни причини, не приемайте, че архитектурата на опашка за съобщения е най-добрата за всички комуникационни нужди, които вашето приложение има. Вземете вашия пример за „местоположение на обект в екземпляр“. Това е класически случай, когато не искате гарантирана доставка на съобщение. Причината, поради която трябва да споделите тази информация е, че тя се променя през цялото време. Така че, ако дадено съобщение е изгубено, не искате да губите време за възстановяването му. Ще изпратите само старото местоположение на засегнатия обект. Вместо това бихте искали да изпратите текущото местоположение на този обект. Технологично това означава, че искате UDP, а не TCP и персонализиран механизъм за възстановяване на загуби.

person MSalters    schedule 18.12.2009
comment
Да: Проблемът с TCP идва, когато пуснете пакет. Застоят преди възстановяването може да бъде значителен -- и с TCP ядрото ще задържи по-нова информация само защото по-стара информация още не е пристигнала. За игри (като актуализации на позиции) това не е желателно. Обърнете внимание, че клиентите за опашка за съобщения са всички потребители, разпределени по целия свят -- те не са в самия клъстер, така че мрежовите проблеми са факт от живота. (Всъщност, дори в добре свързани сървърни стаи, ще видите известно количество загуба на пакети, привидно без значение колко големи са вашите комутатори и буфери) - person Jon Watte; 19.12.2009

FWIW, за случаите, когато междинните резултати не са важни (като информация за позициониране), Qpid има "опашка с последна стойност", която може да достави само най-новата стойност на абонат.

person Steve Huston    schedule 29.12.2009
comment
Страхотно е да знаеш! Всъщност проверих и създадох Qpid и сега го изпробвам. Това, което не ми харесва особено, е, че конфигурацията по подразбиране е ограничена до 300 връзки. Ще направи ли 20 000 връзки на кутия? - person Jon Watte; 30.12.2009
comment
Отговорих по-задълбочено в списъка на [email protected], но за да затворя празнината тук, да, извършването на 20 000 връзки на кутия не би трябвало да е проблем, ако приемем, че имате достатъчно хардуерни конски сили. - person Steve Huston; 01.01.2010