2016-08-24 3 views
0

Ну, я сократил свою задачу следующим образом:WebSocket - лучший способ пространства из ответа сервера

У меня есть node.js сервера отправки ответов на мой WebSocket клиента (браузер) с интервалом 2 сек. Клиентский код для получения ответа выглядит следующим образом:

socket.onmessage = function (message) { 
    //display message 
}   

В большинстве случаев я могу получить ответ не менее 2 секунд на клиенте. Однако иногда из-за плохого сетевого подключения или высокой нагрузки на сервер я могу получить пакет ответов с сервера. Например, вместо одного ответа за 2 секунды я получаю сразу 3 ответа за 6 секунд.

Как я могу справиться с ситуацией на клиенте, чтобы сохранить задержку не менее 2 секунд?

Один из вариантов заключается в том, чтобы ставить в очередь все ответы на клиенте, а затем иметь таймер, который периодически проверяет очередь. Есть ли способ лучше?

Также есть функция onmessage потокобезопасная? То есть, новый ответ от блоков сервера во время выполнения блока кода?

ответ

0

В браузере есть только один поток, на котором работает ваш JavaScript (если вы не используете рабочих), поэтому он является потокобезопасным.

Однако цикл событий будет заблокирован до тех пор, пока ваш обработчик onmessage не вернется, а все остальные сообщения будут поставлены в очередь в очереди событий до тех пор, пока они не будут обработаны.

Вы можете добавить сообщения в очередь, как только они прибудут, и интервал, выполняемый каждые 2 секунды, чтобы вытащить элемент из очереди и обработать его.

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

Одно из решений от here может обеспечить ограничение скорости в очереди вызова функции, которое вы можете использовать для ограничения ограничения обновлений своего пользовательского интерфейса. Не забудьте сделать скорость быстрее, чем сервер, чтобы он мог догнать большие очереди.

+0

Клиент обновляет пользовательский интерфейс для каждого ответа от сервера. И важно, чтобы пользователь немного задержался, чтобы увидеть изменения. – Kamil

+0

Я бы рекомендовал использовать такую ​​функцию, как те, которые упомянуты в http://stackoverflow.com/questions/23072815/throttle-javascript-function-calls-but-with-queuing-dont-discard-calls, что позволяет использовать функцию в очереди и ограничено. Однако, если вы используете этот метод, убедитесь, что задержка немного меньше, чем сервер, чтобы он мог догнать –

Смежные вопросы