2009-12-15 89 views
4

我想捕捉以下參數:如何跟蹤用戶在線狀態?

lastAccessedTime - 的時間,當用戶訪問該網站的最後時間(通常在登錄過程中示出)

isOnline - 一個布爾值來表示,如果用戶是在線或不在線。

a。將這些變量作爲用戶表本身的一部分,還是應該通過單獨的用戶審計表處理?

b。如果某些SOAP/REST API通過API調用公開了這些功能,那麼您如何跟蹤上述參數(例如,在這種情況下您會修改lastAccessedTime--如果用戶登錄門戶網站,這可能會導致用戶混淆,而且在線位也不會有意義如果用戶進行API調用)。

回答

6

我會創建一個鏈接回用戶的會話表。而不是一個isOnline字段,我只會運行一個查詢,查詢在最後x時間內處於活動狀態的會話。我也會用每個請求更新該會話字段,即使該請求是通過API傳遞的。

這確實會在修剪會話表時產生一些開銷,但是您也不會用非用戶信息弄亂用戶表,這些信息無法修剪。

3

在用戶表中創建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 2009-12-15 06:42:24

+1

我保持超過1000.000用戶的一個門戶。但是一次只有100個在線用戶(不到1%)。選擇/更新/刪除新表比查詢用戶表更好。 – 2009-12-15 06:45:32

1

通過HTTP跟蹤用戶存在(onine/offline)最大的問題是如何確定用戶何時離線。

很容易確定用戶何時聯機 - 只有經過身份驗證的請求才會假定用戶處於活動狀態。但是,由於HTTP是無狀態的,因此缺少後續請求可能意味着用戶已脫機,或者用戶在線,但最近沒有做任何特定於您的應用的操作。

因此,您可以做出的最佳猜測是超時,並且如果用戶在該超時期間未提出請求,則切換到脫機狀態。正如Jonathan Sampson所建議的那樣,最簡單的實現方法是使用lastTimeActive。但是,這不會給你用戶會話的長度,只是此時誰在線的近似值。

更復雜的方法是使用lastTimeActive和lastTimeLoggedIn。 LastTimeLoggedIn在第一次驗證請求時設置,與前一個驗證請求相距超過5分鐘。如果在過去五分鐘內有認證請求,則認爲用戶在線。用戶的會話長度是lastTimeActive和lastTimeLoggedIn之間的時間差。

如果您的應用程序還提供了向用戶註銷的選擇,則您可以考慮將該操作也視爲脫機。但是,除非您的應用程序是銀行應用程序,否則用戶可能會關閉瀏覽器。

此外,避免任何後臺線程更新您的用戶的脫機/在線狀態。你應該在運行上述邏輯,只有當有關於特定用戶的狀態的明確要求,你應該只更新您將被詢問用戶。