過濾伺服器的重複訊息
來源:互聯網
上載者:User
需求情境描述:C/S結構的程式. 用戶端監聽伺服器端發來的資訊,並向使用者報告. 內容相同的資訊,伺服器端可能會重複發送3到5次, 每次間隔0.01秒. 使用者希望, 對於這些重複發送的資訊, 只報告一次即可. 分析:這裡面有幾個關鍵的問題:
首先,
如何判斷當前的訊息是否是重複訊息. 可以通過儲存一個訊息列表來實現.這裡有兩種實現方法: 1, 保證訊息列表是絕對最新的, 這樣,新訊息到來的時候只要判斷列表中是否存在即可. 2, 不保證列表是絕對最新, 新訊息來的時候除了判斷內容,還要判斷時間. 這兩種方案其實是在“即時維護列表的嚴格最新”和“搜尋時的進行比較的條件和次數”兩件事情之間的權衡. 由此引發第二個問題:
列表更新的時機。列表有必要在任何時刻都是嚴格最新的嗎?顯然沒有。即使需要最新,也只要在搜尋列表之前保證是最新的就可以了。所以,無論是掃描線程,還是計時器,雖然嚴格符合了程式的要求,但是不必要的。因此,我們可以給出幾個更新的時機,比如,每隔固定時間進行更新,有訊息到達時進行更新,或訊息數量到達某一上限時進行更新,在其中權衡。(酷似記憶體管理中的“快表淘汰演算法”) 權衡下來,對於第一個問題,對列表的遍曆和維護的開銷要大於增加一個比較條件的開銷。對於第二個問題,我們選擇了在訊息數量達到某個閾值時進行更新。如下4個方案,展示了對以上兩個關鍵問題逐步改善的過程。 方案1:把收到的資訊儲存起來, 每當新來一個資訊, 和儲存的訊息比較, 如果訊息列表中存在某個訊息和當前訊息內容相等(無需比較時間. 因為列表中的訊息一定是最新的), 則丟棄該訊息. 否則,向使用者報告該訊息, 並加入訊息列表. 訊息列表中的每條訊息都附加一個計時器. 到0.05秒後自行離開訊息列表. 方案2:篩選訊息的方法和方案1相同. 和方案1的差別是, 無需給每個訊息都附加計時器. 而是另外啟動一個監視線程, 每隔0.01秒掃描訊息列表, 刪除時間戳記和目前時間之差超過0.05秒的訊息. 方案3:把收到的資訊儲存起來, 每當新來一個資訊, 首先掃描訊息列表, 刪除時間戳記和目前時間之差超過0.05秒的訊息. 然後尋找訊息列表, 如果訊息列表中存在某個訊息和當前訊息內容相等, (無需檢查時間戳記. 因為列表中的到期的訊息已經被刪除), 則丟棄該訊息. 否則,向使用者報告該訊息, 並加入訊息列表. 方案4:每當新來一個資訊, 尋找訊息列表. 如果訊息列表中存在某個訊息和當前訊息內容相等, 並且時間戳記之差小於0.05秒(因為列表中的訊息不一定是最新的), 則丟棄該訊息. 否則,向使用者報告該訊息, 並加入訊息列表. 另外, 不使用監視線程來掃描訊息列表. 而是規定一個閾值, 每當訊息列表中的訊息數量超過這個閾值的時候, 掃描訊息列表, 刪除時間戳記和目前時間之差超過0.05秒的訊息.