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

微信:群消息,我們絕對不可能丟!

開發 架構
微信的群消息,是怎么做到不丟的?做過幾十年IM架構,今天和大家聊聊消息的可靠投遞。

前幾天聊了1v1在線消息,離線消息的可達性:

微信:我們絕不丟消息!》

微信:我絕不丟離線消息!

有水友問我說,微信的群消息,是怎么做到不丟的?

做過幾十年IM架構,今天和大家聊聊消息的可靠投遞。

群聊的核心需求,群友在群內發消息,期望:

  • 在線的群友能第一時間收到消息;
  • 離線的群友能在登錄后收到消息;

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

群業務的核心數據結構如何?

群成員表:記錄群里的群成員。

t_group_users(group_id, user_id)

群離線消息表:記錄群里的離線消息。

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

常見的群消息流程如何?

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

首先,是群在線消息。 圖片 典型群消息投遞流程,如1-5所述:

  1. x向server發出群消息;
  2. server去db中查詢群用戶(x,A,B,C,D);
  3. server去cache中查詢群用戶在線狀態;
  4. 在線的用戶A與B,進行實時推送;
  5. 離線的用戶C與D,進行離線存儲;

然后,是群離線消息。 圖片 典型的群離線消息拉取流程,如1-3所述:

  1. C重新登陸的時候,向server拉取群離線消息;
  2. server從db中拉取離線消息并返回群用戶C;
  3. server從db中刪除群用戶C的群離線消息;

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

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

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

群消息表:存儲群中所有的消息。

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

群離線消息表,需要進行優化,只存儲msg_id:

t_offine_msgs(user_id, group_id, msg_id)

這樣優化后,群在線消息發送需要做對應的調整:

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

拉取離線消息,也需要做對應的修改:

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

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

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

很容易想到,必須和1v1消息投遞一樣,需要加入應用層的ACK。

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

應用層ACK優化后,群在線消息發送又做了調整:

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

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

  • 1.先拉取msg_id;
  • 2.再拉取msg_detail;
  • 5.最后應用層ACK;
  • 6.server收到應用層ACK才能刪除離線消息表里的msg_id;

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

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

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

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

群成員表,增加一個屬性,記錄每個群成員最近一條ACK的群消息msg_id(或者time)。 t_group_users(group_id, user_id, last_ack_msg_id)

群消息表,不變,依然存儲群中所有的消息: 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的方式又有兩種方式:

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

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

仍然在客戶端去重,對于重復的msg_id,對用戶不展現,不影響用戶體驗。

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

分頁拉取(按需拉取),都是常見的優化方案。

總結

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

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

知其然,知其所以然。 思路比結論更重要。

責任編輯:趙寧寧 來源: 架構師之路
相關推薦

2025-03-31 10:49:16

2013-12-09 15:50:20

2021-04-20 08:11:33

Css前端@property

2016-11-02 13:12:31

微信離線消息

2025-04-15 09:00:00

2016-10-11 16:31:56

微信服務器消息

2014-07-17 10:38:30

大數據

2016-03-14 14:45:18

中華網

2021-02-21 14:05:02

區塊鏈比特幣安全

2012-04-10 08:58:26

小米

2019-01-02 06:26:02

API應用程序編程接口應用安全

2013-12-13 10:01:16

諾基亞安卓手機

2014-04-16 15:10:10

2023-12-05 07:19:43

CAP定理分布式

2016-09-01 16:37:24

2024-01-24 13:08:00

2023-05-09 08:59:09

ChatGPT程序員裁員

2013-07-02 09:26:11

IntelCEO代工

2018-07-26 08:13:31

根服務器網絡TCP

2012-03-24 21:26:56

點贊
收藏

51CTO技術棧公眾號

自拍偷拍国产精品| 亚洲女同志freevdieo| 国产精品欧美激情在线播放| 一区二区三区精密机械公司| 99视频在线精品国自产拍免费观看| 国产精选在线| 性chinese极品按摩| 成人在线小视频| 亚洲国产高潮在线观看| 亚洲国产精品99久久久久久久久| 成人综合久久| 涩涩视频网站在线观看| 免费的很黄很污的视频网站| 久久久精彩视频| 欧美成人亚洲成人日韩成人| 91激情五月电影| 波多野结衣中文字幕一区二区三区| 成人影院天天5g天天爽无毒影院| av漫画网站在线观看| aaa免费看大片| 亚洲欧美日韩国产成人综合一二三区| 韩国三级日本三级少妇99| 欧美日韩免费观看一区三区| 91亚洲精品久久久蜜桃网站| 欧美视频成人| 亚洲精品a区| 欧美成人hd| 人人澡人一摸人人添| 亚洲美女网站18| 欧美综合第一页| 亚洲精品国精品久久99热 | 国产一级免费在线观看| 男人天堂手机在线视频| 欧美在线free| 猫咪成人在线观看| 成人免费高清观看| www污污在线| 18禁免费观看网站| 国产精品久久一区二区三区| 九九精品视频在线观看| 日韩精品一区二区三区中文精品| 色哟哟免费在线观看| 免费久久久久久| 91在线国产电影| 欧美日韩国产123| 亚洲精品一线二线三线| 婷婷夜色潮精品综合在线| 成人av电影在线观看| 99精品国产99久久久久久福利| 精品av导航| 欧洲成人一区| 91黄色在线| 写真福利理论片在线播放| 青青草原成人网| 日韩欧美一区二区三区四区 | 午夜免费高清视频| 亚洲成人午夜在线| 亚洲free性xxxx护士白浆| 久久久亚洲天堂| 亚洲欧洲日本专区| 欧美一区二区三区男人的天堂| 午夜日韩在线电影| 国产精品私房写真福利视频| 韩国成人精品a∨在线观看| 亚洲精品麻豆| 亚洲精品97| 成人在线国产| 国语一区二区三区| 国产精品久久久久久久久久齐齐| 一区二区三区在线视频看| 日韩一级片网址| 91成人在线免费观看| 亚洲综合色噜噜狠狠| 国产女人18毛片水真多成人如厕| 国产精品一区在线观看你懂的| 性感少妇一区| 欧美片第1页综合| 热久久天天拍国产| 亚洲毛片免费看| 91麻豆精品激情在线观看最新 | 免费看污污网站| 国产午夜福利100集发布| 亚洲一区二区三区精品动漫| 国产精华一区| 亚洲自拍在线观看| 成人日韩在线电影| 国产精品自拍网| 国产精品精品国产| 日韩美女免费线视频| 午夜欧美不卡精品aaaaa| 久热精品在线视频| 超碰日本道色综合久久综合| 亚洲最新av在线| 一区二区三区视频免费| 亚洲乱码av中文一区二区| 亚洲第一网站男人都懂| 欧美成人video| 精品国产91九色蝌蚪| 日韩欧美中文字幕制服| 51精品视频一区二区三区| 欧美日韩中文精品| 欧美高清视频在线高清观看mv色露露十八 | 国产高清不卡| 欧产日产国产精品视频| 精品极品在线| 不卡av影片| 福利精品在线| 精品一区久久久| 国产精品久久久久久久久久久不卡| 日韩av电影在线网| 国产精品午夜国产小视频| 国产精品免费久久久久影院| 国产日韩一区在线| 99精品国产高清在线观看| 国产精品视频免费一区二区三区| 国产激情美女久久久久久吹潮| 国内外成人免费视频| 久久久久久99| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 这里只有精品66| 18黄暴禁片在线观看| www.欧美日本| 亚欧精品一区| 国产精品秘入口| 婷婷在线播放| 国产成人免费| 日本午夜精品| 亚洲成av人片乱码色午夜| 亚洲福利久久| 韩国一区二区视频| 国产婷婷一区二区| 午夜精品福利在线| 日韩一区二区三区免费看| 亚洲女人初尝黑人巨大| 色偷偷av一区二区三区| 午夜精品一区二区三区在线视| 国产精品大片wwwwww| 国产精品美女诱惑| 小说区视频区图片区| 日本精品一区二区三区四区| 国产精品久久久久久精| 成人影院免费观看| 午夜伦理福利在线| 未满十八勿进黄网站一区不卡| 免费萌白酱国产一区二区三区| 亚洲成人免费| 九色综合狠狠综合久久| 国产三级精品三级在线专区| 一区二区三区鲁丝不卡| 色天天综合色天天久久| 亚洲成人黄色网址| 久久久噜噜噜久久中文字免| 亚洲va码欧洲m码| 亚洲三级视频在线观看| 欧美日韩国产页| 亚洲大胆人体在线| 欧美黄色性视频| 亚洲综合色av| 黄网站色视频免费观看| eeuss鲁片一区| 日本在线免费看| 国产69精品久久久久9999人| 国产精品自拍区| 秋霞影院一区二区| 国产精品福利一区| 欧美一区二区三区在线观看视频 | 国产精品推荐精品| 成人看片毛片免费播放器| 欧美日本在线观看| 草裙成人精品一区二区三区| 羞羞答答国产精品www一本| 国产一区二区三区丝袜 | 冲田杏梨av在线| 2023欧美最顶级a∨艳星| 含羞草www国产在线视频| 精品国模一区二区三区| 成人在线免费观看视频| 国模少妇一区二区三区| 一区二区在线观看免费视频播放| 精品国产凹凸成av人导航| 91精品国产免费久久久久久 | 僵尸再翻生在线观看免费国语| 久久婷婷国产| 一区二区三区四区五区精品视频| 成人动漫一区二区| 欧美性xxxx在线播放| 在线观看久久久久久| 国产精品久久久久久久久久| 91麻豆天美传媒在线| 九九精品视频在线| 亚洲欧洲一区二区三区久久| 国产精品三级久久久久久电影| 黑人巨大国产9丨视频| 黄页网站在线观看| 日韩另类视频| 亚洲激情欧美| 亚洲欧美日韩国产手机在线 | 成人一区二区三| sm国产在线调教视频| 神马久久av|