QQ好友狀態(tài),QQ群友狀態(tài),究竟是推還是拉?架構(gòu)師之路關(guān)注共 1891字,需瀏覽 4分鐘 ·2020-12-22 12:35 狀態(tài)同步,有好友狀態(tài)的同步,有群友狀態(tài)的同步,有的需要實(shí)時同步,有的能夠容忍延時。任何脫離業(yè)務(wù)的架構(gòu)設(shè)計都是耍流氓,不同場景下,狀態(tài)同步,究竟是推送還是拉取呢?用戶的在線狀態(tài),分為客戶端狀態(tài)(端),服務(wù)端狀態(tài)(云)兩種形態(tài)。?什么是服務(wù)端狀態(tài)?服務(wù)端狀態(tài),主要分為在線online和離線offline,不同的狀態(tài),對于不同的業(yè)務(wù)處理流程可能不同。例如對于消息的處理:(1)服務(wù)端狀態(tài)在線,直接投遞給用戶;(2)服務(wù)端狀態(tài)離線,直接存儲離線消息,等用戶下一次登錄拉取;?如何實(shí)時更新服務(wù)端狀態(tài)?用戶uid-A登錄時,會修改用戶的服務(wù)端狀態(tài)為在線。用戶uid-A登出時,會修改用戶的服務(wù)端狀態(tài)為離線。經(jīng)常的,服務(wù)端會將用戶的服務(wù)端狀態(tài)存儲在高可用的緩存集群里。?什么是客戶端狀態(tài)?不同的產(chǎn)品,會有不同的客戶端狀態(tài),例如隱身、離線、忙碌、勿擾等,這些狀態(tài)大多是產(chǎn)品功能需求。畫外音:微信,在設(shè)計之初,就摒棄了用戶端狀態(tài)這個概念。后文為了方便描述,不妨設(shè)待討論的是QQ這種擁有客戶端狀態(tài)的產(chǎn)品,并假設(shè)客戶端狀態(tài)也只有在線和離線兩種狀態(tài),后文統(tǒng)一稱為“用戶狀態(tài)”。?如何獲取好友的狀態(tài)?uid-A登錄時,先去數(shù)據(jù)庫拉取自己的好友列表,再去緩存獲取所有好友的狀態(tài)。用戶uid-A的好友uid-B狀態(tài)改變時(由登錄、登出等動作觸發(fā)),uid-A如何同步這一事件?這里就有推拉的設(shè)計折衷了。情況一:如果對于狀態(tài)變更實(shí)時性要求不高,可以采用拉取。uid-A向服務(wù)器輪詢拉取uid-B(其實(shí)是自己的全部好友)的狀態(tài),例如每1分鐘一次,其缺點(diǎn)是:(1)如果uid-B的狀態(tài)改變,uid-A獲取不實(shí)時,可能有1分鐘時延;(2)如果uid-B的狀態(tài)不改變,uid-A會有大量無效的輪詢請求,非常低效;?情況二:如果對于狀態(tài)變更實(shí)時性要求較高,則必須推送。uid-B狀態(tài)改變時(由登錄、登出等動作觸發(fā)),服務(wù)端不僅要在緩存中修改uid-B的狀態(tài),還要將這個狀體改變的通知推送給uid-B的在線好友。推送的優(yōu)勢是:實(shí)時。缺點(diǎn)是:當(dāng)在線好友量很大時,任何一個用戶狀態(tài)的改變,會擴(kuò)散成N個實(shí)時通知,這個N叫做“消息風(fēng)暴擴(kuò)散系數(shù)”。假設(shè)一個IM系統(tǒng)平均每個用戶有200個好友,平均有20%的好友在線,那么消息風(fēng)暴擴(kuò)散系數(shù)N=40,這意味著,任何一個狀態(tài)的變化會變成40個推送請求。?群友狀態(tài)的一致性,和好友狀態(tài)的一致性相比,復(fù)雜在哪里?可不可以采用實(shí)時推送?群這個業(yè)務(wù)場景大伙也非常之熟悉,你能夠加入若干群(例如20個),假設(shè)平均每個群有200人,即你會有4000個群友。?理論上群友狀態(tài)也可以通過實(shí)時推送的方式實(shí)現(xiàn),以保證實(shí)時性。進(jìn)一步討論之前,先一起估算下這個業(yè)務(wù)場景下的“消息風(fēng)暴擴(kuò)散系數(shù)”。?假設(shè)平均每個用戶加了20個群,平均每個群有200個用戶,依然假設(shè)20%的用戶在線,那么為了保證群友狀態(tài)的實(shí)時性,每個用戶登錄,就要將自己的狀態(tài)改變通知發(fā)送給20*200*20%=800個群友,N=800,意味著,任何一個狀態(tài)的變化會變成800個推送請求。如果說好友狀態(tài)實(shí)時推送,消息風(fēng)暴擴(kuò)散系數(shù)N=40尚可以接受,那么群友狀態(tài)實(shí)時推送,N=800則是災(zāi)難性的。此類業(yè)務(wù)往往采用輪詢拉取的方式,獲得群友的狀態(tài)。?輪詢拉取群友狀態(tài)也會給服務(wù)器帶來過大的壓力,還有什么優(yōu)化方式?群友的數(shù)據(jù)量太大,雖然每個用戶平均加入了20個群,但實(shí)際上并不會每次登錄都進(jìn)入每一個群。不采用輪詢拉取,而采用按需拉取,延時拉取的方式,在真正進(jìn)入一個群時才實(shí)時拉取群友的在線狀態(tài),是既能滿足用戶需求(用戶感覺是狀態(tài)是實(shí)時、一致的,但其實(shí)是進(jìn)入群才拉取的),又能降低服務(wù)器壓力。這是一種常見方法。?總結(jié)狀態(tài)的實(shí)時性與一致性是一個較難解決的技術(shù)問題,不同的業(yè)務(wù)實(shí)現(xiàn)方式不同,一般來說:(1)好友狀態(tài)同步,是采用推送的方式同步;(2)群友狀態(tài)同步,由于消息風(fēng)暴擴(kuò)散系數(shù)過大,一般采用拉取的方式同步;(3)群友狀態(tài)同步,還能采用按需拉取的優(yōu)化方式,進(jìn)一步降低服務(wù)端壓力;(4)“消息風(fēng)暴擴(kuò)散系數(shù)”是指一個消息發(fā)出時,變成N個消息的擴(kuò)散系數(shù),這個系數(shù)一定程度上決定了技術(shù)采用推送還是拉取;畫外音:群消息的推送,也存在“消息風(fēng)暴擴(kuò)散系數(shù)”的問題。架構(gòu)師之路-分享技術(shù)思路知道為什么,一個微信群最多500人了吧? 瀏覽 96點(diǎn)贊 評論 收藏 分享 手機(jī)掃一掃分享分享 舉報 評論圖片表情視頻評價全部評論推薦 項(xiàng)目案例|QQ 在線狀態(tài)升級故事三分設(shè)0狀態(tài)狀態(tài)0網(wǎng)頁端收消息,究竟是推還是拉?架構(gòu)師之路0QQQQ0QQ騰訊旗下,基于互聯(lián)網(wǎng)的即時通信軟件,標(biāo)志是一只戴著紅色圍巾的小企鵝,覆蓋多種主流平臺,支持手機(jī)和電腦QqQq0QQ騰訊旗下,基于互聯(lián)網(wǎng)的即時通信軟件,標(biāo)志是一只戴著紅色圍巾的小企鵝,覆蓋多種主流平臺,支持手機(jī)和電腦使用,支持在線聊天、視頻通話、點(diǎn)對點(diǎn)斷點(diǎn)續(xù)傳文件等多種功能,并可與多種通訊終端相連QQ,是騰訊QQ的QqQq0Scream (feat. QQ) [Qq Remix]Scream (feat. QQ) [Qq Remix]0恍惚狀態(tài)歌手瑜伽士Yogi恍惚狀態(tài)1595123114發(fā)布日期2021-11-12ISRCITO102086315時長5.62分鐘流派印度音樂曲目,音樂,器樂曲作曲家ThomasDallan點(diǎn)贊 評論 收藏 分享 手機(jī)掃一掃分享分享 舉報