2009-12-15 4 views
4

나는 다음과 같은 매개 변수를 캡처 싶습니다 :사용자 온라인 상태를 추적하는 방법은 무엇입니까?

lastAccessedTime을 - 시간을 사용자가 사이트를 isOnline (보통 로그인 프로세스 중에 표시) 마지막

방문했을 때 - 사용자가 경우 부울 표현하기를 온라인 여부.

. 이러한 변수를 User 테이블 자체의 일부로 사용하는 것이 맞습니까 아니면 별도의 사용자 감사 테이블을 통해 처리해야합니까?

b. 특정 SOAP/REST API가 API 호출을 통해 기능을 노출하는 경우 위 매개 변수를 어떻게 추적합니까? (예 : 이러한 경우 lastAccessedTime을 수정 하시겠습니까? 사용자가 포털에 로그인하면 혼란 스러울 수 있습니다. isOnline 비트도 의미가 없습니다.) 사용자가 API 호출을 수행하는 경우).

답변

6

사용자에게 다시 연결되는 세션 테이블을 만들 것입니다. isOnline 필드 대신 마지막 x 시간 동안 활성화 된 세션에 대한 쿼리를 실행하기 만하면됩니다. 또한 요청이 API를 통해 오더라도 각 요청으로 해당 세션 필드를 업데이트합니다.

이렇게하면 세션 테이블을 정리하는 데 약간의 오버 헤드가 발생하지만 사용자 테이블을 비 사용자 정보로 정리하지 않아도됩니다. 사용자 정보는 제거 할 수 없습니다.

3

user 테이블의 lastTimeActive 필드를 만들고 각 페이지 액세스로 업데이트하십시오. 귀하의 "온라인 사용자"목록은 lastTimeActive가 5 분 이내에있는 모든 사용자입니다.

1

다른 테이블 (userid, lastTimeActive)을 만들고 자주 &을 업데이트하여 테이블을 확인하십시오.

// update 
update onlineusers set lastTimeActive = getdate() where userid=1234 

// check 
delete from onlineusers where lastTimeActive < dateadd(minute,-5,getdate()) 
+0

오, 안돼 ... 그건 끔찍한데 ... 서버를 죽일거야 ... – Faruz

+1

나는 1000.000 명 이상의 사용자가있는 포털을 운영하고있다. 그러나 한 번에 100 명의 온라인 사용자 만 있습니다 (1 % 미만). 사용자 테이블을 쿼리하는 대신 새 테이블을 선택/업데이트/삭제하는 것이 좋습니다. –

1

HTTP를 통한 사용자 상태 (onine/offline)를 추적 할 때 가장 큰 문제점은 사용자가 오프라인 상태가되었는지 판단하는 것입니다.

사용자가 온라인 상태 일 때 쉽게 판단 할 수 있습니다. 인증 된 요청이있는 것만으로도 사용자가 활성 상태라고 가정합니다. 그러나 HTTP는 상태가 없으므로 이후 요청이 없으면 사용자가 오프라인이되었거나 온라인 상태이지만 최근에 앱과 관련된 특정 작업을 수행하지 못했음을 의미 할 수 있습니다.

따라서 가장 좋은 추측은 시간 제한을 설정하고 해당 제한 시간 동안 사용자가 요청하지 않은 경우 오프라인 상태로 전환하는 것입니다.

가장 간단한 구현은 Jonathan Sampson이 제안한대로 lastTimeActive를 사용하는 것입니다. 그러나 이것은 사용자 세션의 길이를 알려주지 못하며, 현재 누가 온라인에 접속했는지에 대한 근사치 만 제공합니다.

더 복잡한 접근 방식은 lastTimeActive 및 lastTimeLoggedIn을 갖는 것입니다. LastTimeLoggedIn은 첫 번째 인증 요청시 이전 인증 요청으로부터 5 분 이상으로 설정됩니다. 지난 5 분 내에 인증 된 요청이있는 경우 사용자는 온라인으로 간주됩니다. 사용자의 세션 길이는 lastTimeActive와 lastTimeLoggedIn의 시간 차이입니다.

앱이 사용자에게 로그 아웃 할 수있는 선택권을 제공하는 경우 해당 작업을 오프라인으로도 간주합니다. 그러나 앱이 은행 용 앱이 아니라면 사용자가 브라우저를 닫을 가능성이 있습니다.

또한 사용자의 오프라인/온라인 상태를 업데이트하기위한 배경 스레드는 피하십시오.특정 사용자의 상태에 대한 명시적인 요청이 있고 요청한 사용자 만 업데이트해야하는 경우에만 위의 로직을 실행해야합니다.

관련 문제