Оцените мою структуру сервера Python - PullRequest
3 голосов
/ 19 января 2009

Я создаю игровой сервер на Python, и я просто хотел получить некоторую информацию об архитектуре сервера, о котором я думал.

Итак, как мы все знаем, Python не может масштабироваться по ядрам с помощью одного процесса. Поэтому на сервере с четырьмя ядрами мне потребуется порождать 4 процесса.

Вот шаги, предпринимаемые, когда клиент желает подключиться к кластеру серверов:

IP, с которым клиент первоначально связывается, является узлом шлюза. Шлюз отслеживает количество клиентов на каждом компьютере и перенаправляет запрос на подключение к компьютеру с наименьшим количеством клиентов.

На каждой машине есть один процесс Manager и процессы X Server, где X - это число ядер на процессоре (поскольку Python не может масштабироваться по ядрам, нам нужно порождать 4 ядра, чтобы использовать 100% четырехъядерного процессора. )

Работа менеджера состоит в том, чтобы отслеживать количество клиентов в каждом процессе, а также перезапускать процессы в случае сбоя любого из них. Когда запрос на соединение от шлюза отправляется менеджеру, менеджер просматривает свои серверные процессы на этом компьютере (3 на диаграмме) и перенаправляет запрос любому процессу с наименьшим количеством клиентов.

Процесс сервера - это то, что фактически осуществляет связь с клиентом.

Вот как будет выглядеть кластер из 3 машин. Ради диаграммы предположим, что каждый узел имеет 3 ядра. альтернативный текст http://img152.imageshack.us/img152/5412/serverlx2.jpg

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

Уф. Дайте мне знать, что вы, ребята, думаете.

1 Ответ

5 голосов
/ 19 января 2009

Похоже, вы захотите взглянуть на PyProcessing , теперь включенный в Python 2.6 и более поздних версиях как многопроцессорная . Он заботится о многих механизмах работы с несколькими процессами.

Альтернативная архитектурная модель - настроить рабочую очередь, используя что-то вроде beanstalkd , и каждый из "серверов" извлекает задания из очереди. Таким образом, вы можете добавлять серверы по своему усмотрению, менять их и т. Д., Не беспокоясь о том, чтобы зарегистрировать их у менеджера (при условии, что работа, которую вы распределяете по серверам, может быть определена количественно как «работа»). *

Наконец, возможно, стоит построить все это на HTTP и воспользоваться существующими хорошо известными и хорошо масштабируемыми механизмами распределения нагрузки, такими как nginx . Если вы сможете использовать коммуникацию на основе HTTP, вы сможете использовать множество готовых инструментов для обработки большей части того, что вы описываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...