成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

群消息,究竟存一份還是多份?

開發 架構
昨天的文章發布后,有朋友反問:你憑什么默認群消息只存儲了一份?今天來聊聊這個問題。

昨天《群消息已讀回執,為什么這么難?》,有朋友反問:你憑什么默認群消息只存儲了一份?今天來聊聊這個問題。

群消息,究竟存一份還是多份?

任何技術方案,都不是天才般靈感乍現想到的,一定是一個演進迭代,逐步優化的過程。

群信息,用戶信息,群成員關系都是基礎數據:

group_info(gid, group_info);
user_info(uid, user_info);
group_members(gid, uid);

假設一個群(gid)里有4個成員,其中:

  • 三個在線(A, uid1, uid2);
  • 一個不在線(uid3);

A發送了一條消息,很容易想到,對于不同的群友消息存多份,每個群友一個隊列來存儲。但由于在線的用戶會實時的收到消息,所以暫定只為離線的用戶存儲。

用戶收到的群消息,也是基礎數據:

user_msgs(uid,msgid,gid,sender_uid,time,content);

很容易想到,整個群消息的發送流程如上圖1-4:

  • 發送消息;
  • 查詢狀態;
  • 不在線的存儲離線;
  • 在線的實時推送;

“在線的群友不存儲,離線的群友才存儲”會帶來的問題是,如果第四步發生異常,群友會丟失消息。

消息的可達性是聊天系統中最重要的要素(沒有之一),故這個方案是不行的,需要優化為“不管是否在線,都要先存儲”。

發送群消息的流程優化為,如上圖1-4:

  • 發送消息;
  • 所有人都存一份;
  • 查詢狀態;
  • 在線的實時推送;

先將消息落地,能夠保證消息可達性,那何時才能刪除已經落地的群消息呢?

對于在線的群友,收到群消息后,給個ack確認,才能刪除。

畫外音:邏輯刪除,還是物理刪除,根據業務是否有消息漫游決定。

對于離線的群友,在下次登陸后,拉取完離線消息,再給ack確認,才能刪除。

總之,為了保證消息的可達性,不管是在線消息,還是離線消息,必須接收方給ack確認,才能刪除消息。

“不管是否在線,都冗余一份群消息”帶來的問題是,同一條消息存儲了很多次,對磁盤和帶寬造成了很大的浪費。很容易想到的優化是:群消息實體存儲一份,用戶只冗余消息ID。

故基礎數據可以由:

user_msgs(uid,msgid,gid,sender_uid,time,content);

優化為:

group_msgs(msgid,gid,sender_uid,time,content);
user_msgs(uid, msgid, gid);

這個優化,對于消息投遞,以及消息刪除的核心流程沒有影響,幾個實踐為:

  • 在線用戶投遞消息實體,ack消息ID;
  • 離線用戶先拉取消息ID,再拉取消息實體,再ack消息ID;

如此這般,假如在某個群友A期間,群里陸續發送了N條消息,則user_msgs(uid, msgid, gid)里,會有 uidA -> mid1,mid2, mid3, … midN 等N條離線記錄,拉取離線消息時,可以把這N條消息一次性拉取出來,然后再刪除:

delete from user_msgs 
    where msgid in($mid1,$mid2…, $midN) and gid=$gid

然而,群消息具備“偏序”特性,上面的一次性刪除完全可以優化為:

delete from user_msgs 
    where msgid >= $mid1 and gid=$gid

這就意味著,每個用戶只需要記錄“最近一次收到的消息ID”,而不用記錄“所有未收到的消息ID集合”,每當收在線消息ack,以及拉離線消息ack時,只需要更新這個“最近一次收到的消息ID”即可。

于是乎,基礎數據可以由:

group_members(gid, uid);
group_msgs(msgid,gid,sender_uid,time,content);
user_msgs(uid, msgid, gid);

優化為:

group_members(gid, uid, last_ack_msgid);
group_msgs(msgid,gid,sender_uid,time,content);
user_msgs(uid, msgid, gid); // 不再需要

即,群消息只存儲一份,群友無需冗余任何消息實體,或者消息ID了。

對于在線的群友,收到群消息后,修改這個last_ack_msgid。

對于離線的群友,拉取群消息后,也修改這個last_ack_msgid。

畫外音:這里的討論,僅限于接收方收到了哪些消息,和發送方的已讀回執沒有關系。

總結

任何架構方案都不是靈光一現,而是逐步迭代優化產生的。

  • 最開始:存多份,只存在線,消息容易丟;
  • 進化:存多份,所有群友都存儲,消息冗余多;
  • 進化:存多份,只存ID,未利用偏序;
  • 最終:存一份,只存last_ack_msgid;

任何脫離業務的架構設計都是耍流氓。

知其然,知其所以然。

思路比結論更重要。

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

2021-01-12 07:44:13

群消息在線

2021-06-24 08:30:08

架構億級消息中心數據

2019-03-24 14:14:40

代碼閱讀源代碼

2021-04-03 12:44:16

編程語言數據Python

2022-04-29 08:48:25

開源

2018-03-09 10:28:30

生態報告簽收

2020-07-15 15:38:15

人臉識別照片活化手機

2019-03-15 15:15:12

硬盤SSD閃存

2009-03-11 13:32:12

簡歷求職應聘

2015-03-19 15:17:11

2018-07-29 15:33:04

2016-08-24 16:55:18

DevOps結構清單

2023-09-29 22:41:26

Kubernetes云原生

2019-12-03 10:28:53

編程語言PythonJava

2018-05-03 07:06:21

開發規范iOS

2024-11-07 08:50:56

用戶分析分類維度標簽

2023-09-01 14:02:25

用戶分析攻略

2017-05-05 11:25:43

2013-03-04 17:51:59

華為CIE職業生涯

2024-10-24 20:56:36

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区在线免费观看 | 男人的天堂在线视频 | 成人亚洲性情网站www在线观看 | 91久久精品一区二区二区 | 一本色道久久综合亚洲精品高清 | 色嗨嗨| 欧美成人自拍视频 | 国产福利小视频 | 成人午夜网| 91精品久久久久久久久 | 日韩精品免费在线观看 | 中文字幕日韩欧美 | 久久精品网 | 久久久亚洲一区 | 亚洲精品成人av久久 | 亚洲免费一区二区 | 国产精品a久久久久 | 欧美精品国产精品 | 五月激情综合网 | 99精品视频网 | 日韩 欧美 综合 | 国产成人高清 | 精品欧美一区二区精品久久久 | av官网在线| 中文字幕一区二区视频 | 精品国产欧美一区二区三区成人 | 在线观看亚洲精品视频 | 色婷婷精品国产一区二区三区 | 国产精品久久久久免费 | 午夜在线 | 久久久精品久久 | 中文字幕 在线观看 | 亚洲一区二区三区四区五区午夜 | 日韩电影免费在线观看中文字幕 | www.男人天堂.com | 国产精品毛片av | 亚洲欧美日韩精品久久亚洲区 | www久久久| 波多野结衣二区 | 99精品视频免费在线观看 | www.操.com |