Лучший способ отслеживать текущих онлайн-пользователей

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

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

РЕДАКТИРОВАТЬ:

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


person mlb    schedule 30.11.2009    source источник
comment
Лучше всего выбрать Random.Next. В остальном все примерно так же надежно.   -  person Yuriy Faktorovich    schedule 01.12.2009
comment
@YuriyFaktorovich, технически верно :)   -  person Halil Özgür    schedule 26.12.2011


Ответы (7)


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

person Noon Silk    schedule 30.11.2009
comment
Хорошо ... так что простите меня за глупый вопрос, но как мне отслеживать сеанс без использования базы данных? Это приложение написано на .NET 1.1. - person mlb; 01.12.2009

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

person Scott Ivey    schedule 30.11.2009
comment
OP: Это не на основе входа в систему, Membership.GetNumberOfUsersOnline основано на пользователях, вошедших в систему. - person Michał Powaga; 14.09.2013

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

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

person Larsenal    schedule 30.11.2009

Используйте Performance Счетчики:

  • Активные сеансы сервера состояний: количество активных пользовательских сеансов.
person Remus Rusanu    schedule 30.11.2009

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

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

person Jeremy Raymond    schedule 30.11.2009

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

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

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

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

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

person RickNZ    schedule 01.12.2009

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

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

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

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

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

person Aheho    schedule 03.02.2011