Наводнение WebSocket
Я новичок в websocket, и я реализовал websocket в веб-приложении, которое на стороне сервера написано на java, а на стороне клиента - javascript. Сервер отправляет уведомления клиенту через websocket. Интересно, что случилось бы, если бы клиент не был достаточно быстрым, чтобы обрабатывать входящие сообщения так же быстро, как сервер их отправляет. Например, возможно, что сервер будет отправлять около 200 текстовых сообщений в секунду, клиент работает медленно и обрабатывает 100 сообщений в секунду. Я считаю, что браузер ставит в очередь входящие сообщения до их обработки, но не уверен. Я также должен знать, как проверить размер буфера и его лимит, и что произойдет, если будет достигнут лимит буфера. Любую идею о том, как я могу смоделировать такую ситуацию, я попытался:
webSocket.onmessage = function (message) {
var bool = true;
var datenexexec = Date.now() + 1000;
while(bool) {
if(Date.now() > datenexexec){
bool = false;
}
}
}
но это приводит к зависанию браузера и последующему падению. Спасибо за помощь.
1 ответ
Для отправки данных быстрее, чем клиент может их прочитать, вот что в итоге произойдет.
- Клиентский буфер приема будет заполнен
- Сработает управление потоком TCP, и серверу будет приказано прекратить отправку большего количества пакетов в этот сокет.
- Затем сервер будет буферизовать исходящие пакеты, пока не будут сняты ограничения управления потоком.
- В конечном итоге будет достигнут предел буфера на стороне сервера, и базовый TCP будет отклонять запись в сокет
- Это вернет ошибку при отправке TCP.
- В зависимости от того, какую серверную библиотеку вы используете для webSocket, в какой-то момент вы должны получить сообщение об ошибке при выполнении операции отправки.
TCP является надежным протоколом, поэтому он просто буферизуется и передает позже, пока буфер не заполнится. Он не должен потерять пакеты сам по себе (если соединение не будет разорвано), но когда буферы заполнены, он выдаст вам ошибку, которую он больше не сможет отправить, потому что буфер заполнен.
Что касается кода на стороне клиента, который вы пробовали, вы не можете быть заняты / ждать в Javascript очень долго. Это убивает цикл обработки событий и в конечном итоге приводит к отключению механизма сценариев.
Единственный способ симулировать это - попытаться отправить больше пакетов, чем может обработать клиент. Вы можете закодировать "медленный" клиент, который может обрабатывать каждый пакет, возможно, 250 мс в коротком цикле "занят / ожидание", и "быстрый" сервер, который отправляет поток пакетов, и вы должны иметь возможность его смоделировать.