消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)「上篇」

由于文章篇幅較長(zhǎng)趁俊,而作者精力有限脚作,不希望這么早就精盡人亡警没,故分成上下篇來(lái)寫消息系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)匈辱。上篇主要講的是一些概念,搞清楚我們要做的這個(gè)消息系統(tǒng)的主要內(nèi)容杀迹。而下篇主要講具體的實(shí)現(xiàn)亡脸,會(huì)包括架構(gòu)設(shè)計(jì),數(shù)據(jù)庫(kù)設(shè)計(jì),業(yè)務(wù)流程詳細(xì)的實(shí)現(xiàn)等浅碾。

整個(gè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)大州,并非我一人之力就可以完成的。這其中是同事們大家一起討論與商討的結(jié)果垂谢,而我只是把它細(xì)化厦画,呈現(xiàn)出來(lái)。

我只是一個(gè)會(huì)思考的idea搬運(yùn)工滥朱。

產(chǎn)品分析

首先我們來(lái)看一下市場(chǎng)上關(guān)于消息的實(shí)現(xiàn)是怎么樣的根暑。

簡(jiǎn)書

簡(jiǎn)書的消息系統(tǒng)主要分了兩種

  • 簡(jiǎn)信
  • 提醒

簡(jiǎn)信
簡(jiǎn)信的性質(zhì)其實(shí)跟私信是一樣的,是用戶發(fā)送給用戶的一則消息徙邻,有具體的信息內(nèi)容排嫌。

簡(jiǎn)書簡(jiǎn)信

提醒
而提醒,則是系統(tǒng)發(fā)送的一則消息鹃栽,其文案格式是固定的窘茁,并且對(duì)特殊對(duì)象一般擁有超鏈接瘫寝。

簡(jiǎn)書提醒

知乎

知乎跟簡(jiǎn)書一樣,主要分了兩種:

  • 私信
  • 消息

私信
跟簡(jiǎn)書一樣霹琼,使用戶發(fā)送給用戶的一則消息蓬抄,也可以是管理員發(fā)送給用戶的消息丰嘉。

知乎私信

消息
知乎的消息比簡(jiǎn)書的提醒有過(guò)之而無(wú)不及,知乎會(huì)對(duì)多條相似的消息進(jìn)行聚會(huì)嚷缭,以達(dá)到減輕用戶閱讀壓力的體驗(yàn)饮亏。

知乎消息

消息的三種分類

通過(guò)兩種產(chǎn)品的簡(jiǎn)單分析,得出他們的消息有兩種分類阅爽,在這基礎(chǔ)上路幸,我們?cè)偌由弦环N:公告。
公告的主要性質(zhì)是系統(tǒng)發(fā)送一則含有具體內(nèi)容的消息付翁,站內(nèi)所有用戶都能讀取到這條消息简肴。
所以,消息有三種分類:

  1. 公告 Announce
  2. 提醒 Remind
  3. 私信 Message

提醒的語(yǔ)言分析

我們從簡(jiǎn)書取一組提醒樣本:

  • 3dbe1bd90774 關(guān)注了你
  • magicdawn 喜歡了你的文章 《單點(diǎn)登錄的三種實(shí)現(xiàn)方式》
  • 無(wú)良程序 喜歡了你的文章 《基于RESTful API 怎么設(shè)計(jì)用戶權(quán)限控制百侧?》
  • alexcc4 喜歡了你的文章 《在Nodejs中貫徹單元測(cè)試》
  • 你在《基于RESTful API 怎么設(shè)計(jì)用戶權(quán)限控制砰识?》中收到一條 cnlinjie 的評(píng)論
  • 你的文章《Session原理》已被加入專題 《ios開發(fā)》

分析句子結(jié)構(gòu),提醒的內(nèi)容無(wú)非就是

「誰(shuí)對(duì)一樣屬于誰(shuí)的事物做了什么操作」
「someone do something in someone's something」

someone = 提醒的觸發(fā)者佣渴,或者發(fā)送者辫狼,標(biāo)記為sender
do something = 提醒的動(dòng)作,評(píng)論辛润、喜歡膨处、關(guān)注都屬于一個(gè)動(dòng)作,標(biāo)記為action
something = 提醒的動(dòng)作作用對(duì)象,這就具體到是哪一篇文章真椿,標(biāo)記為target
someone's = 提醒的動(dòng)作作用對(duì)象的所有者鹃答,標(biāo)記為targetOwner

這就清楚了,sender和targetOwner就是網(wǎng)站的用戶瀑粥,而target是具體到哪一篇文章挣跋,如果提醒的對(duì)象不僅僅局限于文章,還有其他的話狞换,就需要增加一項(xiàng)targetType避咆,來(lái)標(biāo)記目標(biāo)是文章還是其他的什么。而action修噪,則是固定的查库,整個(gè)網(wǎng)站會(huì)觸發(fā)提醒的動(dòng)作可能就只有那幾樣:評(píng)論、喜歡黄琼、關(guān)注.....(或者其他業(yè)務(wù)需要提醒的動(dòng)作)

消息的兩種獲取方式

  • 推 Push
  • 拉 Pull

以知乎為例
推的比較常見樊销,需要針對(duì)某一個(gè)問(wèn)題維護(hù)著一張關(guān)注者的列表,每當(dāng)觸發(fā)這個(gè)問(wèn)題推送的條件時(shí)(例如有人回答問(wèn)題)脏款,就把這個(gè)通知發(fā)送給每個(gè)關(guān)注者围苫。

拉的相對(duì)麻煩一點(diǎn),就是推的反向撤师,例如每個(gè)用戶都有一張關(guān)注問(wèn)題的列表剂府,每當(dāng)用戶上線的時(shí)候,對(duì)每個(gè)問(wèn)題進(jìn)行輪詢剃盾,當(dāng)問(wèn)題的事件列表出現(xiàn)了比我原本時(shí)間戳大的信息就進(jìn)行拉取腺占。

而我們則根據(jù)消息的不同分類采用不同的獲取方式
通告和提醒,適合使用拉取的方式痒谴,消息產(chǎn)生之后衰伯,會(huì)存在消息表中,用戶在某一特定的時(shí)間根據(jù)自己關(guān)注問(wèn)題的表進(jìn)行消息的拉取积蔚,然后添加到自己的消息隊(duì)列中意鲸,

信息,適合使用推的方式库倘,在發(fā)送者建立一條信息之后临扮,同時(shí)指定接收者,把消息添加到接收者的消息隊(duì)列中教翩。

訂閱

根據(jù)提醒使用拉取的方式杆勇,需要維護(hù)一個(gè)關(guān)注某一事物的列表。
這種行為饱亿,我們稱之為:**「訂閱」Subscribe **

一則訂閱有以下三個(gè)核心屬性

  • 訂閱的目標(biāo) target
  • 訂閱的目標(biāo)類型 targetType
  • 訂閱的動(dòng)作 action

比如我發(fā)布了一篇文章蚜退,那么我會(huì)訂閱文章《XXX》的評(píng)論動(dòng)作闰靴,所以文章《XXX》每被人評(píng)論了,就需要發(fā)送一則提醒告知我钻注。

訂閱的規(guī)則還可以擴(kuò)展
我喜歡了一篇文章蚂且,和我發(fā)布了一篇文章,訂閱的動(dòng)作可能不一樣幅恋。
喜歡了一篇文章杏死,我希望我訂閱這篇文章更新、評(píng)論的動(dòng)作捆交。
而發(fā)布了一篇文章淑翼,我希望我只是訂閱這篇文章的評(píng)論動(dòng)作。

這時(shí)候就需要多一個(gè)參數(shù):subscribReason
不同的subscribReason品追,對(duì)應(yīng)著一個(gè)動(dòng)作數(shù)組玄括,
subscribReason = 喜歡,對(duì)應(yīng)著 actions = [更新肉瓦,評(píng)論]
subscribReason = 發(fā)布遭京,對(duì)應(yīng)著 actions = [評(píng)論]

訂閱的規(guī)則還還可以擴(kuò)展
用戶可能會(huì)有一個(gè)自己的訂閱設(shè)置,比如對(duì)于所有的喜歡的動(dòng)作泞莉,我都不希望接收哪雕。
比如Knewone的提醒設(shè)置

Knewone提醒設(shè)置

所以我們需要再維護(hù)一個(gè)表:SubscriptionConfig,來(lái)存放用戶的提醒設(shè)置鲫趁。
并且热监,當(dāng)用戶沒(méi)有提醒設(shè)置的時(shí)候,可以使用系統(tǒng)提供的一套默認(rèn)設(shè)置:defaultSubscriptionConfig

聚合

如果我發(fā)布了一篇文章《XXX》饮寞,在我不在線的時(shí)候,被評(píng)論了10遍列吼,當(dāng)我一上線的時(shí)候幽崩,應(yīng)該是收到十條信息類似于:「誰(shuí)誰(shuí)誰(shuí)評(píng)論了你的文章《XXX》」?
還是應(yīng)該收到一條信息:「甲、乙寞钥、丙慌申、丁...評(píng)論了你的文章《XXX》」?

知乎在聚合上做的很優(yōu)秀,要知道他們要實(shí)現(xiàn)這個(gè)還是挺有技術(shù)的:
知乎的消息機(jī)制理郑,在技術(shù)上如何設(shè)計(jì)與規(guī)劃蹄溉?
網(wǎng)站的消息(通知)系統(tǒng)一般是如何實(shí)現(xiàn)的?

關(guān)于這部分功能您炉,我們還沒(méi)有具體的實(shí)現(xiàn)方法柒爵,暫時(shí)也無(wú)法講得更加詳細(xì)∽簦⊙﹏⊙

五個(gè)實(shí)體

通過(guò)上面的分析棉胀,大概知道做這個(gè)消息系統(tǒng)法瑟,需要哪些實(shí)體類:

  1. 用戶消息隊(duì)列 UserNotify
  2. 用戶 User
  3. 訂閱 Subscription
  4. 訂閱設(shè)置 SubscriptionConfig
  5. 消息 Notify
    • 通告 Announce
    • 提醒 Remind
    • 信息 Message

行為分解

說(shuō)了這么多,整理一下整個(gè)消息流程的一些行為:

  • 系統(tǒng)或者管理員唁奢,創(chuàng)建消息
    • createNotify (make announce | remind | message)
  • 用戶霎挟,訂閱消息,取消訂閱
    • subscribe, cancelSubscription
  • 用戶管理訂閱設(shè)置
    • getSubscriptionConfig, updateSubscriptionConfig
  • 用戶麻掸,拉取消息
    • pullNotify (pull announce | remind | message | all)
  • 用戶酥夭,查詢消息隊(duì)列
    • getUserNotify(get announce | remind | message | all)
  • 用戶閱讀消息
    • read

在本文的「下篇」我們來(lái)探討一下:模型怎么做、數(shù)據(jù)庫(kù)怎么設(shè)計(jì)脊奋、代碼結(jié)構(gòu)怎么來(lái)熬北、一些邏輯上的時(shí)序圖應(yīng)該是怎么樣的。

-------- 更新于 2015/11/15 ----------

關(guān)聯(lián)文章:消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)「下篇」


如果本文對(duì)您有用
請(qǐng)不要吝嗇你們的Follow與Start
這會(huì)大大支持我們繼續(xù)創(chuàng)作

「Github」
MZMonster :@MZMonster
JC_Huang :@JerryC8080

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狂魔,一起剝皮案震驚了整個(gè)濱河市蒜埋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌最楷,老刑警劉巖整份,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異籽孙,居然都是意外死亡烈评,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門犯建,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)讲冠,“玉大人,你說(shuō)我怎么就攤上這事适瓦「涂” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵玻熙,是天一觀的道長(zhǎng)否彩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嗦随,這世上最難降的妖魔是什么列荔? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮枚尼,結(jié)果婚禮上贴浙,老公的妹妹穿的比我還像新娘。我一直安慰自己署恍,他們只是感情好崎溃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锭汛,像睡著了一般笨奠。 火紅的嫁衣襯著肌膚如雪袭蝗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天般婆,我揣著相機(jī)與錄音到腥,去河邊找鬼。 笑死蔚袍,一個(gè)胖子當(dāng)著我的面吹牛乡范,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啤咽,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼晋辆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宇整?” 一聲冷哼從身側(cè)響起瓶佳,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鳞青,沒(méi)想到半個(gè)月后霸饲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臂拓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年厚脉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胶惰。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡傻工,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孵滞,到底是詐尸還是另有隱情中捆,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布坊饶,位于F島的核電站轨香,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏幼东。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一科雳、第九天 我趴在偏房一處隱蔽的房頂上張望根蟹。 院中可真熱鬧,春花似錦糟秘、人聲如沸简逮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)散庶。三九已至蕉堰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悲龟,已是汗流浹背屋讶。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留须教,地道東北人皿渗。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像轻腺,于是被迫代替她去往敵國(guó)和親乐疆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 關(guān)聯(lián)文章:消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)「上篇」 模型設(shè)計(jì) Notify Save Remind消息表贬养,我們需要target挤土、...
    JC_Huang閱讀 26,200評(píng)論 52 196
  • 背景 在一個(gè)系統(tǒng)中,資源误算,數(shù)據(jù)會(huì)持續(xù)不斷的更新仰美。而用戶如果需要知道這些數(shù)據(jù)的更新,就需要一個(gè)系統(tǒng)尉桩,將系統(tǒng)中不斷更新...
    goaheadhj閱讀 4,700評(píng)論 1 14
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理筒占,服務(wù)發(fā)現(xiàn),斷路器蜘犁,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,674評(píng)論 0 15
  • 看過(guò)很多產(chǎn)品設(shè)計(jì)的文章翰苫,很少有對(duì)消息系統(tǒng)這個(gè)模塊的設(shè)計(jì)講得比較清晰的,最近搜集了一些資料这橙,結(jié)合實(shí)際例子梳理了消息系...
    jason_peng閱讀 2,755評(píng)論 3 46