JavaScript

Как на сайтах происходит постоянное обновление информации?

Допустим, есть vk, у которого лайки обновляются спусть некоторое время или по событию, кто может объяснить, как это реализовано?
Ну, типа по какому событию там все обновляется.
Ну слушайте, есть всего четыре способа:

1. AJAX:
Вы блюёте с опеределённой периодичностью, пример — каждую секунду, запросами «ну чё там у xoxлов?», сервер вам отвечает и про вас забывает. Через секунду всё повторяется. Примитивный таймер.

Минусы:
1. ОГРОМНЫЙ трафик и нагрузка для обоих сторон. Кажется, а что ту такого? А вот что: если ваш запрос занимает 2 КБ, посылается раз в секунду, то за сутки просто при открытой у пользователя странице у вас набегает 172 мегабайта трафика с обоих сторон. А теперь представьте, что пользователей тысячи. А часть ваших пользователей сидит не на бизлимитном интернете с мобильников. Рано или поздно, но вам настучат по голове — либо пользователи, либо хостер.
2. Задержка обновления информации у пользователя. Если вы не глупенький, вы будете стараться минимизировать количество запросов, увеличивая задержку между ними…

Long pooling:
Вы посылаете запрос, сервер его принимает и оставляет открытым какое-то время. Если что-то обновилось, сервер отсылает обновление клиенту и закрывает запрос. Клиент тут же посылает повторный запрос. Если ничего не обновлялось за заданное время, сервер также закрывает запрос.

Минусы:
1. трафик. Хотя и в десятки раз меньше, чем при непрерывной долбёжке запросами.
2. Одностороннее соединение.

SSE (server sent event): клиент устанавливает постоянное соединение, сервер шлёт обновления тогда, когда они появляются. Очень простая реализация на клиенте, красиво, удобно.
Минусы:
1. одностороннее соединение.
2. довольно нетривиальная реализация на сервере

Вебсокеты:
Устанавливается постоянное соединение. Сервер при обновлении шлёт клиенту нужную информацию, клиент также может отослать что-то серверу.

Минусы:
1. несовместим с очень старыми браузерами.
2. Реализация на сервере средней сложности.

Сейчас почти всегда используют вебсокеты. Все чаты, любое интерактивное обновление чего-либо — это вебсокеты. Мгновенное обновление, минимальный трафик и нагрузка.

SSE используется как аналог RSS-фида. Например, Фонд Викимедиа использует SSE для организации потока всех правок во всех его проектах (все языковые разделы Википедии и т. п.) для любых желающих. Двусторонняя связь в этом деле не нужна.

ВКонтакте, как ни странно, на сколько я помню, использует long pooling. И неизвестно почему (это обсуждалось в инете). Вероятно, в целях совместимости со старыми браузерами и всеми экзотическими и старыми мобильными платформами.
Николай Снегирев
Николай Снегирев
38 633
Лучший ответ
Это называется AJAX. Подробности лучше бы поискать.
asa26rus
asa26rus
29 952
Ойбек Буранов та я знаю про ajax, но ведь он делает запрос по событию, верно?
может websocket