IM的羣組消息同步具體設計

上一篇Blog我提到過,每個Channel都有一個本身的leveldb作緩存。同時,有位朋友建議我不要用緩存,通過思考後,我依然決定使用緩存。我爲何要這麼作呢。git

如上面圖的場景,一個Sender,兩個Reciver。其中一個Reciver是一個一直在線的用戶,而另外一個Reciver是一個由於某種緣由離線了一小段的用。在途中Channel中的K爲鍵而V爲數據。github

咱們能夠按照2個主要狀況分析:緩存

  1. Reciver是暫時離線有同步Key。spa

  2. Reciver全新加入一個Channel無同步Key。隊列

對於第一種狀況:ci

咱們能夠快速的將用戶同步到K:SeqN-1處,若是Sender在這個時候發送數據,那麼這個用戶用K:SeqN-1再次同步Channel消息的時候就會發現K:SeqN的存在。get

對於第二種狀況:同步

按照小時切分數據,咱們很容易計算出當前小時區間,同時咱們知道小時隊列中有多少數據。咱們能夠快速的給出最後N-1條數據,並將用戶同步到K:SeqN-1。若是用戶要翻看前面的歷史,咱們一樣能夠使用K:Seq1向前同步。it


那麼這麼作的好處是什麼,就是全部羣組中的用戶看到的消息順序是一致的,而非像QQ羣組那樣,偶爾出現,某我的和羣組中全部人的消息順序不一致的問題。channel

模型簡單實現https://github.com/DavidAlphaFox/mm_channel

相關文章
相關標籤/搜索