Я создаю игровой сервер на Python, и я просто хотел получить некоторую информацию об архитектуре сервера, о котором я думал.
Итак, как мы все знаем, Python не может масштабироваться по ядрам с помощью одного процесса. Поэтому на сервере с четырьмя ядрами мне потребуется порождать 4 процесса.
Вот шаги, предпринимаемые, когда клиент желает подключиться к кластеру серверов:
IP, с которым клиент первоначально связывается, является узлом шлюза. Шлюз отслеживает количество клиентов на каждом компьютере и перенаправляет запрос на подключение к компьютеру с наименьшим количеством клиентов.
На каждой машине есть один процесс Manager и процессы X Server, где X - это число ядер на процессоре (поскольку Python не может масштабироваться по ядрам, нам нужно порождать 4 ядра, чтобы использовать 100% четырехъядерного процессора. )
Работа менеджера состоит в том, чтобы отслеживать количество клиентов в каждом процессе, а также перезапускать процессы в случае сбоя любого из них. Когда запрос на соединение от шлюза отправляется менеджеру, менеджер просматривает свои серверные процессы на этом компьютере (3 на диаграмме) и перенаправляет запрос любому процессу с наименьшим количеством клиентов.
Процесс сервера - это то, что фактически осуществляет связь с клиентом.
Вот как будет выглядеть кластер из 3 машин. Ради диаграммы предположим, что каждый узел имеет 3 ядра.
альтернативный текст http://img152.imageshack.us/img152/5412/serverlx2.jpg
Это также заставило меня задуматься - могу ли я реализовать горячую замену таким образом? Поскольку каждый процесс контролируется менеджером, когда я хочу поменять новую версию серверного процесса, я просто сообщаю менеджеру, что он не должен отправлять больше подключений к нему, и затем я зарегистрирую процесс новой версии в Старый. Старая версия сохраняется, пока к ней подключены клиенты, а затем прекращает работу, когда ее больше нет.
Уф. Дайте мне знать, что вы, ребята, думаете.