Как реализовать толчок сервера для большего количества значений одновременно? - PullRequest
2 голосов
/ 08 июня 2009

Каков наилучший способ реализовать push на сервере для нескольких целей?

Допустим, я хочу просто обновить статус пользователя, чтобы я мог периодически опрашивать сервер на предмет статуса примерно через 1000 мс и обновлять страницу.

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

Но как мне это реализовать, чтобы проверить примерно 10 вещей на сайте? Например, если я хочу, чтобы stackoverflow обновлял голоса вопросов, когда кто-то голосует, но единственный способ сделать это, о котором я могу подумать, это

запрашивать у сервера голоса за каждый вопрос -> сервер отвечает голосами по каждому вопросу на странице

но как я могу узнать, какие голоса изменились? Я мог бы отправить все текущие голоса и затем позволить серверу сравнивать значения и отвечать только с теми, которые изменились, но я думаю, что было бы очень неэффективно делать это при проверке примерно 30 значений.

Одним из примеров для всех будет Facebook , где почти все обновляется с помощью push-сообщений сервера, но как сервер может узнать, что изменилось, а что нет?

Все, что я нашел (включая мою книгу «Ajax Patterns»), объясняет только то, как опросить одно значение, но я не нашел ничего, как опросить много значений одновременно (например, более 10).

Ответы [ 2 ]

2 голосов
/ 09 июня 2009

Если вы готовы использовать сеансы, проще всего было бы иметь идентификатор последовательного запроса и позволить серверу отслеживать последнюю информацию, отправляемую клиенту во время сеанса. Затем клиент спрашивает, имеются ли более новые данные, чем при последнем обновлении.

Например: допустим, клиент отправляет запрос ajax # 5001, если ничего не изменилось, сервер может ответить «ложь». Затем кто-то отправляет сообщение, или происходит какое-то изменение, и поэтому в запросе # 5002 сервер отправляет список измененных элементов (какими бы они ни были). Тогда в запросе # 5003 он снова ответит false, потому что ничего не изменилось с момента запроса # 5002.

Для этого идеально подойдет клиент-серверная архитектура JSON. Это позволяет легко сериализовать иерархии / карты объектов. Я предпочитаю jQuery для клиента в javascript, и выкладывать на стороне сервера тривиально.

0 голосов
/ 08 июня 2009

Я бы предложил пометить ваши данные номерами ревизий на стороне сервера, чтобы клиент знал, какая у него ревизия данных; создать составной запрос, посредством которого клиент может отправить набор ревизий, а сервер может ответить на этот список ревизий любыми обновленными ревизиями, которые он может иметь для них. Таким образом, клиент только делает один запрос к серверу, чтобы увидеть, есть ли какие-либо обновления; вы просто объединяете все данные, которые интересует клиента, в один запрос. Этот метод также позволяет клиенту изменять набор данных, которые его интересуют; если ваша реализация на стороне сервера достаточно гибкая, вы можете использовать одну и ту же реализацию для всех ваших потребностей в динамических данных.

...