HTTP против Websockets относительно накладных расходов

Я строю программу синхронизации файлов (не в отличие от Dropbox) с использованием node.js на обоих концах. Мне нужно, чтобы потенциально тысячи клиентов запрашивали данные одновременно.

Вот моя текущая система:

  • Сервер отправляет уведомления клиенту через веб-сокет (файл был обновлен)
  • Клиент очереди загружает и делает HTTP-запрос в режиме ожидания

Я буду обслуживать данные в виде сжатых блоков, скажем, по 50 МБ каждый, поэтому издержки HTTP-запроса (заголовки) незначительны.

Если бы я использовал веб-сокеты для запросов и push-уведомлений, было бы:

  • Заметные улучшения в скорости? (уменьшенная задержка, аутентификация и т. д.)
  • Дополнительные издержки на сервере для поддержания открытых соединений?
  • Проблемы с передачей двоичных данных?

Я думаю, что мне нужно получать уведомления через выделенную веб-розетку, потому что я не хочу, чтобы они ставились в очередь на сервере во время загрузки (много накладных расходов).

Примечание. Эти веб-сокеты будут открыты в течение длительного времени, пока система клиента включена.

РЕДАКТИРОВАТЬ: я буду использовать веб-сокеты на другом http-сервере на разных портах, чтобы переместить их на разные ядра процессора. Я мог бы потенциально открыть тысячи (если не сотни тысяч) одновременных веб-сокетов...

2 ответа

Решение

Если вы намереваетесь использовать node.js как для клиента, так и для сервера, то вам следует использовать собственный сетевой модуль с чистыми сокетами, а не WebSockets. Чистые сокеты намного лучше оптимизированы для передачи данных, особенно двоичных. Насколько я знаю, браузерные WebSockets еще даже не поддерживают двоичную передачу.

Я искал что-то еще, и я нашел этот пост, который довольно хорошо объясняет веб-сокеты:

http://blog.new-bamboo.co.uk/2009/12/7/real-time-online-activity-monitor-example-with-node-js-and-websocket

Вот несколько довольно интересных частей из статьи:

Websocket позволяет поддерживать непрерывную связь при значительно меньших затратах сети по сравнению с существующим решением.

А также:

Во время установления соединения с WebSocket клиент и сервер обмениваются данными на кадр, каждый из которых занимает 2 байта, по сравнению с 8 килобайтами заголовка http при непрерывном опросе.

Для моего варианта использования (без браузера) это кажется оптимальным решением! Теперь мне просто нужно решить, хочу ли я иметь один веб-сокет или несколько веб-сокетов для каждого клиента (на данный момент я склоняюсь к одному).

Я действительно надеюсь, что это кому-нибудь пригодится. Я пока оставлю это открытым. Я буду присутствовать на конференции JS позже на этой неделе, и если я узнаю что-нибудь еще, я добавлю к этому посту.

Для тех из вас, кто заботится о поддержке браузера, посмотрите это. Похоже, что WebKit - единственный надежный движок, который его поддерживает (Chrome и Safari).

Другие вопросы по тегам