過濾伺服器的重複訊息

來源:互聯網
上載者: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秒的訊息.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.