摘要:原文鏈接消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)上篇由于文章篇幅較長(zhǎng),而作者精力有限,不希望這么早就精盡人亡,故分成上下篇來(lái)寫(xiě)消息系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。更新于關(guān)聯(lián)文章消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)下篇如果本文對(duì)您有用請(qǐng)不要吝嗇你們的與這會(huì)大大支持我們繼續(xù)創(chuàng)作
產(chǎn)品分析原文鏈接:Bluesun | 消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)「上篇」
由于文章篇幅較長(zhǎng),而作者精力有限,不希望這么早就精盡人亡,故分成上下篇來(lái)寫(xiě)消息系統(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)工。
首先我們來(lái)看一下市場(chǎng)上關(guān)于消息的實(shí)現(xiàn)是怎么樣的。
簡(jiǎn)書(shū)簡(jiǎn)書(shū)的消息系統(tǒng)主要分了兩種
簡(jiǎn)信
提醒
簡(jiǎn)信
簡(jiǎn)信的性質(zhì)其實(shí)跟私信是一樣的,是用戶(hù)發(fā)送給用戶(hù)的一則消息,有具體的信息內(nèi)容。
提醒
而提醒,則是系統(tǒng)發(fā)送的一則消息,其文案格式是固定的,并且對(duì)特殊對(duì)象一般擁有超鏈接。
知乎跟簡(jiǎn)書(shū)一樣,主要分了兩種:
私信
消息
私信
跟簡(jiǎn)書(shū)一樣,使用戶(hù)發(fā)送給用戶(hù)的一則消息,也可以是管理員發(fā)送給用戶(hù)的消息。
消息
知乎的消息比簡(jiǎn)書(shū)的提醒有過(guò)之而無(wú)不及,知乎會(huì)對(duì)多條相似的消息進(jìn)行聚會(huì),以達(dá)到減輕用戶(hù)閱讀壓力的體驗(yàn)。
通過(guò)兩種產(chǎn)品的簡(jiǎn)單分析,得出他們的消息有兩種分類(lèi),在這基礎(chǔ)上,我們?cè)偌由弦环N:公告。
公告的主要性質(zhì)是系統(tǒng)發(fā)送一則含有具體內(nèi)容的消息,站內(nèi)所有用戶(hù)都能讀取到這條消息。
所以,消息有三種分類(lèi):
公告 Announce
提醒 Remind
私信 Message
提醒的語(yǔ)言分析我們從簡(jiǎn)書(shū)取一組提醒樣本:
3dbe1bd90774 關(guān)注了你
magicdawn 喜歡了你的文章 《單點(diǎn)登錄的三種實(shí)現(xiàn)方式》
無(wú)良程序 喜歡了你的文章 《基于RESTful API 怎么設(shè)計(jì)用戶(hù)權(quán)限控制?》
alexcc4 喜歡了你的文章 《在Nodejs中貫徹單元測(cè)試》
你在《基于RESTful API 怎么設(shè)計(jì)用戶(hù)權(quán)限控制?》中收到一條 cnlinjie 的評(píng)論
你的文章《Session原理》已被加入專(zhuān)題 《ios開(kāi)發(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)站的用戶(hù),而target是具體到哪一篇文章,如果提醒的對(duì)象不僅僅局限于文章,還有其他的話(huà),就需要增加一項(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
以知乎為例
推的比較常見(jiàn),需要針對(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è)用戶(hù)都有一張關(guān)注問(wèn)題的列表,每當(dāng)用戶(hù)上線(xiàn)的時(shí)候,對(duì)每個(gè)問(wèn)題進(jìn)行輪詢(xún),當(dāng)問(wèn)題的事件列表出現(xiàn)了比我原本時(shí)間戳大的信息就進(jìn)行拉取。
而我們則根據(jù)消息的不同分類(lèi)采用不同的獲取方式:
通告和提醒,適合使用拉取的方式,消息產(chǎn)生之后,會(huì)存在消息表中,用戶(hù)在某一特定的時(shí)間根據(jù)自己關(guān)注問(wèn)題的表進(jìn)行消息的拉取,然后添加到自己的消息隊(duì)列中,
信息,適合使用推的方式,在發(fā)送者建立一條信息之后,同時(shí)指定接收者,把消息添加到接收者的消息隊(duì)列中。
訂閱根據(jù)提醒使用拉取的方式,需要維護(hù)一個(gè)關(guān)注某一事物的列表。
這種行為,我們稱(chēng)之為:「訂閱」Subscribe
一則訂閱有以下三個(gè)核心屬性:
訂閱的目標(biāo) target
訂閱的目標(biāo)類(lèi)型 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ò)展
用戶(hù)可能會(huì)有一個(gè)自己的訂閱設(shè)置,比如對(duì)于所有的喜歡的動(dòng)作,我都不希望接收。
比如Knewone的提醒設(shè)置
所以我們需要再維護(hù)一個(gè)表:SubscriptionConfig,來(lái)存放用戶(hù)的提醒設(shè)置。
并且,當(dāng)用戶(hù)沒(méi)有提醒設(shè)置的時(shí)候,可以使用系統(tǒng)提供的一套默認(rèn)設(shè)置:defaultSubscriptionConfig
如果我發(fā)布了一篇文章《XXX》,在我不在線(xiàn)的時(shí)候,被評(píng)論了10遍,當(dāng)我一上線(xiàn)的時(shí)候,應(yīng)該是收到十條信息類(lèi)似于:「誰(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ì)?!雪n⊙
五個(gè)實(shí)體通過(guò)上面的分析,大概知道做這個(gè)消息系統(tǒng),需要哪些實(shí)體類(lèi):
用戶(hù)消息隊(duì)列 UserNotify
用戶(hù) User
訂閱 Subscription
訂閱設(shè)置 SubscriptionConfig
消息 Notify
通告 Announce
提醒 Remind
信息 Message
行為分解說(shuō)了這么多,整理一下整個(gè)消息流程的一些行為:
系統(tǒng)或者管理員,創(chuàng)建消息
createNotify (make announce | remind | message)
用戶(hù),訂閱消息,取消訂閱
subscribe, cancelSubscription
用戶(hù)管理訂閱設(shè)置
getSubscriptionConfig, updateSubscriptionConfig
用戶(hù),拉取消息
pullNotify (pull announce | remind | message | all)
用戶(hù),查詢(xún)消息隊(duì)列
getUserNotify(get announce | remind | message | all)
用戶(hù)閱讀消息
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)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78925.html
摘要:修改記錄版本的通知欄消息功能上并未發(fā)生變化,右上角的縮減為了。增加了,允許可穿戴設(shè)備遠(yuǎn)程控制通知欄消息。鎖屏狀態(tài)下,可以控制通知欄消息的隱私程度。但是谷歌規(guī)定,自定義布局展示的通知欄消息最大高度是。具體適配不正常的機(jī)型有。 此文已由作者黎星授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪(fǎng)問(wèn)網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)。 由于歷史原因,Android在發(fā)布之初對(duì)通知欄Notification的設(shè)...
摘要:無(wú)證連接進(jìn)行異常記錄并關(guān)閉連接。離線(xiàn)消息檢測(cè)到上線(xiàn)立即推送這是消息推送需要實(shí)現(xiàn)的基本功能之一了,詳見(jiàn)代碼。主要功能協(xié)助進(jìn)行初始化,心跳包檢測(cè),斷線(xiàn)自動(dòng)重連消息推送的第二種方式在下篇中再編寫(xiě) 消息重發(fā)中需要注意的問(wèn)題 由于最近工作中接觸了比較多關(guān)閉消息推送以及異常重發(fā)機(jī)制的問(wèn)題,終于得空總結(jié)一下經(jīng)驗(yàn) 目前接觸的消息推送分為兩種 主動(dòng)推送:一般為websocket建立長(zhǎng)連接實(shí)現(xiàn),此處網(wǎng)上...
摘要:比如消息小明喜歡了文章則文章指明所屬類(lèi)型是文章小明當(dāng)然,還支持存儲(chǔ)公告和信息。如小明關(guān)注了產(chǎn)品的評(píng)論,數(shù)據(jù)表現(xiàn)為產(chǎn)品的小明的這樣,產(chǎn)品下產(chǎn)生的每一條評(píng)論,都會(huì)產(chǎn)生通知給小明了。 原文鏈接:BlueSun | 消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)「上篇」 模型設(shè)計(jì) Notify id : {type: integer, primaryKey: true}, // 主鍵 ...
摘要:淺談秒殺系統(tǒng)架構(gòu)設(shè)計(jì)后端掘金秒殺是電子商務(wù)網(wǎng)站常見(jiàn)的一種營(yíng)銷(xiāo)手段。這兩個(gè)項(xiàng)目白話(huà)網(wǎng)站架構(gòu)演進(jìn)后端掘金這是白話(huà)系列的文章。 淺談秒殺系統(tǒng)架構(gòu)設(shè)計(jì) - 后端 - 掘金秒殺是電子商務(wù)網(wǎng)站常見(jiàn)的一種營(yíng)銷(xiāo)手段。 不要整個(gè)系統(tǒng)宕機(jī)。 即使系統(tǒng)故障,也不要將錯(cuò)誤數(shù)據(jù)展示出來(lái)。 盡量保持公平公正。 實(shí)現(xiàn)效果 秒殺開(kāi)始前,搶購(gòu)按鈕為活動(dòng)未開(kāi)始。 秒殺開(kāi)始時(shí),搶購(gòu)按鈕可以點(diǎn)擊下單。 秒殺結(jié)束后,按鈕按鈕變...
摘要:它就是史上最簡(jiǎn)單的教程第三篇服務(wù)消費(fèi)者后端掘金上一篇文章,講述了通過(guò)去消費(fèi)服務(wù),這篇文章主要講述通過(guò)去消費(fèi)服務(wù)。概覽和架構(gòu)設(shè)計(jì)掘金技術(shù)征文后端掘金是基于的一整套實(shí)現(xiàn)微服務(wù)的框架。 Spring Boot 配置文件 – 在坑中實(shí)踐 - 后端 - 掘金作者:泥瓦匠鏈接:Spring Boot 配置文件 – 在坑中實(shí)踐版權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明出處本文提綱一、自動(dòng)配置二、自定義屬性三、ran...
閱讀 1059·2021-11-22 15:33
閱讀 3373·2021-11-08 13:20
閱讀 1388·2021-09-22 10:55
閱讀 2058·2019-08-29 11:08
閱讀 780·2019-08-26 12:24
閱讀 3077·2019-08-23 17:15
閱讀 2239·2019-08-23 16:12
閱讀 1944·2019-08-23 16:09