Описание тега engine.io
ЦЕЛЬ
Основная цель Engine
обеспечивает самую надежную связь в реальном времени. В отличие от предыдущего ядра Socket.IO, оно всегда сначала устанавливает соединение с длительным опросом, а затем пытается перейти на более качественные транспорты, которые "тестируются" на стороне.
За время существования проектов Socket.IO мы обнаружили бесчисленное множество недостатков в использовании HTML5 WebSocket или Flash Socket в качестве первых механизмов подключения.
И то, и другое, несомненно, являются правильным способом установления двунаправленной связи, а HTML5 WebSocket - это путь будущего. Однако для удовлетворения большинства бизнес-потребностей альтернативные традиционные механизмы HTTP 1.1 так же хороши, как и предоставление того же решения.
WebSocket/FlashSocket
основанные на соединениях соединения имеют два основных преимущества:
Лучшая производительность сервера
A: Балансировщики нагрузки Балансировка нагрузки при длительном соединении с опросом представляет собой серьезный архитектурный кошмар, поскольку пользовательский агент может отправлять запросы из любого количества открытых сокетов, но все они должны быть перенаправлены на процесс и компьютер, которым принадлежит соединение Engine. Это негативно влияет на использование ОЗУ и ЦП.
B: Сетевой трафик WebSocket разработан исходя из предпосылки, что каждый кадр сообщения должен быть окружен наименьшим объемом данных. В транспорте HTTP 1.1 каждый кадр сообщения окружен заголовками HTTP и кадрами кодирования фрагментов. Если вы попытаетесь отправить сообщение "Hello world" с помощью xhr-polling, сообщение в конечном итоге станет больше, чем если бы вы отправили его с помощью WebSocket.
C: Легковесный синтаксический анализатор В результате действия B серверу приходится выполнять гораздо больше работы по синтаксическому анализу сетевых данных и выяснению сообщения при использовании традиционных HTTP-запросов (как при длительном опросе). Это означает, что еще одним преимуществом WebSocket является меньшая загрузка ЦП сервера. Лучший пользовательский опыт.
По причинам, указанным в пункте 1, наиболее важным эффектом от возможности установить соединение WebSocket является скорость передачи необработанных данных, что в некоторых случаях приводит к улучшению взаимодействия с пользователем.
Приложения с интенсивным взаимодействием в реальном времени (например, игры) получат большую выгоду, тогда как приложения, такие как чат в реальном времени (Gmail/Facebook), ленты новостей (Facebook) или шкалы времени (Twitter), будут иметь незначительные улучшения взаимодействия с пользователем.
Сказав это, попытка установить соединение WebSocket напрямую до сих пор оказалась проблематичной:
Прокси-серверы Многие корпоративные прокси-серверы блокируют трафик WebSocket.
Персональный брандмауэр и антивирусное программное обеспечение В результате нашего исследования мы обнаружили, что по крайней мере 3 приложения для персональной безопасности блокируют трафик WebSocket.
Платформы облачных приложений. Такие платформы, как Heroku или No.de, не успевают за быстрыми темпами эволюции протокола WebSocket. Поэтому приложения неизбежно используют длительный опрос, но беспроблемная установка Socket.IO, к которой мы стремимся ("require() it and it just works"), исчезает.
У некоторых из этих проблем есть решения. Однако в случае прокси-серверов и персональных программ решения часто включают обновление программного обеспечения. Опыт показал, что полагаться на обновления клиентского программного обеспечения для создания бизнес-решения бесполезно: само существование этого проекта связано с фрагментированной панорамой распространения пользовательских агентов, когда клиенты подключаются к последним версиям самых современных пользовательских агентов (Chrome, Firefox и Safari), но другие версии с IE 5.5.
С точки зрения пользователя, неудачное соединение WebSocket может привести как минимум к 10 секундам ожидания, пока приложение в реальном времени начнет обмен данными. Это серьезно вредит пользовательскому опыту.
Подводя итог, можно сказать, что Engine фокусируется в первую очередь на надежности и удобстве использования, во-вторых, на незначительных потенциальных улучшениях UX и повышении производительности сервера. Движок - это результат всех уроков, полученных с помощью WebSocket в дикой природе.
Архитектура
Основная предпосылка Engine и суть его существования - это возможность менять транспорт на лету. Соединение начинается как xhr-polling, но может переключиться на WebSocket.
Центральная проблема, возникающая при этом, заключается в следующем: как переключить транспорт без потери сообщений?
Двигатель переключается с опроса на другой транспорт только между циклами опроса. Поскольку сервер закрывает соединение после определенного тайм-аута, когда нет активности, а реализация транспорта опроса буферизует сообщения между соединениями, это гарантирует отсутствие потери сообщений и оптимальную производительность.
Еще одно преимущество этого дизайна заключается в том, что мы обошли почти все ограничения Flash Socket, такие как медленное соединение, увеличенный размер файла (мы можем безопасно загружать его лениво, не ухудшая взаимодействия с пользователем) и т. Д.
Вопросы-Ответы
- Могу ли я использовать движок без Socket.IO?
Абсолютно. Хотя для создания приложений реального времени рекомендуется использовать Socket.IO, поскольку он обеспечивает фундаментальные функции для реальных приложений, такие как мультиплексирование, поддержка повторного подключения и т. Д.
Engine для Socket.IO то же, что Connect для Express. Важная часть для создания фреймворков реального времени, но то, что вы, вероятно, не будете использовать для создания реальных приложений.
- Обслуживает ли сервер клиента?
Нет. Основная причина в том, что Engine предназначен для работы с фреймворками. Socket.IO включает движок, поэтому обслуживание двух клиентов не требуется. Если вы используете Socket.IO, включая<script src="/socket.io/socket.io.js">
ты прикрыл.
- Могу ли я реализовать Engine на других языках?
Абсолютно. Файл SPEC всегда содержит самое актуальное описание спецификации реализации. Если вы ориентируетесь на последнюю стабильную версию Engine, обязательно посмотрите файл в соответствующей ветке / теге git.
Реализация Java/NIO будет официально поддерживаться, и автор работает над ней.