Асинхронный сервер: C или Python?

Здравствуйте, нам требуется сделать сервер для браузерной игры, рассчитанный на высокие нагрузки. Клиент у нас на Flash. Ожидаемый онлайн > 100к.

Сервер мы хотим сделать так, чтобы он эффективно справлялся со следующими задачами:

1) Асинхронно принимать запросы, сохранять данные в БД, отправлять ответы;

2) Данные могут поступать на сервер в большом кол-ве, точнее с большой частотой, возможно даже очень большой, поэтому возникает потребность в быстрой БД;

3) Сервер должен масштабироваться горизонтально.



Мы очень колеблемся относительно того, на чем его писать. С одной стороны быстрый, но тяжелый в написании «Cи», с другой стороны простой и удобный Python. Поскольку опыта с высоко нагруженными системами у нас мало, мы не можем с уверенностью для себя решить, как же поступить сейчас, чтобы не прогадать потом…



Поэтому мы хотели бы спросить помощи у хабралюдей, которые возможно имели подобный опыт. Мы бы хотели узнать, на каком языке нам лучше остановиться, какую лучше взять БД, воспользоваться ли каким-либо фреймворком? Мы очень боимся прогадать, а статьи в сети дают еще больше вопросов, нежели ответов.



Мы будем признательны любому совету или возможно даже личному опыту.

Заранее спасибо!
  • Вопрос задан
  • 7258 просмотров
Решения вопроса 1
CKOPOBAPKuH
@CKOPOBAPKuH
Если опыта нет, то вы с веротностью 100% наступите на грабли, сядете в лужу и вам придётся всё переписывать. Если бы опыт хайлоада был, то вероятность была бы меньше, но всё равно большая.
Это нужно принять как есть. Что бы вы ни делали, если у вашего проекта всё будет хорошо, то в плане нагрузки вы многое сделаете неправильно.

Поэтому пишите на питоне, а когда напишете всю логику и устаканите архитектуру, то спокойно переписывайте на плюсы (да. на плюсы. чтобы написать всё на си, у вас уйдёт намного больше времени, поэтому используйте всё-таки плюсы)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 11
Не знаю насколько мой опыт вам поможет, но мы решали большую нагрузку тремя вещами:
1. nginx
2. несколько бесконечных процессов на python (fastcgi + wsgi chain (flup)). (Процессы могут быть не только на вашем сервере ;-))
3. MySQL table Memory. Раз за какой-то промежуток времени записываются данные в таблицы на диск.
4. вся статика не у нас. (но это нам надо было ради экономии трафика)
Ответ написан
seriyPS
@seriyPS
Прикол в том, что для большинства баз не делают асинхронных драйверов, так что нужно либо использовать БД с простым текстовым протоколом и реализовать асинхронный драйвер самостоятельно на уровне сокетов, либо заводить потоки под соединения с БД и буферизировать данные.
Но вообще конечно лучше сперва написать на питоне, провести нагрузочные тесты и выяснить узкие места. Оптимизировать Python код, возможно часть переписать на C как модуль для питона.
Ответ написан
Комментировать
taliban
@taliban
php программист
Железо в наше время дешевле рабочей силы, так что я бы советовал писать на питоне, как писали выше всегда можно узкую часть переписать на том же си, а если будет все прям так уж плохо просто докупить железа. Контакт ведь работает на пхп, и у него онлайн на много больше 100к. Так что дело не в языке а в навыках.
Ответ написан
Мне кажется тут подходит Erlang.
Ответ написан
Комментировать
a11aud
@a11aud
Месье alternativshik говорит дело. Используйте торнадо и редис. Для простых очередей в redis почитайте про команду brpoplpush, а для грамотной асинхронщины на торнадо — про то как писать асинхронный код в синхронном стиле. И будет вам счастье.
Ответ написан
Комментировать
mentatxx
@mentatxx
Рекомендую почитать www.kegel.com/c10k.html
Ответ написан
Комментировать
kocherman
@kocherman
В сентябре прошлого года у меня стоял такой же вопрос. Я решил пользовать NodeJS.
К сожалению, не могу подтвердить личного опыта «как у NodeJS с нагрузкой». Но, камрады из Америки все в один голос только положительные комментарии и по простоте и по производительности (то есть, отрицательные комментарии в интернете в сторону NodeJS, как правило, дают люди, которые им не пользовались).
Ответ написан
alternativshik
@alternativshik
Используйте фейсбуковский торнадо на питоне, + какой-нить редис для создания очередей или хранения кей-велью данных и быстрого доступа к ним, остальное — по желанию.
Ответ написан
Комментировать
angered
@angered
Можно использовать и Python и Node.js, но производительность у сервера на Си будет выше. Поэтому тут больше вопрос в том, какую технологию вам будет проще(по деньгам или по человекоресурсам) использовать. Если брать техническую сторону, то, конечно же, лучше Си.
Насчет БД — даже mysql хорошо справится с нагрузкой, для key-value решений можно обратить внимание на Redis.
Фреймворков на Си не подскажу, на Python есть Twisted and Tornado, но не уверен что они подойдут под вашу задачу.
Ответ написан
Комментировать
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Ммм. Я в принципе согласен с ответом выше про грабли. Но можно же использовать и C, и Python — на C реализовать только приём/запись/отправку данных, а на python написать логику. Twisted не самый быстрый сетевой фреймворк.
Например так, клиент открывает постоянное соединение с сервером (TCP или UDP решать вам (в случае UDP никакого постоянного соединения, конечно, нет)), попадает на балансировщик, тот создаёт или выбирает свободный процесс программы на C, которая принимает данные, записывает в базу, уведомляет скрипт на Python, что игровое состояние изменилось, он в свою очередь просчитывает изменения, формирует данные на отправку и рассылает подверженным клиентам через те же процессы на C.
Общаться программы могут либо через общую память, либо через udp сокеты.
Ответ написан
Комментировать
VBart
@VBart
uWSGI ;-)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы