Каков наилучший способ проверить состояние компьютера в режиме онлайн?

#node.js #rest #sockets #websocket #socket.io

#node.js #остальное #сокеты #websocket #socket.io

Вопрос:

У меня есть сервер и несколько клиентских устройств. Все устройства работают под управлением ОС Ubuntu. На сервере у меня есть узловое приложение на основе ExpressJS. Я пытаюсь отследить состояние клиентских устройств в режиме онлайн.

Приложение NodeJS на сервере интегрировано с конечными точками get / post и веб-сокетами через SocketIO. Сервер имеет общедоступный IP-адрес в Интернете, а устройства не имеют общедоступных IP-адресов

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

Каков наилучший способ отслеживать состояние каждого устройства в режиме онлайн? (Учитывая производительность серверного приложения, задержку, надежность и т.д.)

  1. Периодически отправляя вызовы api с клиентских устройств на сервер
  2. Путем периодической отправки сообщений веб-сокета от клиентов на сервер
  3. Использование проверки сервером устройств по требованию через вызовы веб-сокетов
  4. Есть другой подход? Пожалуйста, объясните

Комментарии:

1. Возможно, это не оптимально, но «верный» способ заключается в том, чтобы каждый клиент периодически отправлял «сердцебиение», короткий, простой сигнал, который просто означает «Я все еще жив и подключен», а сервер обновлял статус в режиме онлайн после сердцебиения (пропущено 1 сердцебиение? Ну что ж. 3 подряд? Возможно, возникла проблема. 10? Устройство не работает). Это также действительно просто сделать, как только вы внедрили свой протокол связи.

2. Спасибо. Это механизм, который я использую в данный момент (я использую вызовы ReST). Но недавно я столкнулся с некоторыми случаями, когда наблюдается заметная разница во времени между фактическим состоянием в режиме онлайн и статусом в режиме онлайн, отображаемым в моем серверном приложении

Ответ №1:

Если вы открываете постоянное соединение websocket с вашим сервером на своих устройствах, socket.io предоставляет все, что вам нужно.

Смотрите pingTimeout и pingInterval опции здесь.

Пример:

 var io = require('socket.io')();
io.engine.pingInterval = 5000; // considers the connection closed after 5 seconds without a pong response from the client
io.engine.pingTimeout = 3000; // sends a new ping packet after 3 seconds  
  

Когда клиент отключается из-за тайм-аута запроса, в событии отключения сокета передается «тайм-аут запроса»:

 io.on("connection", function(socket) {
    socket.on("disconnect", function(socket, e) {
        // e contains "ping timeout"
        // possible other values: "transport close" (connection closed by the client)
        // or "server namespace disconnect" (connection closed by the server)
    });
}); 
  

То же самое происходит и в клиенте.

Смотрите также reconnection , reconnectionAttempts и так далее в клиенте: http://socket.io/docs/client-api /