2008-10-06 12 views
8

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

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

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

  2. Отправляйте «кто онлайн-запрос» из нашего программного обеспечения, ища ответы, это может быть сделано через запланированный интервал, а затем печать записи пользователя с текущей датой и временем для каждого полученного мной ответа.

Что вы думаете об этом? И как бы вы справились с этой ситуацией?

Разъяснение

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

Под Windows я бы назвал клиент-сервер.

Разъяснение

Я использую архитектуру н-уровневую, так что мой бизнес-объекты обрабатывать все взаимодействия с уровнем представления. Этот уровень представления может подпитывать клиент-серверное приложение Windows, веб-приложение, веб-сервис и т. Д.

Это не приложение для большого трафика, так как оно было разработано для нашего клиента, возможно, не более 100 пользователей.

+0

Стратегия это может быть совершенно разными в зависимости от того, является ли это веб-приложение/клиент-сервер и т.д. - Я думаю, нам нужно немного больше деталей в стеке/используемая архитектура – Whisk 2008-10-06 13:24:40

ответ

3

Наше решение состоит в том, чтобы сохранить таблицу «Транзакции» (которая следует за тем, что было сделано), в дополнение к нашей таблице «Сессия» (которая следует за тем, кто был здесь). Инструкции UPDATE, INSERT и DELETE управляются через объект «Транзакция», и каждая из этих инструкций SQL хранится в таблице «Транзакция», как только она была успешно выполнена в базе данных (в зависимости от обновленных таблиц: у нас есть возможность специально следуйте некоторым таблицам и игнорируйте другие). В этой таблице «Транзакция» есть другие поля, такие как transactiontType (I для INSERT, D для DELETE, U для UPDATE), transactionDateTime и т. Д. И внешний ключ «sessionId», сообщая нам, наконец, кто отправил инструкцию. Даже через некоторый код можно определить, кто и что (когда Гас создал запись в понедельник, Тим изменил Стоимость единицы во вторник, Лиз добавила дополнительную скидку в четверг и т. Д.).

Pros для этого решения являются:

  1. вы сможете сказать «что, кто и когда», и показать его своим пользователям! (Вам потребуется код для анализа заявления SQL)
  2. , если данные репликации и репликации не удается, вы можете восстановить базу данных с помощью этой таблицы

Cons являются

  1. 100 000 данных обновления в месяц означают 100 000 записей в Tbl_Transaction
  2. Наконец, эта таблица имеет тенденцию быть 99% от объема вашей базы данных

Наша чо лед: все записи старше 90 дней автоматически удаляются каждое утро

1

Я видел стратегию 1 раньше. Конечно, сайт был маленьким.

0

Я бы просто бросил стол записи журнала в db.

UserId INT FK
Действие голец (3) («в» или «из»)
Время DateTime

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

0

Я работал со многими системами, которые использовали первый метод, который вы указали, с небольшим тщательным планированием, это может быть сделано таким образом, который действительно не имеет большого эффекта.

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

Если вы действительно ищете в настоящее время онлайн, ваш первый вариант является лучшим.

0

Если у вас есть данные сеанса, просто используйте это. Большинство сессионных систем уже имеют временные метки, поэтому они могут истекать сеансы, не используемые в течение x минут.

0

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

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

0

[ОТКАЗ 1 --- Java решение]

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

[ОТКАЗ 2 --- Код не тестируются или скомпилирован]

public class ActiveSessionsListener implements HttpSessionListener { 
    public void sessionCreated(HttpSessionEvent e) { 
     ServletContext ctx = e.getSession().getServletContext(); 
     synchronized (ctx) { 
      Integer count = ctx.getAttribute("SESSION_COUNT"); 
      if (count == null) { count = new Integer(0); } 
      ctx.setAttribute("SESSION_COUNT", new Integer(count.intValue() + 1); 
     } 
    } 
    public void sessionDestroyed(HttpSessionEvent e) { 
     ... similar for decrement ...  
    } 
} 

и зарегистрировать это в вашем web.xml:

<listener-class>com.acme.ActiveSessionsListener</listener-class> 

Надеется, что это помогает.

0

Единственная проблема с решением для веб-приложений - вы часто не знаете, когда кто-то подписывается. Очевидно, что если у вас есть требование входа в систему/аутентификация, вы можете захватить, когда человек подписывается, и как часть вашего кода доступа к данным вы можете регистрировать, когда человек попадает в базу данных. Но вам придется согласиться с тем, что на надежном пути захвата, когда человек выйдет из системы - многие просто удалятся от сайта, не предпринимая действия «выйти из системы».

0

Я бы предположил, что использование триггера будет разумным вариантом, который помешал бы вам избежать каких-либо логических различий между сетью и не-веб-средой (или любой другой средой, если на то пошло). Тем не менее, это только фиксирует изменения в среде и ничего не делает, когда выбираются утверждения. Это, однако, можно преодолеть, если все ваши команды из ваших приложений запускаются через хранимые процедуры.

0

Интересно, как это делает сайт, подобный stackoverflow?

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

0

С помощью веб-приложения понятие «онлайн» немного туманно. Лучшее, что вы действительно можете сделать, это «сделать запрос за последние X минут» или, возможно, «пройти проверку подлинности за последние X минут».

Выберите набор событий (выполненный запрос, выполненное обновление, аутентифицированное ...) и запишите их в таблицу БД.

Войдите их к столу в отдельной БД