IM群聊訊息的已讀回執功能該怎麼實現?

2021-10-01 14:23:14 字數 2276 閱讀 8227

學習交流:

- 即時通訊開發交流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 ...