Здравствуйте, нам требуется сделать сервер для браузерной игры, рассчитанный на высокие нагрузки. Клиент у нас на Flash. Ожидаемый онлайн > 100к.
Сервер мы хотим сделать так, чтобы он эффективно справлялся со следующими задачами:
1) Асинхронно принимать запросы, сохранять данные в БД, отправлять ответы;
2) Данные могут поступать на сервер в большом кол-ве, точнее с большой частотой, возможно даже очень большой, поэтому возникает потребность в быстрой БД;
3) Сервер должен масштабироваться горизонтально.
Мы очень колеблемся относительно того, на чем его писать. С одной стороны быстрый, но тяжелый в написании «Cи», с другой стороны простой и удобный Python. Поскольку опыта с высоко нагруженными системами у нас мало, мы не можем с уверенностью для себя решить, как же поступить сейчас, чтобы не прогадать потом…
Поэтому мы хотели бы спросить помощи у хабралюдей, которые возможно имели подобный опыт. Мы бы хотели узнать, на каком языке нам лучше остановиться, какую лучше взять БД, воспользоваться ли каким-либо фреймворком? Мы очень боимся прогадать, а статьи в сети дают еще больше вопросов, нежели ответов.
Мы будем признательны любому совету или возможно даже личному опыту.
Если опыта нет, то вы с веротностью 100% наступите на грабли, сядете в лужу и вам придётся всё переписывать. Если бы опыт хайлоада был, то вероятность была бы меньше, но всё равно большая.
Это нужно принять как есть. Что бы вы ни делали, если у вашего проекта всё будет хорошо, то в плане нагрузки вы многое сделаете неправильно.
Поэтому пишите на питоне, а когда напишете всю логику и устаканите архитектуру, то спокойно переписывайте на плюсы (да. на плюсы. чтобы написать всё на си, у вас уйдёт намного больше времени, поэтому используйте всё-таки плюсы)
Не знаю насколько мой опыт вам поможет, но мы решали большую нагрузку тремя вещами:
1. nginx
2. несколько бесконечных процессов на python (fastcgi + wsgi chain (flup)). (Процессы могут быть не только на вашем сервере ;-))
3. MySQL table Memory. Раз за какой-то промежуток времени записываются данные в таблицы на диск.
4. вся статика не у нас. (но это нам надо было ради экономии трафика)
Прикол в том, что для большинства баз не делают асинхронных драйверов, так что нужно либо использовать БД с простым текстовым протоколом и реализовать асинхронный драйвер самостоятельно на уровне сокетов, либо заводить потоки под соединения с БД и буферизировать данные.
Но вообще конечно лучше сперва написать на питоне, провести нагрузочные тесты и выяснить узкие места. Оптимизировать Python код, возможно часть переписать на C как модуль для питона.
Железо в наше время дешевле рабочей силы, так что я бы советовал писать на питоне, как писали выше всегда можно узкую часть переписать на том же си, а если будет все прям так уж плохо просто докупить железа. Контакт ведь работает на пхп, и у него онлайн на много больше 100к. Так что дело не в языке а в навыках.
Месье alternativshik говорит дело. Используйте торнадо и редис. Для простых очередей в redis почитайте про команду brpoplpush, а для грамотной асинхронщины на торнадо — про то как писать асинхронный код в синхронном стиле. И будет вам счастье.
В сентябре прошлого года у меня стоял такой же вопрос. Я решил пользовать NodeJS.
К сожалению, не могу подтвердить личного опыта «как у NodeJS с нагрузкой». Но, камрады из Америки все в один голос только положительные комментарии и по простоте и по производительности (то есть, отрицательные комментарии в интернете в сторону NodeJS, как правило, дают люди, которые им не пользовались).
Используйте фейсбуковский торнадо на питоне, + какой-нить редис для создания очередей или хранения кей-велью данных и быстрого доступа к ним, остальное — по желанию.
Можно использовать и Python и Node.js, но производительность у сервера на Си будет выше. Поэтому тут больше вопрос в том, какую технологию вам будет проще(по деньгам или по человекоресурсам) использовать. Если брать техническую сторону, то, конечно же, лучше Си.
Насчет БД — даже mysql хорошо справится с нагрузкой, для key-value решений можно обратить внимание на Redis.
Фреймворков на Си не подскажу, на Python есть Twisted and Tornado, но не уверен что они подойдут под вашу задачу.
Ммм. Я в принципе согласен с ответом выше про грабли. Но можно же использовать и C, и Python — на C реализовать только приём/запись/отправку данных, а на python написать логику. Twisted не самый быстрый сетевой фреймворк.
Например так, клиент открывает постоянное соединение с сервером (TCP или UDP решать вам (в случае UDP никакого постоянного соединения, конечно, нет)), попадает на балансировщик, тот создаёт или выбирает свободный процесс программы на C, которая принимает данные, записывает в базу, уведомляет скрипт на Python, что игровое состояние изменилось, он в свою очередь просчитывает изменения, формирует данные на отправку и рассылает подверженным клиентам через те же процессы на C.
Общаться программы могут либо через общую память, либо через udp сокеты.