Проверять наличие обновлений с помощью AJAX - возможности оптимизации пропускной способности? - PullRequest
1 голос
/ 11 января 2011

Я создаю простую многопользовательскую онлайн-игру, в которой два игрока (клиента) могут играть в игру друг с другом.Данные отправляются и выбираются с сервера, который управляет всеми данными, касающимися этого.

Проблема, с которой я сталкиваюсь, заключается в том, как эффективно получать обновления с сервера.Данные выбираются с помощью AJAX: каждые 5 секунд данные выбираются с сервера для проверки обновлений.Однако это делается с использованием HTTP, что означает, что все заголовки также отправляются каждый раз.Сами данные сведены к абсолютному минимуму.

Мне было интересно, есть ли у кого-нибудь советы о том, как сэкономить пропускную способность в этом сценарии сервер / клиент.Можно ли получить выборку с использованием специального протокола или чего-то подобного, чтобы предотвратить отправку всех заголовков (например, «Server: Apache») каждый один раз?В основном мне нужны только сами данные (всего 9 байт), а не все заголовки (которые похожи на 100 байт, если не больше).

Спасибо.

Ответы [ 3 ]

3 голосов
/ 11 января 2011

Комета или Websockets

HTML5 websockets (как упоминалось в других ответах здесь) в настоящее время может иметь ограниченную поддержку браузера, но использование долгоживущих HTTP-соединений для передачи данных (иначе говоря, Comet ) дает вам подобная «потоковая» функциональность, с которой даже IE6 может справиться. Однако реализовать Comet довольно сложно, поскольку это своего рода хак, использующий преимущества того, как браузеры только что были реализованы в то время.

Также обратите внимание, что оба метода потребуют от вашего сервера обрабатывать гораздо больше одновременных соединений, чем раньше, что может быть проблемой, даже если они большую часть времени простаивают. Это иногда называют проблемой C10K .

В этой статье обсуждается websockets vs comet .

Уменьшение размера заголовка

Возможно, вам удастся уменьшить заголовки HTTP до минимума, необходимого для сохранения байтов. Но вам нужно будет сохранить Date, поскольку это не является обязательным в соответствии со спецификацией ( RFC 2616 ). Возможно, вам также понадобится Content-Length, чтобы сообщить браузеру размер тела, но, возможно, удастся сбросить его и закрыть соединение после отправки байтов тела, но это помешает браузеру использовать постоянные соединения HTTP / 1.1.

Обратите внимание, что заголовок Server не требуется, но Apache не позволяет полностью удалить его - директива ServerTokens контролирует это, и самый короткий параметр приводит к Server: Apache, как у вас уже есть , Я не думаю, что другие веб-серверы обычно позволяют также отбрасывать заголовок Server, но если вы находитесь на общем хосте, вы, вероятно, застряли с Apache, как настроено вашим провайдером.

1 голос
/ 11 января 2011

Это возможно не для всех браузеров, но поддерживается в более новых (Chrome, Safari).Вы должны использовать платформу, которая использует веб-сокеты, а затем постепенно снижается до длинного опроса (вы не хотите опрашивать с фиксированными интервалами, если не всегда ожидают события).Таким образом, вы получите выгоду от более новых браузеров, и этот пул будет продолжать расширяться по мере обновления.

Для Java общее решение - Atmosphere: http://atmosphere.java.net. У него есть плагин jQuery, а такжеабстракция уровня контейнера сервлета.

1 голос
/ 11 января 2011

html5 сокетов будет способ сделать это в ближайшем будущем.

http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

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