Как я могу перехватить неудачные сообщения WebSocket? - PullRequest
0 голосов
/ 04 марта 2020

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

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

Существует событие error, но я не вижу возможности связать его с сообщениями, которые я пытался отправить.

Я пытаюсь что-то сделать как это:

const ws = new WebSocket(...);
// ... ensure the WebSocket is open at some point
// and we can assume `ws.readyState === WebSocket.OPEN` at the time of this call
try {
  ws.send(
    message
  );
} catch (e) {
  bufferedMessages.push(message);
}

но я не думаю, что это вызовет bufferedMessages.push(message), если клиент отключится во время выполнения ws.send(message).

1 Ответ

1 голос
/ 04 марта 2020

Легко, пусть клиент постоянно возвращает полученные сообщения.

Или повторно отправляет последнее полученное сообщение при переподключении и сохраняет буфер скользящего окна на сервере.

Или комбо. Пометьте каждое сообщение UUID, и пусть клиент подтвердит их UUID и отправит flu sh из буфера сервера на ack. Это дает вам симпатичное solid скользящее окно, которое соответствует тому, что, как вы знаете, было доставлено.

Первый Google-хит "Надежность WebSockets" имеет следующее:

Но WebSocket ненадежен, вы ничего не знаете, если клиенты пропустили некоторые сообщения, потому что через некоторое время соединение было разорвано. Как насчет того, являются ли сообщения критическими для ваших клиентов.

8 ошибок распределенных вычислений # 1: «Сеть надежна».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...