国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

群聊比單聊,為什么復雜這么多?

開發 開發工具
群聊是多人社交的基本訴求,一個群友在群內發了一條消息,期望做到在線的群友能第一時間收到消息,群消息的實時性、可達性、離線消息的復雜度,要遠高于單對單消息。

群聊是多人社交的基本訴求,一個群友在群內發了一條消息,期望做到:

  • 在線的群友能***時間收到消息;
  • 離線的群友能在登陸后收到消息;

群消息的實時性、可達性、離線消息的復雜度,要遠高于單對單消息。

常見的群消息流程如何?

群業務的核心數據結構有兩個。

群成員表:

  1. t_group_users(group_id, user_id) 

畫外音:用來描述一個群里有多少成員。

群離線消息表:

  1. t_offine_msgs(user_id, group_id, sender_id,time, msg_id, msg_detail) 

畫外音:用來描述一個群成員的離線消息。

業務場景舉例:

  • 假設一個群中有x,A,B,C,D共5個成員,成員x發了一個消息;
  • 成員A與B在線,期望實時收到消息;
  • 成員C與D離線,期望未來拉取到離線消息;

典型群消息投遞流程,如圖步驟1-4所述:

  • 步驟1:群消息發送者x向server發出群消息;
  • 步驟2:server去db中查詢群中有多少用戶(x,A,B,C,D);
  • 步驟3:server去cache中查詢這些用戶的在線狀態;
  • 步驟4:對于群中在線的用戶A與B,群消息server進行實時推送;
  • 步驟5:對于群中離線的用戶C與D,群消息server進行離線存儲;

典型的群離線消息拉取流程,如圖步驟1-3所述:

  • 步驟1:離線消息拉取者C向server拉取群離線消息;
  • 步驟2:server從db中拉取離線消息并返回群用戶C;
  • 步驟3:server從db中刪除群用戶C的群離線消息;

那么,問題來了!對于同一份群消息的內容,多個離線用戶似乎要存儲很多份。假設群中有200個用戶離線,離線消息則冗余了200份,這極大的增加了數據庫的存儲壓力。

如何優化,減少消息冗余量?

為了減少離線消息的冗余度,增加一個群消息表,用來存儲所有群消息的內容,離線消息表只存儲用戶的群離線消息msg_id,就能大大的降低數據庫的冗余存儲量。

群消息表:

  1. t_group_msgs(group_id, sender_id, time,msg_id, msg_detail) 

畫外音:用來存儲一個群中所有的消息內容。

群離線消息表,需要進行優化:

  1. t_offine_msgs(user_id, group_id, msg_id) 

畫外音:優化后只存儲msg_id。

這樣優化后,群在線消息發送就做了一些修改:

  • 步驟3:每次發送在線群消息之前,要先存儲群消息的內容;
  • 步驟6:每次存儲離線消息時,只存儲msg_id,而不用為每個用戶存儲msg_detail;

拉取離線消息時也做了響應的修改:

  • 步驟1:先拉取所有的離線消息msg_id;
  • 步驟3:再根據msg_id拉取msg_detail;
  • 步驟5:刪除離線msg_id;

優化后的流程,能保證消息的可達性么?例如:

  • 在線消息的投遞可能出現消息丟失,例如服務器重啟,路由器丟包,客戶端crash;
  • 離線消息的拉取也可能出現消息丟失,原因同上;

畫外音:單對單消息的可靠投遞一樣,是通過加入應用層的ACK實現的,群消息呢?

群消息,如何通過應用層ACK,保證消息的可靠投遞?

應用層ACK優化后,群在線消息發送又發生了一些變化:

  • 步驟3:在消息msg_detail存儲到群消息表后,不管用戶是否在線,都先將msg_id存儲到離線消息表里;
  • 步驟6:在線的用戶A和B收到群消息后,需要增加一個應用層ACK,來標識消息到達;
  • 步驟7:在線的用戶A和B在應用層ACK后,將他們的離線消息msg_id刪除掉;

對應到群離線消息的拉取也一樣:

  • 步驟1:先拉取msg_id;
  • 步驟3:再拉取msg_detail;
  • 步驟5:***應用層ACK;
  • 步驟6:server收到應用層ACK才能刪除離線消息表里的msg_id;

如果拉取了消息,卻沒來得及應用層ACK,會收到重復的消息么?

似乎會,但可以在客戶端去重,對于重復的msg_id,對用戶不展現,從而不影響用戶體驗。

對于離線的每一條消息,雖然只存儲了msg_id,但是每個用戶的每一條離線消息都將在數據庫中保存一條記錄,有沒有辦法減少離線消息的記錄數呢?

對于一個群用戶,在ta登出后的離線期間內,肯定是所有的群消息都沒有收到的,完全不用對所有的每一條離線消息存儲一個離線msg_id,而只需要存儲最近一條拉取到的離線消息的time(或者msg_id),下次登錄時拉取在那之后的所有群消息即可,而完全沒有必要存儲每個人未拉取到的離線消息msg_id。

群成員表,增加一個屬性:

  1. t_group_users(group_id, user_id, last_ack_msg_id) 

畫外音:用來描述一個群里有多少成員,以及每個成員***一條ack的群消息的msg_id(或者time)。

群消息表,不變:

  1. t_group_msgs(group_id, sender_id, time,msg_id, msg_detail) 

畫外音:還是用來存儲一個群中所有的消息內容。

群離線消息表:不再需要。

離線消息表優化后,群在線消息的投遞流程:

  • 步驟3:在消息msg_detail存儲到群消息表后,不再需要操作離線消息表(優化前需要將msg_id插入離線消息表);
  • 步驟7:在線的用戶A和B在應用層ACK后,將last_ack_msg_id更新即可(優化前需要將msg_id從離線消息表刪除);

群離線消息的拉取流程也類似:

  • 步驟1:拉取離線消息;
  • 步驟3:ACK離線消息;
  • 步驟4:更新last_ack_msg_id;

加入ACK機制,保證群消息的可靠投遞只會,假設1個群有500個用戶,“每條”群消息都會變為500個應用層ACK,似乎會對服務器造成巨大的沖擊。有沒有辦法減少ACK請求量呢?

批量ACK,是一種常見的,降低請求量的方式。

如果每條群消息都ACK,確實會給服務器造成巨大的沖擊,為了減少ACK請求量,可以批量ACK,批量ACK的方式又有兩種方式:

  • 每收到N條群消息ACK一次,這樣請求量就降低為原來的1/N了;
  • 每隔時間間隔T進行一次群消息ACK,也能達到類似的效果;

批量ACK有可能導致新的問題:如果還沒有來得及ACK群消息,用戶就退出了,這樣下次登錄似乎會拉取到重復的離線消息,怎么辦?

客戶端按照msg_id去重,不對用戶展現,就保證良好的用戶體驗。

群離線消息過多,拉取過慢,怎么辦?

分頁拉取(按需拉取),細節就不再展開了,都是常見的優化方案。

總結

群消息還是非常有意思的,做個簡單總結:

  • 不管是群在線消息,還是群離線消息,應用層的ACK是可達性的保障;
  • 群消息只存一份,不用為每個用戶存儲離線群msg_id,只需存儲一個最近ack的群消息id/time;
  • 為了減少消息風暴,可以批量ACK;
  • 如果收到重復消息,需要msg_id去重,讓用戶無感知;
  • 離線消息過多,可以分頁拉取(按需拉取)優化;

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2022-11-09 10:32:50

群業務群聊數據結構

2022-07-26 23:43:29

編程語言開發Java

2017-12-21 19:38:50

潤乾中間表

2013-01-15 09:41:45

編程語言

2016-12-01 13:40:37

2018-12-21 09:36:31

OLAP蘇寧Druid

2022-08-04 23:32:38

比特幣以太坊代幣

2015-06-25 13:31:19

2022-01-12 20:04:09

網絡故障斷網事件網絡安全

2024-06-14 09:21:32

2020-07-02 14:12:52

C++語言編程

2015-01-14 14:27:18

Docker容器鏡像

2024-03-01 17:01:15

GraphQL后端

2021-08-19 06:53:18

開發語言Java

2020-04-27 09:45:16

網絡工程師網絡技術網絡

2024-02-04 10:29:58

線程通信

2021-05-31 22:26:20

5G技術通信

2017-08-11 14:21:33

軟件開發前端框架

2023-07-17 08:21:52

漏洞版本項目

2024-04-02 08:41:10

ArrayListSubList場景
點贊
收藏

51CTO技術棧公眾號

欧美成人sm免费视频| 亚洲色图20p| 亚洲第一av网| 嫩草影院永久入口| 国产精品国模大尺度私拍| 青春草在线观看| 91美女视频网站| 日韩国产在线一区| 亚洲综合专区| 国产日韩av在线播放| 亚洲精品丝袜日韩| 久久6免费高清热精品| 国产剧情日韩欧美| 深夜视频一区二区| 欧美成人综合网站| 亚洲熟妇国产熟妇肥婆| 亚洲青青久久| 久久精品国产欧美激情| 狠狠操一区二区三区| 精品久久久久久无| 欧美黑人疯狂性受xxxxx野外| 亚洲激情在线观看| 日韩精品综合在线| 99精品热视频只有精品10| 精品欧美日韩在线| 91麻豆国产自产在线观看亚洲| 国内精品久久久久久| 精品福利一区| 99re视频| 国产一区二区电影| 国产丝袜一区二区| 欧美性片在线观看| 久久久精品国产| 久久不见久久见免费视频7| 91久久精品美女| 亚洲免费黄色| 成年人视频在线免费| 国产精品三级电影| 亚洲sss视频| 日韩一级黄色大片| 日本精品国产| 成人免费91在线看| 丝袜美腿亚洲综合| 日本在线观看免费视频| 欧美激情欧美| 国产精品va在线观看无码| 国产欧美视频一区二区三区| 男人久久精品| 中文字幕一区二区三区视频| 在线播放日本| 国产69精品久久久久9999| 亚洲激情久久| 久久99国产精品自在自在app| 国产一区二区三区网| 亚洲一区影院| 一区二区三区国产精品| 精品国产欧美日韩一区二区三区| 日本久久久久久久久| 国产精品久久久久毛片大屁完整版| 国产精品露脸av在线| 99香蕉国产精品偷在线观看 | 国内精品美女在线观看| 久久久av电影| 亚洲黄色在线| 成人h片在线播放免费网站| 麻豆精品一区二区综合av| 久久最新免费视频| 在线免费观看一区| 中文在线三区| 97视频人免费观看| 久九九久频精品短视频| 成人黄色免费在线观看| 久久久久久毛片| 日韩精品免费一区| 欧美一区二区不卡视频| 视频在线不卡免费观看| 自拍偷拍第1页| 国产精品极品尤物在线观看| 91麻豆免费看| 欧美jizz18| 欧美国产日韩在线| 国产午夜精品一区二区| 国产精品高颜值在线观看| 91精品视频专区| 亚洲成人资源网| 精品日韩在线| 九一国产精品视频| 久久精品在线播放| 久久久久国产精品厨房| 日韩欧美一区二区三区免费观看| 精品国偷自产一区二区三区| 日韩视频欧美视频| 中文字幕在线一区| 午夜精品婷婷| 成人18在线| 国产伦精品一区二区三区免| 日韩欧美a级成人黄色| 午夜在线视频一区二区区别 | 日韩欧美国产不卡| 久久国产精品色婷婷| 中文日本在线观看| 日韩精品一区二区三区在线播放 | 国产精品一区专区欧美日韩| 欧美日韩国产影院| 国产在线精品一区二区| 99re8这里有精品热视频免费 | 福利在线视频导航| 日韩激情视频在线| 欧美性感美女一区二区| 亚洲精品不卡| 国产精品欧美日韩一区二区| 欧美日韩国产天堂| 久久午夜羞羞影院免费观看| 亚洲一区色图| 亚洲一区二区三区日本久久九| 欧美黄色激情| 国产在线视频一区| 精品国产污网站| 久久久蜜桃精品| 久久性天堂网| 国产综合婷婷| 57pao国产一区二区| 亚洲综合图区| 桥本有菜亚洲精品av在线| 亚洲日本理论电影| 成人在线看片| 国产精品男人爽免费视频1| 久久久精品在线观看| 欧美一区二区三区影视| 国产人成亚洲第一网站在线播放| 中文精品在线| 亚洲午夜黄色| 亚洲第一福利社区| 亚洲精品在线国产| 久久久久久久久久久久电影| 特级毛片在线| www日韩tube| 在线免费观看黄色av| 美女网站在线| 天堂影视av| 国产精品㊣新片速递bt| 久草电影在线| 福利视频午夜| 1769国内精品视频在线播放| 久久香蕉频线观| 日韩三级成人av网| 日韩在线欧美在线| 久久久久久久久久久91| 亚洲精品乱码久久久久久久久 | 一区二区三区四区亚洲| 久久久精品综合| 国产精品国产三级国产普通话99| 亚洲欧美日韩中文播放| 国产精品对白交换视频| 亚洲国产美女搞黄色| 日本黄色一区二区| 国产精品一区二区视频| 成人精品视频一区二区三区尤物| 99v久久综合狠狠综合久久| 国产网站一区二区| 色婷婷亚洲一区二区三区| 99久久精品国产毛片| 亚洲精品免费在线| 91国内精品野花午夜精品| 色综合久久中文综合久久牛| 在线观看91视频| 精品日韩一区二区三区免费视频| 欧美综合在线视频| 色综合天天综合网天天狠天天| 欧美中文字幕不卡| 久久亚洲精品毛片| 成人黄色免费网站在线观看| 五月天在线免费视频| 中文在线a√在线8| 欧洲一级精品| 国产日韩一区二区三区在线| 国产成人一区二区精品非洲| 91嫩草在线播放| 黄色成人影院| 欧美精选视频在线观看| 一区二区三区四区五区精品视频| 97久久精品人人爽人人爽蜜臀| 亚洲精品日日夜夜| 欧美精品第1页| 欧美专区日韩视频| 欧美日本国产精品| 中文字幕视频免费在线观看| 成人免费网站观看| 正在播放日韩欧美一页| 国产91精品久久久久久久网曝门 | 中文字幕一区二区三区在线乱码| 久久亚洲精品一区二区| 日本成人精品在线| 97超碰国产精品| 在线中文字幕播放| 在线成人欧美| 亚洲欧美偷拍自拍| 国产精品美女久久福利网站| 日韩一级裸体免费视频| 99久久99久久精品|