feed留,單聊群聊,系統(tǒng)通知,狀態(tài)同步,到底是推還是拉?
今天拋一個(gè)話(huà)題,根據(jù)業(yè)務(wù)現(xiàn)象,一起討論其后端實(shí)現(xiàn)是推還是拉?
一、feed流
可以理解為一個(gè)發(fā)布訂閱業(yè)務(wù),典型業(yè)務(wù)是微博(朋友圈)。你關(guān)注了姚晨的微博,姚晨發(fā)布了消息,你的主頁(yè)能看到她***發(fā)布的消息,這個(gè)場(chǎng)景是推送,還是拉取呢?
畫(huà)外音:微博是弱關(guān)系,關(guān)注無(wú)需對(duì)方同意,粉絲可以無(wú)上限;朋友圈是強(qiáng)關(guān)系,好友需要對(duì)方同意,好友個(gè)數(shù)有上線(xiàn)。
如果推送,姚晨發(fā)布消息的時(shí)候,要把消息ID投遞到所有粉絲的主頁(yè)消息隊(duì)列里,推送量巨大。
如果拉取,一來(lái)主頁(yè)消息無(wú)法實(shí)時(shí)更新,二來(lái)每次刷新動(dòng)作非常復(fù)雜:
- 拉取你關(guān)注人的list
- 拉取這些人的消息list
- 對(duì)于這些人的這些消息進(jìn)行rank處理,例如按照時(shí)間排序
- 還無(wú)法對(duì)主頁(yè)進(jìn)行緩存,因?yàn)橹灰嘘P(guān)注人發(fā)布消息,主頁(yè)內(nèi)容就會(huì)變化
- 還得考慮“不看誰(shuí)的消息”,以及“消息不給誰(shuí)看”
- ...
是不是覺(jué)得有點(diǎn)煩?如果你是架構(gòu)師,你會(huì)怎么做?
二、聊天消息
聊天消息又分為單聊和群聊,典型的業(yè)務(wù)是微信。和朋友小窗溝通是單聊,群內(nèi)扯淡是群聊。
- 單聊,很容易想到是服務(wù)器推送,但瀏覽器里的聊天工具JS只能使用http式的request - response協(xié)議,又能不能保證消息的實(shí)時(shí)性呢?
- 群聊,一個(gè)群500個(gè)人,有人在線(xiàn),有人離線(xiàn),到底是推送,還是拉取呢?
如果是推送,1條消息將轉(zhuǎn)變?yōu)?00條消息,系統(tǒng)壓力會(huì)異常之大。
如果是拉取,消息的實(shí)時(shí)性又該如何保障呢?
還有一個(gè)坑爹的需求,“釘釘”的群聊天消息“已讀回執(zhí)”,這個(gè)需求簡(jiǎn)單描述是:對(duì)于每一條你發(fā)出的每一群消息,你能夠看到,多少人已讀,多少人未讀。這個(gè)群消息已讀回執(zhí),猜猜看,又是怎么實(shí)現(xiàn)的呢?
三、系統(tǒng)通知
系統(tǒng)消息聽(tīng)上去比較泛,典型的業(yè)務(wù)是QQ的登錄廣告彈窗,以及登錄后的右下角廣告提示。
- QQ每天***登錄后的新聞彈窗:拉取?第二次登錄卻又沒(méi)有。
- QQ運(yùn)行過(guò)程中的QQ彈窗廣告:推送?一次推送幾千萬(wàn)條,會(huì)不會(huì)系統(tǒng)抖動(dòng)?
或許,真實(shí)的實(shí)現(xiàn)方式或許與我們想的并不一樣。
玩桌面QQ時(shí),收到過(guò)“你的好友XXOO登錄了”的彈窗提示么?這是一個(gè)好友登錄/登出狀態(tài)的客戶(hù)端同步。同理,群有500人,每個(gè)群友的在線(xiàn)/不在線(xiàn)狀態(tài)又是怎么實(shí)現(xiàn)同步的呢?
推送?那一個(gè)用戶(hù)登錄退出都要推送N個(gè)好友?M個(gè)群友?
拉取?如何保證好友狀態(tài),群友狀態(tài)的實(shí)時(shí)性?
畫(huà)外音:好友/群友狀態(tài)一致性是非常復(fù)雜的,移動(dòng)的時(shí)代,索性引入“一律在線(xiàn)”的概念,微信的好友就不存在所謂“頭像亮”和“頭像灰”的概念了,客戶(hù)端狀態(tài)同步這一塊復(fù)雜性有所降低。
看到產(chǎn)品功能,思考后面的技術(shù)實(shí)現(xiàn),其實(shí)是很有意思的一件事。
究竟是推,還是拉?大伙怎么看。
還有其他業(yè)務(wù)場(chǎng)景的疑惑,也歡迎評(píng)論提問(wèn),有價(jià)值的問(wèn)題,5月份逐條解答。
畫(huà)外音:自從有了群消息已讀回執(zhí),我再也不能裝作不在線(xiàn),領(lǐng)導(dǎo)的消息沒(méi)看到了。
【本文為51CTO專(zhuān)欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】