#node.js #rest #sockets #websocket #socket.io
#node.js #остальное #сокеты #websocket #socket.io
Вопрос:
У меня есть сервер и несколько клиентских устройств. Все устройства работают под управлением ОС Ubuntu. На сервере у меня есть узловое приложение на основе ExpressJS. Я пытаюсь отследить состояние клиентских устройств в режиме онлайн.
Приложение NodeJS на сервере интегрировано с конечными точками get / post и веб-сокетами через SocketIO. Сервер имеет общедоступный IP-адрес в Интернете, а устройства не имеют общедоступных IP-адресов
Клиентские устройства также имеют небольшое приложение, которое может взаимодействовать с сервером через веб-сокеты и отправлять вызовы API.
Каков наилучший способ отслеживать состояние каждого устройства в режиме онлайн? (Учитывая производительность серверного приложения, задержку, надежность и т.д.)
- Периодически отправляя вызовы api с клиентских устройств на сервер
- Путем периодической отправки сообщений веб-сокета от клиентов на сервер
- Использование проверки сервером устройств по требованию через вызовы веб-сокетов
- Есть другой подход? Пожалуйста, объясните
Комментарии:
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 /