Дизайн архитектуры сайта, требующий опроса в реальном времени с внешних серверов - PullRequest
5 голосов
/ 21 октября 2011

У меня игра, запущенная на N ec2-серверах, каждый со своими игроками внутри (предположим, что это отдельная игра внутри каждого сервера).

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

Мой первоначальный подход был следующим:

  • Иметь общий веб-сайт php для опроса данных с каждого сервера (по 1 сокету для каждого сервера).Поскольку большинство общих решений на самом деле не предлагают постоянные сокеты, для этого потребуется, чтобы я создавал и обрабатывал соединение каждые 5 секунд или около того.Поскольку с такой гранулярностью нет cronjob, я бы в конечном итоге использовал запросы одного неудачного клиента, чтобы сделать это обновление.Здесь так много ошибок, давайте рассмотрим этот сценарий наихудшего случая.

  • Наилучшим сценарием (я полагаю) будет создание небольшого экземпляра ec2 с некоторым веб-интерфейсом на основе python / ruby ​​/ phpс серверным приложением, предназначенным только для опроса и сохранения данных с серверов в базе данных сайта.Хотя это должно работать нормально, я искал какое-то решение, в котором мне не нужно было бы тратить столько денег (даже микроэкземпляр дорог для такого любимого проекта).

Что такоелучшее и дешевое решение для этого?

Ответы [ 2 ]

6 голосов
/ 25 октября 2011

Существует ли причина, по которой один сервер не может опросить другие, сохранить результаты в файле json, а затем отправить этот файл на соответствующий веб-сервер?Затем клиенты могут использовать ajax для обновления списков практически в реальном времени.

Если вы не управляете игровыми серверами, я бы передал работу по обновлению json одному из случайных клиентских запросов.,все не так плохо, как вы думаете.

Примите во внимание следующее:

  1. Доставьте (теперь истекшие) данные клиенту, включая отметку времени
  2. call flush(); (тест, чтобы убедиться, что страница полностью обработанаВам может потребоваться отправить пробел или что-то еще, чтобы заполнить буфер, в зависимости от того, как настроен веб-сервер. Добавление flush(); sleep(4); echo "hi"; в скрипт php должно быть простым способом проверки.
  3. call ignore user abort (http://php.net/manual/en/function.ignore-user-abort.php) так что ваш клиент продолжит выполнение независимо от того, что пользователь
  4. опрашивает все серверы, обновите ваш файл
  5. Клиент ждет подходящее количество времени, прежде чем попытаться обновить обновленную статистику через AJAX.

Да, клиент получает запрос, который занимает много времени, но это не влияет на загрузку страницы, поэтому он может даже не заметить.

3 голосов
/ 29 октября 2011

Вы не предоставляете информацию, необходимую для принятия решения по этому вопросу.Это зависит от количества игроков, количества серверов, количества игр, связи между игроками, объема памяти и процессора, необходимого для игры / игрока, задержки и скорости передачи каналов связи, географического распределения ваших игроков, необходимой скорости обновления,разрешено движение игроков, взаимная видимость.База данных должна , а не изначально быть частью решения, так как это только добавляет дополнительную задержку и сложность.Сделайте так, чтобы сначала работал в реальном времени.

Действительно дешево было бы использовать netnews для этого.

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