精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

群消息這么復(fù)雜,怎么能做到不丟不重?

開發(fā) 開發(fā)工具
由于“消息風(fēng)暴擴(kuò)散系數(shù)”的存在(概念詳見《QQ狀態(tài)同步究竟是推還是拉?》),群消息的復(fù)雜度要遠(yuǎn)高于單對(duì)單消息。群消息的實(shí)時(shí)性,可達(dá)性,離線消息是今天將要討論的核心話題。

[[175957]]

【需求緣起】

之前的文章更多的聊了單對(duì)單的消息投遞:

微信為什么不丟消息?

http如何像tcp一樣實(shí)時(shí)的收消息?

群聊是多人社交的基本訴求,不管是QQ群,還是微信群,一個(gè)群友在群內(nèi)發(fā)了一條消息:

(1)在線的群友能***時(shí)間收到消息

(2)離線的群友能在登陸后收到消息

由于“消息風(fēng)暴擴(kuò)散系數(shù)”的存在(概念詳見《QQ狀態(tài)同步究竟是推還是拉?》),群消息的復(fù)雜度要遠(yuǎn)高于單對(duì)單消息。群消息的實(shí)時(shí)性,可達(dá)性,離線消息是今天將要討論的核心話題。

【常見的群消息流程】

開始講群消息投遞流程之前,先介紹兩個(gè)群業(yè)務(wù)的核心數(shù)據(jù)結(jié)構(gòu):

群成員表:用來描述一個(gè)群里有多少成員

t_group_users(group_id, user_id)

群離線消息表:用來描述一個(gè)群成員的離線消息

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

業(yè)務(wù)場(chǎng)景舉例:

(1)一個(gè)群中有x,A,B,C,D共5個(gè)成員,成員x發(fā)了一個(gè)消息

(2)成員A與B在線,期望實(shí)時(shí)收到消息

(3)成員C與D離線,期望未來拉取到離線消息

系統(tǒng)架構(gòu)簡(jiǎn)介:

(1)客戶端:x,A,B,C,D共5個(gè)客戶端用戶

(2)服務(wù)端

(2.1)所有模塊與服務(wù)抽象為server

(2.2)所有用戶在線狀態(tài)抽象存儲(chǔ)在高可用cache里

(2.3)所有數(shù)據(jù)信息,例如群成員、群離線消息抽象存儲(chǔ)在db里

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

步驟1:群消息發(fā)送者x向server發(fā)出群消息

步驟2:server去db中查詢?nèi)褐杏卸嗌儆脩?x,A,B,C,D)

步驟3:server去cache中查詢這些用戶的在線狀態(tài)

步驟4:對(duì)于群中在線的用戶A與B,群消息server進(jìn)行實(shí)時(shí)推送

步驟5:對(duì)于群中離線的用戶C與D,群消息server進(jìn)行離線存儲(chǔ)

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

步驟1:離線消息拉取者C向server拉取群離線消息

步驟2:server從db中拉取離線消息并返回群用戶C

步驟3:server從db中刪除群用戶C的群離線消息

存在的問題

上述流程是最容易想,也最容易理解的,存在的問題也最顯而易見:對(duì)于同一份群消息的內(nèi)容,多個(gè)離線用戶存儲(chǔ)了很多份。假設(shè)群中有200個(gè)用戶離線,離線消息則冗余了200份,這極大的增加了數(shù)據(jù)庫(kù)的存儲(chǔ)壓力。

【群消息優(yōu)化1:減少存儲(chǔ)量】

為了減少離線消息的冗余度,增加一個(gè)群消息表,用來存儲(chǔ)所有群消息的內(nèi)容,離線消息表只存儲(chǔ)用戶的群離線消息msg_id,就能大大的降低數(shù)據(jù)庫(kù)的冗余存儲(chǔ)量

群消息表:用來存儲(chǔ)一個(gè)群中所有的消息內(nèi)容

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

群離線消息表:優(yōu)化后只存儲(chǔ)msg_id

t_offine_msgs(user_id, group_id, msg_id)

這樣優(yōu)化后,群在線消息發(fā)送就做了一些修改:

步驟3:每次發(fā)送在線群消息之前,要先存儲(chǔ)群消息的內(nèi)容

步驟6:每次存儲(chǔ)離線消息時(shí),只存儲(chǔ)msg_id,而不用為每個(gè)用戶存儲(chǔ)msg_detail

拉取離線消息時(shí)也做了響應(yīng)的修改:

步驟1:先拉取所有的離線消息msg_id

步驟3:再根據(jù)msg_id拉取msg_detail

步驟5:刪除離線msg_id

存在的問題

如同單對(duì)單消息的發(fā)送一樣:

(1)在線消息的投遞可能出現(xiàn)消息丟失,例如服務(wù)器重啟,路由器丟包,客戶端crash

(2)離線消息的拉取也可能出現(xiàn)消息丟失,原因同上

需要和單對(duì)單消息的可靠投遞一樣,加入應(yīng)用層的ACK,才能保證群消息一定到達(dá)。

【群消息優(yōu)化2:應(yīng)用層ACK】

應(yīng)用層ACK優(yōu)化后,群在線消息發(fā)送又發(fā)生了一些變化:

步驟3:在消息msg_detail存儲(chǔ)到群消息表后,不管用戶是否在線,都先將msg_id存儲(chǔ)到離線消息表里

步驟6:在線的用戶A和B收到群消息后,需要增加一個(gè)應(yīng)用層ACK,來標(biāo)識(shí)消息到達(dá)

步驟7:在線的用戶A和B在應(yīng)用層ACK后,將他們的離線消息msg_id刪除掉

對(duì)應(yīng)到群離線消息的拉取也一樣:

步驟1:先拉取msg_id

步驟3:再拉取msg_detail

步驟5:***應(yīng)用層ACK

步驟6:server收到應(yīng)用層ACK才能刪除離線消息表里的msg_id

存在的問題

(1)如果拉取了消息,卻沒來得及應(yīng)用層ACK,會(huì)收到重復(fù)的消息么?

回答:會(huì),可以在客戶端去重,對(duì)于重復(fù)的msg_id,對(duì)用戶不展現(xiàn),從而不影響用戶體驗(yàn)

(2)對(duì)于離線的每一條消息,雖然只存儲(chǔ)了msg_id,但是每個(gè)用戶的每一條離線消息都將在數(shù)據(jù)庫(kù)中保存一條記錄,有沒有辦法減少離線消息的記錄數(shù)呢?

【群消息優(yōu)化3:離線消息表】

離線消息表的優(yōu)化

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

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

t_group_users(group_id, user_id, last_ack_msg_id(last_ack_msg_time))

群消息表:用來存儲(chǔ)一個(gè)群中所有的消息內(nèi)容,不變

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

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

離線消息表優(yōu)化后,群在線消息的投遞流程:

步驟3:在消息msg_detail存儲(chǔ)到群消息表后,不再需要操作離線消息表(優(yōu)化前需要將msg_id插入離線消息表)

步驟7:在線的用戶A和B在應(yīng)用層ACK后,將last_ack_msg_id更新即可(優(yōu)化前需要將msg_id從離線消息表刪除)

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

步驟1:拉取離線消息

步驟3:ACK離線消息

步驟4:更新last_ack_msg_id

存在的問題

由于“消息風(fēng)暴擴(kuò)散系數(shù)”的存在,假設(shè)1個(gè)群有500個(gè)用戶,“每條”群消息都會(huì)變?yōu)?00個(gè)應(yīng)用層ACK,將對(duì)服務(wù)器造成巨大的沖擊,有沒有辦法減少ACK請(qǐng)求量呢?

【群消息優(yōu)化4:批量ACK】

由于“消息風(fēng)暴擴(kuò)散系數(shù)”的存在,如果每條群消息都ACK,會(huì)給服務(wù)器造成巨大的沖擊,為了減少ACK請(qǐng)求量,很容易想到的方法是批量ACK。

批量ACK的方式又有兩種:

(1)每收到N條群消息ACK一次,這樣請(qǐng)求量就降低為原來的1/N了

(2)每隔時(shí)間間隔T進(jìn)行一次群消息ACK,也能達(dá)到類似的效果

新的問題

批量ACK有可能導(dǎo)致:還沒有來得及ACK群消息,用戶就退出了,這樣下次登錄會(huì)拉取到重復(fù)的離線消息

解決方案

msg_id去重,不對(duì)用戶展現(xiàn),保證良好的用戶體驗(yàn)

還可能存在的問題

群離線消息過多:拉取過慢

解決方案:分頁(yè)拉取(按需拉取),分頁(yè)拉取的細(xì)節(jié)在“微信為啥不丟離線消息”一章中有詳細(xì)敘述,此處不再展開(詳見《微信為啥不丟“離線消息”?》)。

【總結(jié)】

群消息還是非常有意思的,可達(dá)性、實(shí)時(shí)性、離線消息、消息風(fēng)暴擴(kuò)散等等等等,做個(gè)總結(jié):

(1)不管是群在線消息,還是群離線消息,應(yīng)用層的ACK是可達(dá)性的保障

(2)群消息只存一份,不用為每個(gè)用戶存儲(chǔ)離線群msg_id,只需存儲(chǔ)一個(gè)最近ack的群消息id/time

(3)為了減少消息風(fēng)暴,可以批量ACK

(4)如果收到重復(fù)消息,需要msg_id去重,讓用戶無感知

(5)離線消息過多,可以分頁(yè)拉取(按需拉取)優(yōu)化

文章轉(zhuǎn)載自微信公眾號(hào)“架構(gòu)師之路”

責(zé)任編輯:趙寧寧 來源: 架構(gòu)師之路
相關(guān)推薦

2025-06-12 09:46:15

2025-04-17 09:00:00

架構(gòu)聊消息微信

2016-11-02 13:12:31

微信離線消息

2016-10-11 16:31:56

微信服務(wù)器消息

2021-03-08 10:19:59

MQ消息磁盤

2024-01-16 08:24:59

消息隊(duì)列KafkaRocketMQ

2025-07-02 09:15:06

2020-10-26 09:19:11

線程池消息

2015-12-11 10:27:50

易維幫助臺(tái)/Helpd

2015-11-17 09:41:38

私有云自動(dòng)化應(yīng)用部署

2024-06-18 08:26:22

2025-03-31 10:49:16

2017-02-27 18:20:30

Amazon持續(xù)交付

2011-05-25 20:48:23

seo

2019-08-21 07:44:32

離線消息拉取開發(fā)

2020-03-31 09:53:08

互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)

2020-02-24 13:06:55

Python數(shù)據(jù)幀開發(fā)

2016-12-27 19:26:43

2018-01-05 10:47:59

前端JavascriptWeb
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲国产精品人久久电影| 亚洲福利视频一区| 91在线视频九色| 国产精品99无码一区二区| 亚洲a级精品| 欧美日韩二区三区| 男的插女的下面视频| 韩日视频在线| 国产乱一区二区| 日韩av快播网址| 日本老熟俱乐部h0930| 美女网站一区| 欧美v国产在线一区二区三区| 国产l精品国产亚洲区久久| 免费黄色在线| 久久久国产精品午夜一区ai换脸| 亚洲xxxx视频| 亚洲 小说区 图片区| 一区精品久久| 久久精品国亚洲| 中文字幕一区二区三区人妻不卡| 麻豆精品一区| 欧美日韩国产一区| 国产综合av在线| 麻豆av在线免费观看| 欧美国产精品久久| 久久综合给合久久狠狠色| 国产99久久九九精品无码免费| 肉色丝袜一区二区| 4k岛国日韩精品**专区| 久久综合亚洲色hezyo国产| 日韩免费一区| 国产一区二区三区高清在线观看| 国产女人18毛片水真多18| 996久久国产精品线观看| 色综合久久久久综合| 激情小视频网站| 91在线中文| ...xxx性欧美| 一区二区三区四区五区视频| 欧美老女人性开放| 91丨九色丨蝌蚪丨老版| 国产高清在线精品一区二区三区| 国产免费一区二区三区免费视频| 蜜桃免费网站一区二区三区| 清纯唯美日韩制服另类| 探花视频在线观看| 亚洲免费网址| 日韩av高清不卡| 永久免费无码av网站在线观看| 亚洲一区二区动漫| 久久人人爽人人爽人人片av高请 | 成人性生交xxxxx网站| 亚洲精品久久久久久久蜜桃| 先锋影音久久久| 欧美综合国产精品久久丁香| 免费观看成人毛片| 国产精品久久久久久久久久妞妞 | 亚洲精品久久久一区二区三区| 性活交片大全免费看| 91精品尤物| 亚洲国产成人精品女人久久久| avtt中文字幕| 成人性生交大片免费看96| 精品国产91亚洲一区二区三区婷婷| 丰满人妻一区二区三区53视频| 精品一区二区三区在线观看视频| 欧美一区二区三区免费视频| xxxx国产视频| 欧美电影在线观看完整版| 日韩成人性视频| 性高潮久久久久久久| 成人高清av| 久久久久999| 国产一级视频在线观看| 亚洲尤物在线| 国产精品一区二区久久| 99久久精品免费看国产交换| 波多野结衣中文一区| 欧美日韩成人一区二区三区 | 国产精品久久久久影院亚瑟| 欧美 另类 交| a级片免费在线观看| 欧美日韩中文字幕| 色一情一区二区三区| 亚洲91网站| 亚洲欧美国产一区二区三区| 少妇太紧太爽又黄又硬又爽小说| 欧美久久九九| 国产91色在线播放| 国产xxxxxx| 久久众筹精品私拍模特| 在线观看成人av电影| 丁香高清在线观看完整电影视频| 91国模大尺度私拍在线视频| 91香蕉国产线在线观看| 网红女主播少妇精品视频| 自拍偷拍亚洲在线| 精品少妇爆乳无码av无码专区| 视频一区视频二区中文字幕| 91在线短视频| 韩国福利在线| 亚欧色一区w666天堂| 爱情岛论坛vip永久入口| 91精品入口| www.午夜精品| 一区二区三区在线观看av| 极品少妇xxxx精品少妇偷拍 | 日韩精品午夜| 国内偷自视频区视频综合| 中文字幕久久网| 99久久精品国产精品久久| 亚洲小说欧美另类激情| 巨茎人妖videos另类| 欧美成人女星排行榜| 精品一区二区三区蜜桃在线| 亚洲激情婷婷| 亚洲一区二区三区777| 国产高清美女一级毛片久久| 亚洲不卡av一区二区三区| 日韩一区二区三区久久| 中文字幕av一区二区三区人| 久久人91精品久久久久久不卡| 国产精品国产av| 国产日本一区二区| 国模无码视频一区二区三区| 日韩视频1区| 综合久久五月天| 探花国产精品一区二区| 久久中文娱乐网| av网站在线观看不卡| 99亚洲乱人伦aⅴ精品| 伦理中文字幕亚洲| 一级片在线观看视频| 国产日韩欧美激情| 日韩视频第二页| 精品影片在线观看的网站| 97视频在线观看免费| 好吊色视频一区二区| 一区二区三区中文字幕在线观看| 女同激情久久av久久| 999成人精品视频线3| 国产精品中文字幕在线观看| 电影av一区| 在线一区二区三区四区五区 | 加勒比av中文字幕| 日韩欧美精品| 国产日韩欧美夫妻视频在线观看| 国产三级电影在线| 欧美日韩在线播放三区| 91成人精品一区二区| 日韩高清在线不卡| 亚洲mv在线看| 国产激情一区| 欧美高清在线观看| 污污视频在线免费看| 天天色综合成人网| 37p粉嫩大胆色噜噜噜| 久久精品官网| 亚洲欧美日韩精品在线| 四虎永久精品在线| 麻豆国产精品va在线观看不卡 | 亚洲奶大毛多的老太婆| 亚洲熟妇无码乱子av电影| 久久久精品国产免费观看同学| 91淫黄看大片| 亚洲天堂一区二区三区四区| 成人h在线播放| 成年男女免费视频网站不卡| 日韩精品中文字幕久久臀| 日韩精品在线免费视频| 国产清纯美女被跳蛋高潮一区二区久久w | gratisvideos另类灌满| 亚洲欧美精品一区二区| 中文字幕乱伦视频| 亚洲综合一区二区三区| 亚洲第一页av| 久久99久久99精品免视看婷婷| 今天免费高清在线观看国语| 久久久久97| 国产激情999| 中文字幕有码在线观看| 日韩激情在线视频| 国产精品高潮呻吟av| 亚洲自拍欧美精品| 2019男人天堂| 成人一区二区在线观看| 国产精品亚洲二区在线观看| 99视频精品全部免费在线视频| 国产欧美日韩伦理| 精品国产黄a∨片高清在线| 欧美激情高清视频| 福利视频在线看| 精品久久久久一区二区国产| 无码人妻久久一区二区三区 | 久久久久久无码精品大片| 亚洲人成伊人成综合网小说| 噜噜噜在线视频| 激情成人综合网| 国产亚洲天堂网| 国产精品av一区二区| 视频一区二区在线观看| 九九热hot精品视频在线播放| 国产精品香蕉av| 17videosex性欧美| 精品国偷自产在线视频| 黄网在线观看| 精品国产免费人成电影在线观看四季 | 欧美一区二区在线观看| 天天爽夜夜爽人人爽| 一级精品视频在线观看宜春院| 日本爱爱爱视频| 91丝袜国产在线播放| 美女伦理水蜜桃4| 久久99国产精品尤物| 欧美牲交a欧美牲交aⅴ免费下载| 黑人一区二区| 一区二区三区日韩视频| 欧美日韩国产免费观看视频| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 神马午夜在线观看| 宅男噜噜噜66一区二区66| 一级黄色av片| 一本一本久久a久久精品综合麻豆| 久久黄色小视频| 亚洲色图19p| 午夜精品久久久久99蜜桃最新版| 久久久99精品免费观看不卡| 中文字幕一区二区人妻电影丶| 国产乱码精品一区二区三区五月婷| 我看黄色一级片| 日韩电影免费在线| 99色精品视频| 视频在线观看一区| 成人一区二区三| 日韩经典中文字幕一区| 99久久激情视频| 久久av一区二区三区| 久久婷婷五月综合色国产香蕉| aa级大片欧美三级| 久久久久免费看黄a片app| 亚洲黄色精品| 国产精品一线二线三线| 在线日本高清免费不卡| 欧美日韩不卡在线视频| 亚洲精一区二区三区| 霍思燕三级露全乳照| 一区三区视频| 欧美一区二区三区爽大粗免费| 亚洲美女少妇无套啪啪呻吟| 精品少妇一区二区三区在线| 亚洲在线观看| 亚洲三级视频网站| 麻豆精品一区二区| √天堂资源在线| 国产成人高清在线| 黄色av网址在线观看| 91蜜桃传媒精品久久久一区二区| 三级黄色片网站| 国产日韩欧美一区二区三区乱码| 超碰人人干人人| 亚洲视频在线一区观看| 久草国产在线观看| 精品二区三区线观看| 少妇高潮av久久久久久| 欧美日韩一卡二卡| a毛片在线免费观看| 欧美videos大乳护士334| 色一情一乱一乱一区91av| 亚洲欧美日韩精品久久| 日本精品一区二区三区在线播放| 久久在线观看视频| 国产精品高颜值在线观看| 国产99视频精品免视看7| 亚洲91在线| 国产精品免费一区二区三区四区 | 香蕉精品视频在线| 国产精品jizz在线观看美国| 黄色动漫网站入口| 麻豆高清免费国产一区| 韩国黄色一级片| 久久久影视传媒| av激情在线观看| 粉嫩av一区二区三区免费野| 一道本在线视频| 亚洲国产91色在线| 在线观看的av| 97av在线视频免费播放| 欧美成人毛片| 精品不卡一区二区三区| 久久久久久久久久久久久久久久久久 | 都市激情综合| 92福利视频午夜1000合集在线观看 | 麻豆久久精品| 一级黄色免费毛片| 久久久久国产精品免费免费搜索| 中文字幕av播放| 色88888久久久久久影院野外| 国产福利资源在线| 在线电影欧美日韩一区二区私密| 福利写真视频网站在线| 国产在线观看精品一区二区三区| 久久亚州av| 91视频 - 88av| 青青草91视频| 国产特黄级aaaaa片免| 亚洲午夜久久久久久久久久久| 日韩xxx视频| 亚洲精品影视在线观看| 国产极品人妖在线观看| 国产免费观看久久黄| 亚洲综合小说图片| 精品丰满人妻无套内射| 国产自产v一区二区三区c| 女人黄色一级片| 色婷婷综合中文久久一本| 成人午夜免费在线观看| 裸体女人亚洲精品一区| 久久er热在这里只有精品66| 久久久久网址| 在线观看视频免费一区二区三区| 免费黄频在线观看| 成人欧美一区二区三区1314| 91青青草视频| 亚洲精品自产拍| 欧美日韩在线观看首页| 不卡视频一区二区三区| 亚洲女同另类| 中文字幕色网站| 亚洲欧洲国产日本综合| 中文字幕码精品视频网站| 亚洲视频在线视频| 中文字幕在线高清| 久久国产精品久久精品国产| 亚洲激情欧美| v天堂中文在线| 精品国产乱码久久久久酒店| 韩国av永久免费| 欧美亚洲第一页| 一呦二呦三呦国产精品| 99久久激情视频| 欧美国产精品久久| 国产又粗又长视频| 精品国产欧美成人夜夜嗨| 日韩精品一页| 三级在线免费观看| 成人精品视频一区| 亚洲黄色一区二区| 国产丝袜精品第一页| 日韩av中字| 亚洲国产精品视频一区| 麻豆国产欧美一区二区三区| 亚洲欧美精品久久| 欧美一卡二卡三卡| 97在线超碰| 免费在线一区二区| 日本va欧美va瓶| 午夜国产福利一区二区| 337p日本欧洲亚洲大胆色噜噜| 蜜桃视频动漫在线播放| 日本在线视频不卡| 激情文学综合丁香| 国产亚洲自拍av| 亚洲人午夜精品| 香蕉成人在线| www.射射射| 国产欧美一区在线| 999免费视频| 91高清视频免费| 日韩国产一区| 久久久久国产免费| 日韩欧美中文第一页| 午夜免费视频在线国产| 亚洲一区二区三区成人在线视频精品 | 亚洲涩涩av| 尤物网站在线看| 黄网站色欧美视频| 欧美三级黄网| 国产精品一区免费观看| 石原莉奈在线亚洲三区| 草视频在线观看| 亚洲日韩欧美视频| 久久久久亚洲精品中文字幕| 欧美 日本 亚洲| 中文字幕一区二区三区在线观看| 高h调教冰块play男男双性文| 日本久久91av| 欧美日韩一视频区二区| www国产视频| 91麻豆精品国产综合久久久久久| cao在线视频| 亚洲日本理论电影| 91丨九色porny丨蝌蚪| 国产理论视频在线观看| 欧美中文字幕在线视频| 中文字幕人成人乱码| 黄免费在线观看| 亚洲成人a级网| 国产精品一区三区在线观看| 成人黄色片视频|