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

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

Спасибо!

1 ответ

Решение

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

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

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

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

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


Вот сравнение сетевых операций, связанных с отправкой изменения цены через уже открытый webSocket, с выполнением вызова REST.

WebSocket

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

Отдых / Ajax

  1. Клиент устанавливает интервал опроса
  2. При следующем срабатывании интервала опроса клиент создает сокет-соединение с сервером
  3. Сервер получает запрос на открытие нового сокета
  4. Когда соединение установлено с сервером, клиент отправляет запрос на новую информацию о ценах на сервер
  5. Сервер получает запрос новой информации о ценах и отправляет ответ с новыми данными (если есть).
  6. Клиент получает новые данные о ценах
  7. Клиент закрывает сокет
  8. Сервер получает сокет закрыть

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

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

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