Мониторинг витого игрового сервера Python - PullRequest
3 голосов
/ 27 июня 2011

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

Я занимаюсь разработкой сервера для Flash-игры (MMO avatar game) с использованием Python и Twisted Я впервые использую Twisted, а также впервые пишу игровой сервер, и у меня мало вопросов по поводу дизайна сервера и реализации Twisted.

  1. Есть ли у кого-нибудь практический опыт или какой-либо пример извращенной производительности в «ситуациях игрового сервера» (общение друг с другом, общение со всеми в комнате, на прогулке и т. Д. - аватар сгруппирован по 50 в каждой комнате. также другие действия, но это наиболее распространенные). Сколько скрученных пользователей могут справиться? (Реально ожидать 10K пользователей на сервер)

  2. Реактор Эполла? Это хороший выбор для игрового сервера MMO?

  3. Как построить мониторинг и администрирование сервера? Если я хочу отключить некоторых пользователей или предпринять какие-либо действия, когда сервер уже запущен? Одним из решений является запись данных из Protocol и Factory на сервер memcache, затем обработка и отображение в веб-интерфейсе, но это односторонний обмен данными, и он «дорогой», эта информация мне нужна по запросу, не всегда. Есть ли хороший способ построить «консоль» для мониторинга и администрирования? Я искал в Интернете, но я не нашел ни одного примера или текста об этом, и вот моя идея:

Создать сервер с одним Factory и двумя протоколами? Один протокол для игры, один для администрации. (один порт фабрики <-> прослушивания протокола 1234, второй фабрика <-> прослушивания протокола 1235). У меня есть вся информация, которая мне нужна на фабрике (количество пользователей, количество активных комнат и т. Д.), А также администратор может легко прочитать эту информацию, потому что у них одна фабрика. Но один завод один протокол, поэтому я сделал несколько изменений:

Две фабрики, два протокола, и одна фабрика передается другой в качестве эталона. На практике примерно так:

from twisted.internet.protocol import Factory, Protocol
from twisted.protocols import basic
from twisted.internet import reactor
from twisted.application import service, internet


class Game(Protocol):
    def connectionMade(self):
            self.factory.users.append(self)

    def dataReceiver(self, data):
            for user in self.factory.users:
                    user.transport.write(data+"\n")

    def connectionLost(self, why):
            self.transport.write("You are off: {0}".format(why))
            self.factory.users.remove(self)


class GameFactory(Factory):
    users = []
    protocol = Game


class Admin(basic.LineReceiver):
    def lineReceived(self, line):
            if line == 'stats':
                    self.transport.write("{0} users online\n".format(self.factory.stats()))

            if line[0:4] == 'kill':
                    self.factory.kill(int(line[5:6]))

    def connectionMade(self):
            self.transport.write("hello fanta\n")



class AdminFactory(Factory):
    protocol = Admin

    def __init__(self, GameFactory):
            self.GameFactory = GameFactory

    def stats(self):
            return len(self.GameFactory.users)

    def kill(self, id):
            self.GameFactory.users[id].connectionLost('die')



application = service.Application("game")
gf = GameFactory()

internet.TCPServer(1234, gf).setServiceParent(application)
internet.TCPServer(1235, AdminFactory(gf)).setServiceParent(application)

Это хорошее решение? Не влияет на производительность GameFactory? У кого-нибудь есть лучшее решение, предложение? Как я уже сказал, я совершенно новичок в написании игровых серверов (любых типов серверов), поэтому мне нужна помощь по организации и дизайну.

1 Ответ

3 голосов
/ 30 июня 2011

twisted.conch.manhole - это одна возможность для мониторинга / администрирования. В конечном итоге вам, вероятно, понадобится несколько интерфейсов управления для разных целей. Не бойтесь настроить веб-сервер на другом порту, IRC-сервер на другом, возможно, SMTP-клиент для отправки вам статистики по электронной почте в конце дня - в этом весь смысл Twisted. В основном вы будете платить за количество подключений, а не за количество услуг.

Постарайтесь не беспокоиться о производительности, пока вы не загрузите тестирование своей первой попытки и не подтвердите, что она слишком медленная, и вы можете обнаружить, что ваша текущая настройка более чем достаточна для того, что вам нужно. Если нет, попробуйте использовать UDP для определенных аспектов общения с игроком (таких как местоположение) и очередь сообщений для чата игрока. Second Life написал обзор некоторых популярных реализаций очереди сообщений .

Удачи.

...