websocket vs rest API для данных в реальном времени?
Мне нужно постоянно обращаться к серверу, чтобы получать данные о финансовых инструментах в режиме реального времени. Цена постоянно меняется, поэтому мне нужно запрашивать новые цены каждые 0,5 секунды. REST API-интерфейсы брокеров позволяют мне делать это, однако я заметил, что при подключении к серверу довольно большая задержка. Я только что заметил, что у них также есть веб-сокет API, хотя. Согласно тому, что я прочитал, у них обоих есть свои плюсы и минусы. Но для того, что я хочу сделать, и потому что скорость здесь особенно важна, какой тип API вы бы порекомендовали? Действительно ли websocket быстрее?
Спасибо!
1 ответ
Наиболее эффективной операцией для описываемого вами будет использование соединения webSocket между клиентом и сервером, и сервер будет отправлять обновленную информацию о цене непосредственно клиенту через webSocket ТОЛЬКО, когда цена изменяется на какое-то значимое количество или когда некоторое минимальное количество времени прошло, и цена изменилась.
Это может быть гораздо эффективнее, чем когда клиент постоянно запрашивает новые изменения цен, а сроки поступления новой информации клиенту могут быть более своевременными.
Итак, если вы заинтересованы в том, как быстро информация о новом ценовом уровне попадает к клиенту, webSocket может доставить ее туда гораздо более своевременно, поскольку сервер может просто отправить новую информацию о ценах непосредственно клиенту в тот самый момент, когда она изменяется на сервере. Принимая во внимание, что при использовании вызова REST клиент должен опрашивать через некоторый фиксированный интервал времени и будет когда-либо получать новые данные только в точке своего интервала опроса.
WebSocket также может быть быстрее и проще в вашей сетевой инфраструктуре просто потому, что требуется меньше сетевых операций, чтобы просто отправить пакет через уже открытое соединение webSocket, по сравнению с созданием нового соединения для каждого вызова REST/Ajax, отправкой новых данных, а затем закрытием соединения, Сколько различий / улучшений в вашем конкретном приложении это то, что вы должны измерить, чтобы действительно знать.
Но webSockets были разработаны, чтобы помочь в вашем конкретном сценарии, когда клиент хочет знать (как можно ближе к реальному времени и практически), когда что-то меняется на сервере, поэтому я определенно думаю, что это будет предпочтительный шаблон проектирования для этого типа использовать.
Вот сравнение сетевых операций, связанных с отправкой изменения цены через уже открытый webSocket, с выполнением вызова REST.
WebSocket
- Сервер видит, что цена изменилась, и сразу отправляет сообщение каждому клиенту.
- Клиент получает сообщение о новой цене.
Отдых / Ajax
- Клиент устанавливает интервал опроса
- При следующем срабатывании интервала опроса клиент создает сокет-соединение с сервером
- Сервер получает запрос на открытие нового сокета
- Когда соединение установлено с сервером, клиент отправляет запрос на новую информацию о ценах на сервер
- Сервер получает запрос новой информации о ценах и отправляет ответ с новыми данными (если есть).
- Клиент получает новые данные о ценах
- Клиент закрывает сокет
- Сервер получает сокет закрыть
Как вы можете видеть, в вызове Rest/Ajax происходит намного больше с сетевой точки зрения, потому что новое соединение должно быть установлено для каждого нового вызова, тогда как webSocket использует уже открытый вызов. Кроме того, в случаях webSocket сервер просто отправляет клиенту новые данные, когда новые данные доступны - клиенту не нужно регулярно запрашивать его.
Если информация о ценах меняется не слишком часто, сценарий REST/Ajax также часто будет вызывать запросы "ничего не делать", когда клиент запрашивает обновление, но новых данных нет. Случай с webSocket никогда не имеет такого расточительного случая, поскольку сервер просто отправляет новые данные, когда они доступны.