Чем плох ajax чат?

Сейчас естественно модно использовать асинхронность, и даже те фремворки которые не поддерживают асинхронность, находят им поддержку.

Но кроме периодических запросов со страницы на сервер от ajax, какие еще отрицательные стороны подхода чата на ajax?
И если кто-то в курсе, что будет если несколько часов просидеть в чате на ajax и все это время будут подгружаться данные? Каждый запрос подгружает данные и через какое-то время подгрузит мегабайты данных, однако я сомневаюсь что браузеры не справятся с этим. Так чем же тогда плох чат на ajax, что все так плюются от этого метода?
  • Вопрос задан
  • 2406 просмотров
Решения вопроса 1
@bromzh
Drugs-driven development
Подумай, как в случае с AJAX сервер будет отдавать сообщения.
В случае с websocket всё просто: список подключённых пользователей известен. Подключился новый пользователь, на сервере вызвался callback, соединение создалось и добавилось в список всех соединений. При получении сообщения от клиента сервер просто пройдёт в цикле по этому списку соединений, отправит данные и забудет про них. Пользователь отключился, вызвался callback, соединение удалилось из списка на сервере.

А как в случае AJAX? Сервер не знает, сколько пользователей активно в данный момент. Клиент отправил запрос, создалось соединение, запрос пришёл на сервер, сервер ответил на него, соединение разорвалось. Если юзер уйдёт с сайта, то сервер просто не будет получать запросы. Как он определит, ушёл ли юзер или просто таймаут ещё не сработал? Можно, конечно, на сервере хранить список с пользователями, которые что-то прислали и раз в N секунд выкидывать протухших. Но это дополнительная нагрузка на серв, который и так будет нагружен огромным количеством периодических запросов (выгоднее держать 1000 открытых соединений, чем раз в секунду открывать и закрывать по тысячи соединений).
Вот тебе ещё простой пример: есть 3 пользователя. Один ничего не пишет и каждые 3 секунды отправляет запрос на получение сообщений. 2 других каждые полсекунды отправляют сообщения. Сервер может только догадываться, в сети ли необщительный юзер, или у него таймаут не вышел. А до тех пор, он хранит все сообщения от 2-го и 3-го пользователей. Но они уже получили сообщения друг от друга, поэтому надо где-то хранить инфу для каждого пользователя, какие сообщения он уже получал, а какие - нет. Можно, конечно, и сообщения хранить только некоторое время, и отправлять на клиент всё, что есть, а уже на клиенте пропускать дубликаты. Но это, опять же, доп. нагрузка на сервер и клиент.

В итоге, надо придумать довольно сложную логику хранения информации, которую надо отправить пользователям, да и список самих пользователей как-то хранить и мониторить. В итоге, куча малких запросов. которые будут просаживать сервер и нетривиальная система оповещений, которая, скорее всего, будет часто выдавать ошибки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@iShatokhin
JS developer
Чтобы иметь актуальные данные, каждому клиенту нужно постоянно делать ajax обращение к серверу для синхронизации по таймауту. Это дает дополнительную нагрузку, да и отсутствует двухсторонняя связь. Сервер не может самовольно послать пакет клиенту.

Для чата лучше использовать WebSockets.

p.s. не понял пассаж про асинхронность, ajax тоже асинхронен.
Ответ написан
Adamos
@Adamos
1. Нагрузка на сервер, как уже было сказано.
2. Из-за п. 1 придется выставлять значительный таймаут (несколько секунд), чат превратится в быструю переписку, а народ уже приучен аськами, скайпами и соцсетями к мгновенности чата.
3. Придется просто забыть про всякие плюшки типа "пользователь начал вам писать", к которым народ также привык.
4. ...
В результате всех подобных ограничений окажется, что, как вы ни старались, получилось барахло, несовременное и неулучшаемое. Увы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
Rocket Брянск
от 60 000 до 100 000 ₽
22 мая 2024, в 02:15
10000 руб./за проект
21 мая 2024, в 23:47
30000 руб./за проект