Любой современный единый сервер способен одновременно обслуживать тысячи клиентов . Его программное обеспечение HTTP-сервера просто ориентировано на Event-Driven (IOCP) (мы больше не находимся в старом соединении Apache - одно соединение = одно уравнение потока / процесса). Даже встроенный в Windows HTTP-сервер (http.sys) ориентирован на IOCP и очень эффективен (работает в режиме ядра). С этой точки зрения не будет большой разницы при масштабировании между WebSockets и обычным HTTP-соединением. Одно соединение TCP / IP использует небольшой ресурс (намного меньше, чем поток), и современные ОС оптимизированы для обработки большого количества одновременных соединений: WebSockets и HTTP - это просто протоколы уровня приложений OSI 7, унаследованные от этих спецификаций TCP / IP.
Но из эксперимента я увидел две основные проблемы с WebSockets:
- Они не поддерживают CDN;
- У них есть потенциальные проблемы безопасности.
Поэтому я бы порекомендовал следующее для любого проекта:
- Используйте WebSockets только для клиентских уведомлений (с механизмом возврата к длинному опросу - вокруг множество библиотек);
- Используйте RESTful / JSON для всех других данных, используя CDN или прокси для кеша.
На практике полные приложения WebSockets плохо масштабируются. Просто используйте WebSockets для того, для чего они предназначены: отправлять уведомления с сервера на клиент.
О потенциальных проблемах использования WebSockets:
1. Рассмотрите возможность использования CDN
Сегодня (почти 4 года спустя) веб-масштабирование включает использование внешних интерфейсов Content Delivery Network (CDN) не только для статического контента (html, css, js), но и для данных приложений (JSON) .
Конечно, вы не будете помещать все свои данные в кэш CDN, но на практике большое количество общего содержимого будет меняться не часто. Я подозреваю, что 80% ваших ресурсов REST могут быть кэшированы ... Даже одной минуты (или 30 секунд) истечения срока действия CDN может быть достаточно, чтобы дать вашему центральному серверу новый эфир и значительно повысить скорость отклика приложения, поскольку CDN может быть географически настроенным ...
Насколько мне известно, в CDN пока нет поддержки WebSockets, и я подозреваю, что никогда не будет. WebSockets имеют полное состояние, тогда как HTTP не имеет состояния, поэтому его легко кэшировать. На самом деле, чтобы сделать WebSockets CDN-дружественным, вам, возможно, придется переключиться на подход RESTful без состояния ... который больше не будет WebSockets.
2. Проблемы безопасности
У WebSockets есть потенциальные проблемы безопасности, особенно о DOS-атаках. Для иллюстрации новых уязвимостей безопасности см. Этот набор слайдов и этот билет веб- набора .
WebSockets исключает любую возможность проверки пакетов на уровне приложений OSI 7, что в наши дни становится довольно стандартным, в любой бизнес-безопасности. Фактически, WebSockets делает передачу запутанной, поэтому может быть серьезным нарушением безопасности.