Перейдем к декабрю 2017 года, веб-сокеты поддерживаются (практически) каждым браузером, и их использование очень распространено.
Однако это не означает, что Websockets удалось заменить AJAX, по крайней мере, не полностью, тем более что адаптация HTTP / 2 находится на подъеме.
Короткий ответ: AJAX по-прежнему отлично подходит для большинства приложений REST, даже при использовании веб-сокетов. Но бог в деталях, так что ...
AJAX для голосования?
Использование AJAX для опроса (или длинного опроса) прекращается (и оно должно быть), но оно все еще используется по двум причинам (в основном для небольших веб-приложений):
Для многих разработчиков AJAX проще в написании кода, особенно когда речь идет о кодировании и проектировании бэкэнда.
С HTTP / 2 была устранена самая высокая стоимость, связанная с AJAX (установление нового соединения), что позволило AJAX-вызовам быть весьма производительными, особенно для публикации и загрузки данных.
Тем не менее, Websocket push намного превосходит AJAX (не требуется повторная аутентификация или повторная отправка заголовков, нет необходимости в обходах без данных и т. Д.). Это обсуждалось несколько раз.
AJAX для отдыха?
Лучшее использование для AJAX - вызовы REST API. Такое использование упрощает базу кода и предотвращает блокирование соединения Websocket (особенно при загрузке данных среднего размера).
Существует ряд веских причин предпочесть AJAX для вызовов REST API и загрузки данных:
AJAX API был практически разработан для вызовов REST API, и он отлично подходит.
Вызовы REST и загрузки с использованием AJAX значительно легче кодировать как на клиенте, так и на сервере.
По мере увеличения полезной нагрузки соединения Websocket могут блокироваться, если не закодирована логика фрагментации / мультиплексирования сообщений.
Если загрузка выполняется за один send
вызов Websocket , он может заблокировать поток Websocket до тех пор, пока загрузка не будет завершена. Это снизит производительность, особенно на более медленных клиентах.
Обычный дизайн использует небольшие двунаправленные сообщения, передаваемые через веб-сокеты, тогда как REST и загрузка данных (клиент-сервер) используют простоту использования AJAX для предотвращения блокировки веб-сокета.
Однако в более крупных проектах гибкость, предлагаемая Websockets, и баланс между сложностью кода и управлением ресурсами перевесят баланс в пользу Websockets.
Например, загрузки на основе Websocket могут предлагать возможность возобновления больших загрузок после сброса и восстановления соединения (помните, какой фильм объемом 5 ГБ вы хотели загрузить?).
С помощью кодирования логики фрагментации загрузки легко возобновить прерванную загрузку (сложная часть заключалась в кодировании).
Как насчет HTTP / 2 push?
Я, вероятно, должен добавить, что функция HTTP / 2 push не заменяет (и, вероятно, не может) Websockets.
Это обсуждалось здесь ранее, но достаточно упомянуть, что одно соединение HTTP / 2 обслуживает весь браузер (все вкладки / окна), поэтому данные, передаваемые HTTP / 2, не знают, к какой вкладке / окну оно принадлежит, устранение его возможности заменить способность Websocket передавать данные непосредственно на определенную вкладку / окно браузера.
Хотя Websockets отлично подходят для передачи небольших двунаправленных данных, AJAX по-прежнему обладает рядом преимуществ, особенно если учитывать большие полезные нагрузки (загрузки и т. Д.).
А безопасность?
Ну, в общем, чем больше доверия и контроля предоставляется программисту, тем более мощный инструмент ... и тем больше проблем с безопасностью, которые возникают.
AJAX по своей природе будет иметь преимущество, поскольку его безопасность встроена в код браузера (что иногда сомнительно, но оно все еще там).
С другой стороны, вызовы AJAX более восприимчивы к атакам типа «человек посередине», в то время как проблемы безопасности Websockets обычно являются ошибками в коде приложения, который привел к недостатку безопасности (обычно вы найдете их в логике аутентификации бэкэнда).
Лично я не считаю, что это имеет большое значение, во всяком случае, я думаю, что Websockets немного лучше, особенно когда вы знаете, что делаете.
Мое скромное мнение
ИМХО, я бы использовал Websockets для всего, кроме вызовов REST API. Большие загрузки данных я бы фрагментировал и отправлял через Websockets, когда это возможно.
ИМХО, опрос должен быть вне закона, стоимость сетевого трафика ужасна, а управление Websocket достаточно легко даже для новых разработчиков.