Лучший способ отслеживать текущих онлайн-пользователей - PullRequest
5 голосов
/ 01 декабря 2009

У меня есть требование, чтобы на моем сайте всегда отображалось количество пользователей, которые сейчас онлайн. Например, «35741 пользователь в настоящее время онлайн». Это не зависит от входа в систему, просто сколько пользователей в настоящее время на моем сайте. Я попытался использовать начало сеанса / конец сеанса для этого, однако конец сеанса не является надежным. Поэтому я получаю завышенные числа, так как начало сеанса добавляет числа, но конец сеанса не удаляет их, потому что не срабатывает.

Нет никакой дополнительной информации, которая будет собираться из этого (отчеты и т. Д.), Просто требуется, чтобы номер был показан. Очень простой запрос, который превращается в огромную сделку. Любая помощь приветствуется.

EDIT:

Я должен указать, что я также пытался использовать базу данных для этого. Простая таблица, которая содержит идентификатор сеанса и последний столбец активности. С каждым попаданием страницы я проверяю, находится ли сеанс в моей базе данных. Если нет, вставьте. Если это так, обновите время активности. Затем я запускаю процедуру, которая просматривает базу данных в поисках сеансов без активности за последние 20 минут. Этот подход, казалось, убил мой сервер SQL и / или IIS. Пришлось перезапустить сайт.

Ответы [ 7 ]

8 голосов
/ 01 декабря 2009

Лучший способ, как и вы, но время его из-за активности. Если в течение 5 минут какой-либо сеанс не получает доступ к странице, вы можете считать их больше неактивными.

3 голосов
/ 01 декабря 2009

Если вы используете членство в ASP.Net, взгляните на GetNumberOfUsersOnline .

2 голосов
/ 01 декабря 2009

Использование Счетчики производительности :

  • Сеансы сервера состояний активны : количество активных пользовательских сессий.
2 голосов
/ 01 декабря 2009

Для каждого пользовательского действия, которое вы можете записать, вам нужно считать его «онлайн» в течение определенного промежутка времени. В зависимости от сайта вы можете установить это на 5 минут. Фактический веб-запрос должен занимать менее секунды. Вы должны сделать некоторое предположение о том, как долго они могут оставаться на этой странице и ничего не делать, кроме как считаться онлайн.

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

0 голосов
/ 03 февраля 2011

Когда пользователь входит в систему, запишите его имя пользователя в HttpContext.Current.Cache со скользящим сроком действия (скажем, 20 минут).

Затем в Global.asax.cs в Application_PreRequestHandlerExecute «коснитесь» записи кэша для текущих пользователей, чтобы сбросить скользящий срок действия.

Когда пользователь явно выходит из системы, удалите его имя пользователя из HttpContext.Current.Cache.

Если вы сделаете это, в любой момент времени HttpContext.Current.Cache.Count выдаст вам количество текущих пользователей.

Примечание: это предполагает, что вы не используете кэш для других целей.

0 голосов
/ 01 декабря 2009

Не используйте сеансы для этого, если вам также не нужны сеансы для чего-то другого; в противном случае это излишне.

Предполагая установку на одном сервере, сделайте что-то вроде этого:

  1. Для каждого пользователя выведите файл cookie, содержащий уникальный идентификатор
  2. Ведение статической таблицы уникальных идентификаторов и времени их последнего доступа.
  3. В HttpModule (или Global.asax) введите новых пользователей в таблицу и обновите их время доступа (используйте соответствующую блокировку, чтобы предотвратить условия гонки)
  4. Периодически, либо из фонового потока, либо в соответствии с запросом пользователя, удаляйте записи из таблицы, которые не сделали запрос в течение последних N минут. Возможно, вы также захотите поддержать явную функцию выхода из системы.
  5. Сообщите количество людей онлайн как размер таблицы

Если вы используете сеансы, вы можете использовать идентификатор сеанса в качестве уникального идентификатора. Однако имейте в виду, что идентификаторы сеанса не выдаются, пока вы не сохраните что-либо в словаре сеанса, если только у вас не настроено событие Session_Start ().

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

0 голосов
/ 01 декабря 2009

Расширение того, что сказал Шелковистый в своем ответе - поскольку на самом деле http не имеет состояния, чтобы определить, находится ли пользователь в данный момент в сети, вы можете реально отслеживать только, сколько времени пользователь последний раз заходил на ваш сайт, и определять, сколько времени между запросами будет считают, что все еще активны.

Поскольку вы заявили, что это не основано на том, что пользователи вошли в систему, возможно, это просто из числа разных IP-адресов, с которых вы получили запросы за последние 5 минут (или сколько времени вы считаете «сетевым» тайм-аутом).

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