Обработка сообщений WebSockets в порядке поступления

Клиентская часть моего приложения должна обрабатывать сообщения WebSocket в строгом порядке. К сожалению, каждое сообщение обрабатывается достаточно долго (около 3 секунд), поэтому еще одно сообщение появляется до того, как закончилось первое. После нескольких сообщений порядок совершенно другой. Как решить эту проблему в JavaScript.

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


person Mateusz    schedule 11.01.2013    source источник
comment
Разве это не противоречит stackoverflow. com/questions/11804721/ ?   -  person Ali Ok    schedule 06.08.2015
comment
См. также stackoverflow.com/a/42386494/2277240.   -  person grabantot    schedule 22.02.2017


Ответы (2)


В настоящее время API WebSocket в браузерах не предоставляет опции/API на основе кадров или потоковой передачи. Таким образом, на самом деле нет возможности выполнить это нативно.

Это означает, что вам нужно создать свою собственную логику/структуру в пакетах данных, которые вы отправляете с вашего сервера клиентам. Это должна быть относительно простая задача, я мог подумать о передаче простых строк/объектов JSON, которые могут иметь индексированное свойство на верхнем уровне.

{
    packetIndex: 0,
    data: { }
}

и ваш клиентский скрипт должен будет просматривать каждый прибывающий пакет и правильно сортировать вещи (отслеживая прибывшие пакеты и «удерживать + ждать», если прибыл пакет со слишком высоким индексом)

person jAndy    schedule 11.01.2013
comment
Это кажется неправильным. Фрагменты сообщения ДОЛЖНЫ быть доставлены получателю в порядке, отправленном отправителем. - person Maël Nison; 15.04.2015
comment
Это действительно правильный ответ, TCP отправляет пакет в правильном порядке, клиент получает его в правильном порядке, но клиенту может потребоваться время для обработки каждого запроса, поэтому, когда он примет следующий, он может обработать неправильный. Например, в Golang я запускаю их в go-процедурах для увеличения производительности. - person Ant; 14.11.2018

Я думаю, что другой ответ неверен. WebSocket IS TCP, что означает, что порядок доставки гарантируется. Как процитировал @Maël Nison, см. RFC6455:

Фрагменты сообщения ДОЛЖНЫ быть доставлены получателю в порядке отправки отправителем.

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

Похожие посты:

person Gábor Imre    schedule 08.08.2015
comment
Я сделал несколько стресс-тестов с библиотеками SocketIO, EngineIO и ws. Что-то было не так с порядком сообщений в EngineIO (почти тот же код, что и для SocketIO; я не копал до глубины), но порядок сообщений был в порядке в SocketIO и ws — даже когда сервер наполовину умирал под стресс-тестом . - person Gábor Imre; 28.10.2015