我有一個收集會話數據的系統。會話由許多不同的事件組成,例如「會話開始」和「執行的操作X」。沒有辦法確定會話何時結束,所以相反,心跳事件會定期發送。你如何對分佈式系統中沒有事件做出反應?
這是主要的併發症:沒有確定的方式,如果一個會話已經結束,唯一的辦法就是儘量不存在的事件,即沒有更多的心跳反應。我如何在分佈式系統中有效且正確地完成這項工作?
下面是一些背景的問題:
事件必須被組裝成表示會話中的對象。會話對象稍後會使用來自其他系統的附加數據進行更新,並最終用於計算會話數量,平均會話長度等。
系統必須水平縮放,因此有多個服務器可以接收事件以及處理它們的多個服務器。屬於同一會話的事件可以發送到不同的服務器並由其處理。這意味着我們無法保證它們將按順序處理,並且還有其他複雜情況,意味着事件可能會重複(並且總會有一些丟失的風險,無論是在它們到達我們的服務器之前,還是在處理完成之前)。
大部分情況已經存在,但我沒有很好的解決方案來有效地和正確地確定會話何時結束。我現在的做法是定期搜索「不完整」會話對象的集合,查找任何未等待兩次心跳的時間的更新,然後將這些對象移至另一個具有「完成」會話的集合。此操作既耗時又低效,並且水平伸縮效果不佳。基本上,它包括對代表最後一個時間戳的列進行排序,並過濾掉任何不夠長的行。聽起來很簡單,但很難並行化,如果你經常這樣做,你就不會做其他任何事情,數據庫會忙於過濾數據,如果你不經常做足夠的話,每次運行都會很慢,因爲有處理太多。
我想反應過來的時候會話尚未一會兒更新,不輪詢每個會話,看它是否也已更新。
更新:只是爲了給你的感覺;在任何時候都有數十萬個會話活動,最終會有數百萬個會話。浮現在腦海
多久你需要知道,如果一個會話已經完成? – 2011-04-28 12:28:26
大約在幾分鐘內。 – Theo 2011-04-28 18:23:50