Подтвердить что ты не робот

Websocket vs rest API для данных в реальном времени?

Мне нужно постоянно обращаться к серверу, чтобы получать данные финансовых инструментов в режиме реального времени. Цена постоянно меняется, поэтому мне нужно запрашивать новые цены каждые 0,5 секунды. API-интерфейсы REST для брокеров позволяют мне это делать, однако я заметил, что при подключении к серверу довольно немного задержки. Я только заметил, что они также имеют API websocket. Согласно тому, что я читал, у них обоих есть некоторые плюсы и минусы. Но за то, что я хочу делать, и потому, что скорость здесь особенно важна, какой тип, если API вы бы порекомендовали? Действительно ли websocket быстрее?

Спасибо!

4b9b3361

Ответ 1

Самая эффективная операция для того, что вы описываете, будет заключаться в использовании соединения webSocket между клиентом и сервером и отправке сервером обновленной информации о цене непосредственно клиенту через webSocket ТОЛЬКО, когда цена изменяется на какую-то значимую сумму или когда прошло некоторое минимальное количество времени, и цена изменилась.

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

Итак, если вам интересно, как быстро информация о новом уровне цен поступает на клиента, webSocket может получить его там гораздо более своевременно, потому что сервер может просто отправлять новую информацию о ценах непосредственно клиенту момент, который он изменил на сервере. Принимая во внимание, что с помощью вызова REST клиент должен опросить какой-то фиксированный временной интервал и будет получать только новые данные только в момент их интервала опроса.

WebSocket также может быть быстрее и проще в вашей сетевой инфраструктуре просто потому, что задействовано меньшее количество сетевых операций, чтобы просто отправить пакет по уже открытому соединению через WebSocket или создать новое соединение для каждого вызова REST/Ajax, посылая новые данные, затем закрытие соединения. Какая разница/улучшение, которое это делает в вашем конкретном приложении, будет тем, что вам нужно было бы измерить, чтобы действительно знать.

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


Здесь сравниваются сетевые операции, связанные с отправкой изменения цены по уже открытому webSocket или вызову REST.

WebSocket

  • Сервер видит, что цена изменилась и сразу отправляет сообщение каждому клиенту.
  • Клиент получает сообщение о новой цене.

Отдых /Ajax

  • Клиент настраивает интервал опроса
  • При следующем триггере интервала опроса клиент создает соединение сокетов с сервером
  • Сервер получает запрос на открытие нового сокета
  • Когда соединение выполняется с сервером, клиент отправляет запрос на новую информацию о ценах на сервер
  • Сервер получает запрос на новую информацию о ценах и отправляет ответ с новыми данными (если есть).
  • Клиент получает новые данные о ценах
  • Клиент закрывает сокет
  • Сервер получает сокет close

Как вы видите, в вызове Rest/Ajax происходит гораздо больше с точки зрения сети, потому что для каждого нового вызова необходимо установить новое соединение, тогда как webSocket использует уже открытый вызов. Кроме того, в случаях с webSocket сервер просто отправляет новые данные клиента при наличии новых данных - клиенту не нужно регулярно его запрашивать.

Если информация о ценах не очень часто изменяется, в сценарии REST/Ajax также часто возникают вызовы "ничего не делать", когда клиент запрашивает обновление, но новых данных нет. В случае с сайтом WebSocket этот расточительный случай отсутствует, поскольку сервер просто отправляет новые данные, когда он доступен.