Я думаю, что большинство ваших вопросов можно уточнить, если понять реальную цель WebSockets. WebSockets не был предназначен в первую очередь для замены каких-либо вещей, которые уже есть и работают хорошо. Например, он не был спроектирован как версия AJAX с низкими издержками. Цель состоит в том, чтобы обеспечить двунаправленный полнодуплексный канал с низкой задержкой и каналом связи между браузером и сервером. Его реальная цель - создать новый домен веб-приложений или улучшить существующие, использующие HTTP, для достижения двунаправленной связи.
Имея это в виду, позвольте мне прокомментировать ваши пункты пули:
Цель периодических пинг / понг-сообщений WebSockets имеет двойную цель: предотвратить закрытие канала из-за тайм-аута TCP и более быстро определить, когда канал закрыт (это исторически слабость TCP). Цель опроса HTTP / AJAX состоит в том, чтобы обойти тот факт, что HTTP не является двунаправленным (то есть клиент опрашивает, чтобы дать серверу возможность отправлять данные обратно). Пинг / понг-фреймы WebSocket обычно имеют длину 2 байта. Для опроса HTTP / AJAX требуются полные заголовки, файлы cookie и т. Д., Которые могут легко составлять более килобайта для каждого запроса / ответа. Даже если вы отправляете пинг / понг 10 раз в секунду через WebSockets, вы все равно вряд ли сможете даже сравнивать с издержками HTTP / AJAX-опроса каждые 2 секунды. Однако обратите внимание, что приложения не имеют возможности отправлять сообщения пинг / понг. Это между браузером и сервером.
Если вы потеряете подключение к Интернету, вы получите событие onclose. Если ваш браузер не отправляет вам сообщения ping / pong, вы можете не получить сообщение onclose, пока не попытаетесь отправить сообщение после обрыва сетевого соединения.
Я бы не заменил работающий сервис RESTful на WebSockets. Вы будете выполнять большую часть картографической работы, возможно, с очень небольшой пользой (опять же, WebSockets не предназначен для замены того, что уже работает хорошо). Я могу представить себе ситуации, когда у вас может быть комбинация обоих: REST для передачи состояния, WebSockets для уведомления о событии. Например. сервер отправляет сообщение WebSocket, указывающее «что-то изменилось», что заставляет клиента выполнить запрос REST, чтобы выяснить это изменение.
Обновление
Разъяснение: вы можете сделать REST поверх WebSockets, но это не соответствует философии. REST - это архитектурный стиль, который не учитывает основную транспортную систему. Это ограниченная архитектура: «клиент-сервер», «без сохранения состояния», «кешируемый», «многоуровневая система», «код по требованию» и «унифицированный интерфейс». WebSockets не ограничен ни одним из них; это общая система транспортировки сообщений. Вы можете ограничить использование WebSockets как RESTful, но не делайте этого, пока не разберетесь в REST и WebSockets и не сможете определить, когда это правильно.