學習交流:
- 即時通訊開發交流3群:185926912[推薦](本文同步發布於:- 移動端im開發入門文章:《新手入門一篇就夠:從零開發移動端im》
《im訊息送達保證機制實現(二):保證離線訊息的可靠投遞》
《如何保證im實時訊息的「時序性」與「一致性」?》
《im群聊訊息如此複雜,如何保證不丟不重?》
《一種android端im智慧型心跳演算法的設計與實現**(含樣例**)》
《移動端im登入時拉取資料如何作到省流量?》
《通俗易懂:基於集群的移動端im接入層負載均衡方案分享》
《**移動端im的多點登陸和訊息漫遊原理》
《im開發基礎知識補課(一):正確理解前置http sso單點登陸介面的原理》
《im開發基礎知識補課(三):快速理解服務端資料庫讀寫分離原理及實踐建議》
《im開發基礎知識補課(四):正確理解http短連線中的cookie、session和token》
《im群聊訊息的已讀回執功能該怎麼實現?》(本文)
另外,如果您是im開發初學者,強烈建議首先閱讀《新手入門一篇就夠:從零開發移動端im》。
首先我們需要了解一下群訊息的設計、投遞流程以及可達性保證機制,因不是本文要討論的重點,所以盡量言簡意賅,更詳細的資料請見下方的推薦文章列表。
如您對聊天訊息的投遞和送達機制等尚無概念,可先讀本系列文章的以下幾篇,有助於您詳細掌握這方面的內容:
《im訊息送達保證機制實現(二):保證離線訊息的可靠投遞》
《如何保證im實時訊息的「時序性」與「一致性」?》
《im群聊訊息如此複雜,如何保證不丟不重?》
大家一起跟著樓主的節奏,一步一步來看群訊息怎麼設計。
核心問題1:群訊息,只存乙份?還是,每個成員存乙份?
答:存乙份,為每個成員設定乙個群訊息佇列,會有大量資料冗餘,並不合適。
核心問題2:如果群訊息只存乙份,怎麼知道每個成員讀了哪些訊息?
答:可以利用群訊息的偏序關係,記錄每個成員的last_ack_msgid(last_ack_time),這條訊息之前的訊息已讀,這條訊息之後的訊息未讀。該方案意味著,對於群內的每乙個使用者,只需要記錄乙個值即可。
解答上述兩個核心問題後,很容易得到群訊息的核心資料結構。
群訊息表:記錄群訊息
group_msgs(msgid, gid, sender_uid, time, content);
各字段的含義為:訊息id,群id,傳送方uid,傳送時間,傳送內容。
群成員表:記錄群裡的成員,以及每個成員收到的最後一條群訊息
group_users(gid, uid, last_ack_msgid);
各字段的含義為:群id,群成員uid,群成員最後收到的一條群訊息id。
其整個訊息傳送的流程1-4如上圖:
前面的基礎知識我們已經了解的差不多,本節來討論本文的重點內容,即群聊已讀回執流程到底該怎麼設計。
對於傳送方傳送的任何一條群訊息,都需要知道,這條訊息有多少人已讀多少人未讀,就需要乙個基礎表來記錄這個關係。
訊息回執表:用來記錄訊息的已讀回執
msg_acks(sender_uid, msgid, recv_uid, gid,if_ack);
各字段的含義為:傳送方uid,訊息id,回執方uid,群id,回執標記。
增加了已讀回執邏輯後,群訊息的流程會有細微的改變,見下圖:
接著,server收到訊息後,除了要:
之外,還需要:
接收方修改last_ack_msgid的流程,會變為:
這裡的初步結論是:
可見,其訊息風暴擴散係數非常之大。
同時:或者直接放到應用層keepalive請求裡,做到0額外請求增加。)
會帶來什麼***?
答:已讀回執更新不實時,最壞的情況下,1分鐘才更新回執。當然,可以根據效能與產品體驗來折衷配置這個輪詢時間。
如何降低資料量?
答:回執資料不是核心資料
對於群訊息已讀回執,一般來說:
如果要對進行優化,可以:
物理刪除已讀回執資料,定時刪除或歸檔非核心歷史資料。
(本文同步發布於:
訊息已讀未讀的模型設計 設計沉思錄 訊息中心設計
本篇文章,從訊息中心的定義 發展 組成 以及各行業間的異同等方面做了詳細介紹,讓我們對訊息中心有乙個整體了解,便於找到設計切入點,或幫助我們評估自身產品的訊息中心。從一致性和服務號兩個方面,闡述了如何將訊息中心的優化收益最大。資訊互聯,不同的時代,雖然傳遞訊息的介質一直在發生改變,但訊息的本質都是一...
rabbitMq實現已讀訊息和未讀訊息的查詢
進行鏈結常見 xfrabbittemplate 自定義的鏈結建立類 channel channel xfrabbittemplate.getchannel 消費者定義 channel.queuedeclare queue.text message,true,false,false,null 從佇列中...
微信,找回好友 群聊使用者撤回的訊息
coding utf 8 import itchat from itchat.content import text from itchat.content import import sys import time import re import os msg information face ...