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

Клиентската част на моето приложение трябва да обработва WebSocket съобщения в строг ред. За съжаление всяко съобщение се обработва доста дълго (около 3 секунди), така че друго се появява преди първото да е приключило. След няколко съобщения редът е съвсем различен. Как да решим този проблем в JavaScript.

Мислех за опашка със задачи, но не знам как да я внедря, за да не блокира GUI на моето уеб приложение.


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