單聊群聊氏豌,系統(tǒng)通知,狀態(tài)同步热凹,到底是推還是拉泵喘?

系統(tǒng)通知

廣義系統(tǒng)通知,有1對(duì)1的通知般妙,以及一對(duì)多的通知纪铺,有相對(duì)實(shí)時(shí)的業(yè)務(wù)通知,以及能夠容忍一定延時(shí)的系統(tǒng)通知碟渺。

系統(tǒng)對(duì)1的通知

典型業(yè)務(wù)鲜锚,計(jì)數(shù)類通知:
  • 有10個(gè)美女添加了你為好友
  • 有8個(gè)好友私信了你
需要實(shí)時(shí)
  • 登錄時(shí)拉取,增量推送
  • 一旦有消息丟失苫拍,網(wǎng)頁端的計(jì)數(shù)會(huì)一直不一致
不需要實(shí)時(shí)
  • 只有在鏈接跳轉(zhuǎn)芜繁,或者刷新網(wǎng)頁時(shí),才重新拉取最新的通知

系統(tǒng)對(duì)多的通知

彈窗新聞
需求
  • 同一天绒极,用戶登錄彈出的新聞是相同的(很多業(yè)務(wù)符合這樣的場景)骏令,不同天新聞則不一樣(但所有用戶都一樣)
  • 每天第一次登錄彈出新聞,當(dāng)天的后續(xù)登錄不出新聞
數(shù)據(jù)結(jié)構(gòu)
  • 彈窗新聞表
    t_msg(msg_id, date, msg_content)
  • 用戶信息表
    t_user(user_id, user_info, …)
  • 用戶收到的新聞彈窗
    t_user_msg(user_id, msg_id, date)
推送
  • 將t_user_msg里對(duì)于所有user_id推送插入一個(gè)msg_id垄提,表示未讀
  • 在user每天第一次登錄的時(shí)候榔袋,將當(dāng)天的msg_id拉取出來周拐,并刪除,表示已讀
  • 在user每天非第一次登錄的時(shí)候凰兑,就拉取不到msg_id于是不會(huì)再次彈窗
拉取
  • 在user每天第一次登陸時(shí)妥粟,將當(dāng)天的msg_id拉取出來,并插入t_user_msg吏够,表示已讀
  • 在user每天非第一次登陸時(shí)勾给,則會(huì)插入t_user_msg失敗,則說明已讀
優(yōu)化
  • 在t_user表加一列稿饰,表示用戶最近拉取的彈窗時(shí)間
  • 在user每天第一次登錄時(shí)锦秒,將當(dāng)天的msg_id拉取出來露泊,并將last_msg_date修改為今天
  • 在user每天非第一次登錄時(shí)喉镰,發(fā)現(xiàn)last_msg_date為今天,則說明今天已讀
彈窗廣告
需求

-每天會(huì)對(duì)一批在線用戶推送相同的彈窗廣告

解決方案
  • for循環(huán)批量推送
  • keepalive請(qǐng)求拉取
  • 避免雪崩

狀態(tài)同步

可簡化為在線和離線兩種狀態(tài)

獲取好友狀態(tài)

uid-A登錄

先去數(shù)據(jù)庫拉取自己的好友列表惭笑,再去緩存獲取所有好友的狀態(tài)


登錄拉取狀態(tài)
好友狀態(tài)改變時(shí)如何同步
拉取

向服務(wù)器輪詢拉取全部好友的狀態(tài)侣姆,例如每1分鐘一次

  • 時(shí)延
  • 低效
推送

uid-B狀態(tài)改變時(shí)(由登錄、登出等動(dòng)作觸發(fā))沉噩,服務(wù)端不僅要在緩存中修改uid-B的狀態(tài)捺宗,還要將這個(gè)狀體改變的通知推送給uid-B的在線好友


狀態(tài)推送
  • 優(yōu)勢:實(shí)時(shí)
  • 缺點(diǎn):當(dāng)在線好友量很大時(shí),任何一個(gè)用戶狀態(tài)的改變川蒙,會(huì)擴(kuò)散成N個(gè)實(shí)時(shí)通知蚜厉,這個(gè)N叫做“消息風(fēng)暴擴(kuò)散系數(shù)”。假設(shè)一個(gè)IM系統(tǒng)平均每個(gè)用戶有200個(gè)好友畜眨,平均有20%的好友在線昼牛,那么消息風(fēng)暴擴(kuò)散系數(shù)N=40,這意味著康聂,任何一個(gè)狀態(tài)的變化會(huì)變成40個(gè)推送請(qǐng)求贰健。
群友狀態(tài)改變時(shí)如何同步

假設(shè)平均每個(gè)用戶加了20個(gè)群,平均每個(gè)群有200個(gè)用戶恬汁,依然假設(shè)20%的用戶在線伶椿,那么為了保證群友狀態(tài)的實(shí)時(shí)性,每個(gè)用戶登錄氓侧,就要將自己的狀態(tài)改變通知發(fā)送給2020020%=800個(gè)群友脊另,N=800,意味著约巷,任何一個(gè)狀態(tài)的變化會(huì)變成800個(gè)推送請(qǐng)求偎痛。

  • 按需拉取,延時(shí)拉仍赝ァ:在真正進(jìn)入一個(gè)群時(shí)才實(shí)時(shí)拉取群友的在線狀態(tài)
總結(jié)
  • 好友狀態(tài)同步看彼,是采用推送的方式同步
  • 群友狀態(tài)同步廊佩,由于消息風(fēng)暴擴(kuò)散系數(shù)過大,一般采用拉取的方式同步
  • 群友狀態(tài)同步靖榕,還能采用按需拉取的優(yōu)化方式标锄,進(jìn)一步降低服務(wù)端壓力
  • “消息風(fēng)暴擴(kuò)散系數(shù)”是指一個(gè)消息發(fā)出時(shí)御吞,變成N個(gè)消息的擴(kuò)散系數(shù)竖幔,這個(gè)系數(shù)一定程度上決定了技術(shù)采用推送還是拉取
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涡匀,隨后出現(xiàn)的幾起案子星压,更是在濱河造成了極大的恐慌践剂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娜膘,死亡現(xiàn)場離奇詭異逊脯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)竣贪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門军洼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人演怎,你說我怎么就攤上這事匕争。” “怎么了爷耀?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵甘桑,是天一觀的道長。 經(jīng)常有香客問我歹叮,道長跑杭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任盗胀,我火速辦了婚禮艘蹋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘票灰。我一直安慰自己女阀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布屑迂。 她就那樣靜靜地躺著浸策,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惹盼。 梳的紋絲不亂的頭發(fā)上庸汗,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音手报,去河邊找鬼蚯舱。 笑死改化,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枉昏。 我是一名探鬼主播陈肛,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼兄裂!你這毒婦竟也來了句旱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤晰奖,失蹤者是張志新(化名)和其女友劉穎谈撒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匾南,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啃匿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了午衰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片立宜。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冒萄,死狀恐怖臊岸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尊流,我是刑警寧澤帅戒,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站崖技,受9級(jí)特大地震影響逻住,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迎献,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一瞎访、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吁恍,春花似錦扒秸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翼闽,卻和暖如春拾徙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背感局。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工尼啡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暂衡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓崖瞭,卻偏偏與公主長得像古徒,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子读恃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354