HTTP против Websockets относительно накладных расходов
Я строю программу синхронизации файлов (не в отличие от Dropbox) с использованием node.js на обоих концах. Мне нужно, чтобы потенциально тысячи клиентов запрашивали данные одновременно.
Вот моя текущая система:
- Сервер отправляет уведомления клиенту через веб-сокет (файл был обновлен)
- Клиент очереди загружает и делает HTTP-запрос в режиме ожидания
Я буду обслуживать данные в виде сжатых блоков, скажем, по 50 МБ каждый, поэтому издержки HTTP-запроса (заголовки) незначительны.
Если бы я использовал веб-сокеты для запросов и push-уведомлений, было бы:
- Заметные улучшения в скорости? (уменьшенная задержка, аутентификация и т. д.)
- Дополнительные издержки на сервере для поддержания открытых соединений?
- Проблемы с передачей двоичных данных?
Я думаю, что мне нужно получать уведомления через выделенную веб-розетку, потому что я не хочу, чтобы они ставились в очередь на сервере во время загрузки (много накладных расходов).
Примечание. Эти веб-сокеты будут открыты в течение длительного времени, пока система клиента включена.
РЕДАКТИРОВАТЬ: я буду использовать веб-сокеты на другом http-сервере на разных портах, чтобы переместить их на разные ядра процессора. Я мог бы потенциально открыть тысячи (если не сотни тысяч) одновременных веб-сокетов...
2 ответа
Если вы намереваетесь использовать node.js как для клиента, так и для сервера, то вам следует использовать собственный сетевой модуль с чистыми сокетами, а не WebSockets. Чистые сокеты намного лучше оптимизированы для передачи данных, особенно двоичных. Насколько я знаю, браузерные WebSockets еще даже не поддерживают двоичную передачу.
Я искал что-то еще, и я нашел этот пост, который довольно хорошо объясняет веб-сокеты:
Вот несколько довольно интересных частей из статьи:
Websocket позволяет поддерживать непрерывную связь при значительно меньших затратах сети по сравнению с существующим решением.
А также:
Во время установления соединения с WebSocket клиент и сервер обмениваются данными на кадр, каждый из которых занимает 2 байта, по сравнению с 8 килобайтами заголовка http при непрерывном опросе.
Для моего варианта использования (без браузера) это кажется оптимальным решением! Теперь мне просто нужно решить, хочу ли я иметь один веб-сокет или несколько веб-сокетов для каждого клиента (на данный момент я склоняюсь к одному).
Я действительно надеюсь, что это кому-нибудь пригодится. Я пока оставлю это открытым. Я буду присутствовать на конференции JS позже на этой неделе, и если я узнаю что-нибудь еще, я добавлю к этому посту.
Для тех из вас, кто заботится о поддержке браузера, посмотрите это. Похоже, что WebKit - единственный надежный движок, который его поддерживает (Chrome и Safari).