Node.js — Кто онлайн?

Сегодня я расскажу, как на node.js + Express получить количество пользователей онлайн или Список онлайн пользователей

Вполне типичная задача, но если не знать особенностей работы с node.js, к ней трудно подступиться


Варианты реализации:
1.Вебсокеты
В моем проекте не используются вебсокеты, а использовать столь не кроссбраузерное решение в приложении, которое не требует наличия вебсокетов для своей работы считаю бессмысленным
2.Polling
абсолютно не подходит, так как сильно грузит сервер, если каждый пользователей будет поллить сервер, то ему суждено пасть.
3.Расчет исходя из последней даты посещения
Для меня это оптимальный вариант. Нет лишних запросов, потребляет немного памяти и немного процессорного времени.

Итак, для начала нам нужно хранить список пользователей с датой посещения. Для начала создадим middleware-функцию, которая при каждом запросе пользователя будет обновлять дату посещения

[javascript]
var usersActivity = {};
app.configure(function () {

app.use(function (req, res, next) {
usersActivity[req.sessionID] = new Date().getTime();
next();
});
});
[/javascript]

переменная usersActivity намеренно создана в верхней области видимости, для того чтобы ее можно было использовать в route’ах приложения
next() — передача запроса по цепочке. Без этого работать не будет. Express вовсю использует паттерн , который называется Chain of Responsibility(Цепочка обязанностей), он вообще используется обширно в js просто потому что javascript с создаваемыми на лету анонимными функциями идеально подходит к созданию цепочек из таких функций.
в объекте usersActivity мы сохраняем timestamp последнего запроса.

Полдела сделано, теперь нам нужно время от времени обрабатывать имеющиеся данные и обновлять количество

[javascript]
var playersOnline = 0;
setInterval(function(){
playersOnline = 0;
var now = new Date().getTime();
//5 минут
var period = 5*60*1000;
var since = now — period;

_.each(usersActivity, function(v){
if (v > since){
playersOnline++;
}
});
}, 30*1000);
[/javascript]

setInterval запускает функцию раз в 30 секунд, и раз в 30 секунд мы проходимся по списку, в поиске пользователей, кто авторизовался менее чем 5 минут назад. Переменная playersOnline содержит количество таких пользователей.

Функция _.each() — это аналог php foreach для javascript — входит в библиотеку Underscore, которую я очень рекомендую использовать.

Уверен, основываясь на представленном примере, сделать список «Кто онлайн» не составит вам труда.

Оставить комментарий