成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

simon_chen / 3347人閱讀

摘要:比如消息小明喜歡了文章則文章指明所屬類型是文章小明當(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},        // 主鍵
content     : {type: "text"},    // 消息的內(nèi)容
type        : {type: "integer", required: true, enum: [1, 2, 3]},  // 消息的類型,1: 公告 Announce,2: 提醒 Remind,3:信息 Message
target      : {type: "integer"},    // 目標(biāo)的ID
targetType  : {type: "string"},    // 目標(biāo)的類型
action      : {type: "string"},    // 提醒信息的動(dòng)作類型
sender      : {type: "integer"},    // 發(fā)送者的ID
createdAt    : {type: "datetime", required: true}

Save Remind
消息表,我們需要target、targetType字段,來記錄該條提醒所關(guān)聯(lián)的對(duì)象。而action字段,則記錄該條提醒所關(guān)聯(lián)的動(dòng)作。
比如消息:「小明喜歡了文章」
則:

target = 123,  // 文章ID
targetType = "post",  // 指明target所屬類型是文章
sender = 123456  // 小明ID

Save Announce and Message
當(dāng)然,Notify還支持存儲(chǔ)公告和信息。它們會(huì)用到content字段,而不會(huì)用到target、targetType、action字段。

UserNotify
id            : {type: "integer", primaryKey: true},        // 主鍵
isRead      : {type: "boolean", required: true},   
user        : {type: "integer", required: true},  // 用戶消息所屬者
notify      : {type: "integer", required: true}   // 關(guān)聯(lián)的Notify
createdAt    : {type: "datetime", required: true}

我們用UserNotify來存儲(chǔ)用戶的消息隊(duì)列,它關(guān)聯(lián)一則提醒(Notify)的具體內(nèi)容。
UserNotify的創(chuàng)建,主要通過兩個(gè)途徑:

遍歷訂閱(Subscription)表拉取公告(Announce)和提醒(Remind)的時(shí)候創(chuàng)建

新建信息(Message)之后,立刻創(chuàng)建。

Subscription
target      : {type: "integer", required: true},    // 目標(biāo)的ID
targetType  : {type: "string", required: true},    // 目標(biāo)的類型
action      : {type: "string"},   // 訂閱動(dòng)作,如: comment/like/post/update etc.
user        : {type: "integer"},
createdAt    : {type: "datetime", required: true}

訂閱,是從Notify表拉取消息到UserNotify的前提,用戶首先訂閱了某一個(gè)目標(biāo)的某一個(gè)動(dòng)作,在此之后產(chǎn)生這個(gè)目標(biāo)的這個(gè)動(dòng)作的消息,才會(huì)被通知到該用戶。
如:「小明關(guān)注了產(chǎn)品A的評(píng)論」,數(shù)據(jù)表現(xiàn)為:

target: 123,  // 產(chǎn)品A的ID
targetType: "product",
action: "comment",
user: 123  // 小明的ID

這樣,產(chǎn)品A下產(chǎn)生的每一條評(píng)論,都會(huì)產(chǎn)生通知給小明了。

SubscriptionConfig
action: {type: "json", required: true},   // 用戶的設(shè)置
user: {type: "integer"}

不同用戶可能會(huì)有不一樣的訂閱習(xí)慣,在這個(gè)表中,用戶可以統(tǒng)一針對(duì)某種動(dòng)作進(jìn)行是否訂閱的設(shè)置。而默認(rèn)是使用系統(tǒng)提供的默認(rèn)配置:

defaultSubscriptionConfig: {
  "comment"   : true,    // 評(píng)論
  "like"      : true,    // 喜歡
}

在這套模型中,targetType、action是可以根據(jù)需求來擴(kuò)展的,例如我們還可以增加多幾個(gè)動(dòng)作的提醒:hate被踩、update被更新....諸如此類。

配置文件 NotifyConfig
// 提醒關(guān)聯(lián)的目標(biāo)類型
targetType: {
  PRODUCT : "product",    // 產(chǎn)品
  POST    : "post"    // 文章
},

// 提醒關(guān)聯(lián)的動(dòng)作
action: {
  COMMENT   : "comment",  // 評(píng)論
  LIKE      : "like",     // 喜歡
},

// 訂閱原因?qū)?yīng)訂閱事件
reasonAction: {
  "create_product"  : ["comment", "like"]
  "like_product"    : ["comment"],
  "like_post"       : ["comment"],
},

// 默認(rèn)訂閱配置
defaultSubscriptionConfig: {
  "comment"   : true,    // 評(píng)論
  "like"      : true,    // 喜歡
}
服務(wù)層 NotifyService NotifyService擁有以下方法:

createAnnounce(content, sender)

createRemind(target, targetType, action, sender, content)

createMessage(content, sender, receiver)

pullAnnounce(user)

pullRemind(user)

subscribe(user, target, targetType, reason)

cancelSubscription(user, target ,targetType)

getSubscriptionConfig(userID)

updateSubscriptionConfig(userID)

getUserNotify(userID)

read(user, notifyIDs)

各方法的處理邏輯如下:

createAnnounce(content, sender)

往Notify表中插入一條公告記錄

createRemind(target, targetType, action, sender, content)

往Notify表中插入一條提醒記錄

createMessage(content, sender, receiver)

往Notify表中插入一條信息記錄

往UserNotify表中插入一條記錄,并關(guān)聯(lián)新建的Notify

pullAnnounce(user)

從UserNotify中獲取最近的一條公告信息的創(chuàng)建時(shí)間: lastTime

lastTime作為過濾條件,查詢Notify的公告信息

新建UserNotify并關(guān)聯(lián)查詢出來的公告信息

pullRemind(user)

查詢用戶的訂閱表,得到用戶的一系列訂閱記錄

通過每一條的訂閱記錄的targettargetType、action、createdAt去查詢Notify表,獲取訂閱的Notify記錄。(注意訂閱時(shí)間必須早于提醒創(chuàng)建時(shí)間)

查詢用戶的配置文件SubscriptionConfig,如果沒有則使用默認(rèn)的配置DefaultSubscriptionConfig

使用訂閱配置,過濾查詢出來的Notify

使用過濾好的Notify作為關(guān)聯(lián)新建UserNotify

subscribe(user, target, targetType, reason)

通過reason,查詢NotifyConfig,獲取對(duì)應(yīng)的動(dòng)作組:actions

遍歷動(dòng)作組,每一個(gè)動(dòng)作新建一則Subscription記錄

cancelSubscription(user, target ,targetType)

刪除user、target、targetType對(duì)應(yīng)的一則或多則記錄

getSubscriptionConfig(userID)

查詢SubscriptionConfig表,獲取用戶的訂閱配置

updateSubscriptionConfig(userID)

更新用戶的SubscriptionConfig記錄

getUserNotify(userID)

獲取用戶的消息列表

read(user, notifyIDs)

更新指定的notify,把isRead屬性設(shè)置為true

時(shí)序圖 提醒的訂閱、創(chuàng)建、拉取

我們可以在產(chǎn)品創(chuàng)建之后,調(diào)用NotifyService.subscribe方法,
然后在產(chǎn)品被評(píng)論之后調(diào)用NotifyService.createRemind方法,
再就是用戶登錄系統(tǒng)或者其他的某一個(gè)時(shí)刻調(diào)用NotifyService.pullRemind方法,
最后在用戶查詢消息隊(duì)列的時(shí)候調(diào)用NotifyService.getUserNotify方法。

公告的創(chuàng)建、拉取

在管理員發(fā)送了一則公告的時(shí)候,調(diào)用NotifyService.createAnnounce方法,
然后在用戶登錄系統(tǒng)或者其他的某一個(gè)時(shí)刻調(diào)用NotifyService.pullAnnounce方法,
最后在用戶查詢消息隊(duì)列的時(shí)候調(diào)用NotifyService.getUserNotify方法。

信息的創(chuàng)建


信息的創(chuàng)建,只需要直接調(diào)用NotifyService.createMessage方法就可以了,
在下一次用戶查詢消息隊(duì)列的時(shí)候,就會(huì)查詢這條信息。

如果本文對(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/78924.html

相關(guān)文章

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

    摘要:原文鏈接消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)上篇由于文章篇幅較長,而作者精力有限,不希望這么早就精盡人亡,故分成上下篇來寫消息系統(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)作 原文鏈接:Bluesun | 消息系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)「上篇」 由于文章篇幅較長,而作者精力有限,不希望這么早就精盡人亡,故分成上下篇來寫消息系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。上篇主要講...

    v1 評(píng)論0 收藏0
  • 從零到一,擼一個(gè)在線斗地主(下篇)

    摘要:原文從零到一,擼一個(gè)在線斗地主下篇作者上篇回顧我們說了斗地主游戲的渲染展示部分,最后也講了下中交互的情況,下篇的重點(diǎn)就是游戲邏輯。 原文:從零到一,擼一個(gè)在線斗地主(下篇) | AlloyTeam作者:TAT.vorshen 上篇回顧:我們說了斗地主游戲的渲染展示部分,最后也講了下canvas中交互的情況,下篇的重點(diǎn)就是游戲邏輯。 邏輯主要分成兩塊:流程邏輯和撲克牌對(duì)比邏輯。 gith...

    CloudDeveloper 評(píng)論0 收藏0
  • 淺談架構(gòu)是為了什么 (上)

    摘要:前言架構(gòu)是一款軟件從到的演變過程。并非是上來就可以承載什么億級(jí)訪問的牛架構(gòu)什么的。這是軟性架構(gòu),考慮擴(kuò)展性。實(shí)際程序員與架構(gòu)師不分家。設(shè)計(jì)架構(gòu)設(shè)計(jì)覆蓋一款應(yīng)用運(yùn)行的各個(gè)方面。架構(gòu)并不是一個(gè)多么神秘的職業(yè)。雖然敵不過大廠的架構(gòu)。 showImg(https://segmentfault.com/img/bVbf3Tg?w=1080&h=708); 前言 架構(gòu)是一款軟件從0到100的演變過...

    寵來也 評(píng)論0 收藏0
  • 淺談架構(gòu)是為了什么 (上)

    摘要:前言架構(gòu)是一款軟件從到的演變過程。并非是上來就可以承載什么億級(jí)訪問的牛架構(gòu)什么的。這是軟性架構(gòu),考慮擴(kuò)展性。實(shí)際程序員與架構(gòu)師不分家。設(shè)計(jì)架構(gòu)設(shè)計(jì)覆蓋一款應(yīng)用運(yùn)行的各個(gè)方面。架構(gòu)并不是一個(gè)多么神秘的職業(yè)。雖然敵不過大廠的架構(gòu)。 showImg(https://segmentfault.com/img/bVbf3Tg?w=1080&h=708); 前言 架構(gòu)是一款軟件從0到100的演變過...

    channg 評(píng)論0 收藏0
  • 淺談架構(gòu)是為了什么 (上)

    摘要:前言架構(gòu)是一款軟件從到的演變過程。并非是上來就可以承載什么億級(jí)訪問的牛架構(gòu)什么的。這是軟性架構(gòu),考慮擴(kuò)展性。實(shí)際程序員與架構(gòu)師不分家。設(shè)計(jì)架構(gòu)設(shè)計(jì)覆蓋一款應(yīng)用運(yùn)行的各個(gè)方面。架構(gòu)并不是一個(gè)多么神秘的職業(yè)。雖然敵不過大廠的架構(gòu)。 showImg(https://segmentfault.com/img/bVbf3Tg?w=1080&h=708); 前言 架構(gòu)是一款軟件從0到100的演變過...

    nifhlheimr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<