成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

QQ狀態(tài)同步究竟是推還是拉?

開(kāi)發(fā) 開(kāi)發(fā)工具
前面兩篇講即時(shí)通訊核心技術(shù)的文章:《微信為什么不丟消息?》、《http如何像tcp一樣實(shí)時(shí)的收消息?》。反饋還可以,故繼續(xù)即時(shí)通訊這一個(gè)系列吧,今天聊聊即時(shí)通訊中的“狀態(tài)”。

前面兩篇講即時(shí)通訊核心技術(shù)的文章

《微信為什么不丟消息?》

《http如何像tcp一樣實(shí)時(shí)的收消息?》

反饋還可以,故繼續(xù)即時(shí)通訊這一個(gè)系列吧,今天聊聊即時(shí)通訊中的“狀態(tài)”。

需求緣起

“在線狀態(tài)一致性”(好友在線狀態(tài),群友在線狀態(tài))是即時(shí)通訊領(lǐng)域較難解決的一個(gè)技術(shù)問(wèn)題,如何精準(zhǔn)實(shí)時(shí)的獲得好友、群友的在線狀態(tài),是今天將要探討的話題。

好友狀態(tài)一致性

問(wèn)題一:用戶uid-A登錄時(shí),如何獲取自己全部好友的在線狀態(tài)?

回答:

(1)服務(wù)器要存儲(chǔ)所有用戶的在線狀態(tài)(往往存儲(chǔ)在保證高可用的緩存集群里) -> 保證狀態(tài)可查

(2)用戶狀態(tài)實(shí)時(shí)變更,任何用戶登錄時(shí),需要將服務(wù)端自己的在線狀態(tài)置為online;任何用戶登出時(shí),需要將服務(wù)端自己的狀態(tài)置為offline -> 保證服務(wù)端狀態(tài)存儲(chǔ)的一致性與實(shí)時(shí)性

(3)uid-A登錄時(shí),先去數(shù)據(jù)庫(kù)拉取自己的好友列表,再去緩存獲取所有好友的在線狀態(tài) -> 保證登錄時(shí)好友狀態(tài)獲取的一致性與實(shí)時(shí)性

問(wèn)題二:用戶uid-A的好友uid-B狀態(tài)改變時(shí)(由登錄、登出、隱身等動(dòng)作觸發(fā)),uid-A如何知道這一事件?

方案一:uid-A向服務(wù)器輪詢拉取uid-B(其實(shí)是自己的全部好友)的狀態(tài),例如每1分鐘一次

缺點(diǎn):

(1)如果uid-B的狀態(tài)改變,uid-A獲取不實(shí)時(shí),可能有1分鐘時(shí)延

(2)如果uid-B的狀態(tài)不改變,uid-A會(huì)有大量無(wú)效的輪詢請(qǐng)求,占用服務(wù)器資源

方案二:uid-B狀態(tài)改變時(shí)(由登錄、登出、隱身等動(dòng)作觸發(fā)),服務(wù)器不僅在緩存中修改uid-B的狀態(tài),還要將這個(gè)狀體改變的通知推送給uid-B的在線反向好友(反向好友是指:加了uid-B為好友的人,而不是uid-B的好友,這個(gè)細(xì)節(jié)要注意)

優(yōu)點(diǎn):

(1)實(shí)時(shí)

缺點(diǎn):

(2)當(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)一致性

問(wèn)題三:群友狀態(tài)一致性有什么不同,和好友狀態(tài)一致性相比復(fù)雜在哪里?為什么不能采用實(shí)時(shí)推送?

回答:理論上群友狀態(tài)也可以通過(guò)實(shí)時(shí)推送的方式實(shí)現(xiàn),以保證實(shí)時(shí)性。但實(shí)際上,群友狀態(tài)一般都是采用拉取的方式獲得,因?yàn)槿河褷顟B(tài)“消息風(fēng)暴擴(kuò)散系數(shù)”N實(shí)在太大,全部實(shí)時(shí)獲取系統(tǒng)往往承受不了

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

XXX系統(tǒng)使用的是群友狀態(tài)推送,不存在的這樣的問(wèn)題?那很可能是,XXX系統(tǒng)的用戶量和活躍度還不夠高吧。

問(wèn)題四:輪詢拉取群友狀態(tài)也會(huì)給服務(wù)器帶來(lái)過(guò)大的壓力,還有什么優(yōu)化方式?

回答:群友的數(shù)據(jù)量太大,雖然每個(gè)用戶平均加入了20個(gè)群,但實(shí)際上并不會(huì)每次登錄都進(jìn)入每一個(gè)群。不采用輪詢拉取,而采用按需拉取,延時(shí)拉取的方式,在真正進(jìn)入一個(gè)群時(shí)才實(shí)時(shí)拉取群友的在線狀態(tài),是既能滿足用戶需求(用戶感覺(jué)是狀態(tài)是實(shí)時(shí)、一致的,但其實(shí)是進(jìn)入群才拉取的),又能降低服務(wù)器壓力。這是一種常見(jiàn)方法。

關(guān)于更多按需拉取,延時(shí)拉取的討論,可移步《微信為啥這么省流量》。

延伸討論:系統(tǒng)消息/開(kāi)屏廣告的推送與拉取

問(wèn)題五:系統(tǒng)消息/開(kāi)屏廣告一般采用推送還是拉取?

回答:不考慮APP端的push(APP端的push,不需要啟動(dòng)APP,不依賴client與server之間的TCP長(zhǎng)連接),個(gè)人強(qiáng)烈建議系統(tǒng)消息/開(kāi)屏廣告這類(lèi)消息采用“拉取”的方式,原因是:

  1. 這類(lèi)業(yè)務(wù)對(duì)消息的實(shí)時(shí)性往往要求不高
  2. 如果集中推送,“消息風(fēng)暴擴(kuò)散系數(shù)”過(guò)大,容易引發(fā)系統(tǒng)抖動(dòng);而拉取的方式,可以攤平這個(gè)抖動(dòng),用戶登錄時(shí)均勻的發(fā)起請(qǐng)求
  3. 如果集中推送,往往不在意用戶是否“在線”,往往會(huì)造成大量離線垃圾消息;而拉取的方式,保證只有在線的用戶才會(huì)收到請(qǐng)求

有不同的建議,歡迎評(píng)論討論。

總結(jié)與建議

狀態(tài)的實(shí)時(shí)性與一致性是一個(gè)較難解決的技術(shù)問(wèn)題,不同的業(yè)務(wù)接受度,不同的數(shù)據(jù)量并發(fā)量在線量,實(shí)現(xiàn)方式不同,個(gè)人建議的方式是:

  1. 好友狀態(tài),如果對(duì)實(shí)時(shí)性要求較高,可以采用推送的方式同步;如果實(shí)時(shí)性要求不高,可以采用輪詢拉取的方式同步
  2. 群友的狀態(tài),由于消息風(fēng)暴擴(kuò)散系數(shù)過(guò)大,可以采用按需拉取延時(shí)拉取的方式同步
  3. 系統(tǒng)消息/開(kāi)屏廣告等對(duì)實(shí)時(shí)性要求不高的業(yè)務(wù),可以采用拉取的方式獲取消息
  4. “消息風(fēng)暴擴(kuò)散系數(shù)”是指一個(gè)消息發(fā)出時(shí),變成N個(gè)消息的擴(kuò)散系數(shù),這個(gè)系數(shù)與業(yè)務(wù)及數(shù)據(jù)相關(guān),一定程度上它的大小決定了技術(shù)采用推送還是拉取

文章轉(zhuǎn)載自微信公眾號(hào)“架構(gòu)師之路“

 

責(zé)任編輯:未麗燕 來(lái)源: 架構(gòu)師之路
相關(guān)推薦

2020-12-22 21:24:45

在線狀態(tài)服務(wù)端狀態(tài)狀態(tài)同步

2021-01-05 09:23:49

網(wǎng)頁(yè)端消息

2021-01-08 08:22:17

消息數(shù)據(jù)結(jié)構(gòu)開(kāi)發(fā)

2011-02-28 09:51:43

內(nèi)省

2018-07-05 16:15:26

緩存數(shù)據(jù)cache miss

2010-06-28 14:47:45

云計(jì)算

2012-08-20 10:34:07

軟件開(kāi)發(fā)開(kāi)發(fā)軟件

2024-10-18 14:43:31

2019-04-26 13:55:02

Istio微服務(wù)架構(gòu)

2009-05-06 16:10:17

Java傳值引用

2019-10-21 13:58:22

爬蟲(chóng)互聯(lián)網(wǎng)程序員

2016-11-10 21:00:49

消息存儲(chǔ)數(shù)據(jù)

2011-02-16 16:13:40

Debian

2020-05-06 18:32:37

人工智能AI制藥

2019-02-14 10:10:11

系統(tǒng)廠商芯片

2020-05-07 10:53:04

人工智能技術(shù)開(kāi)發(fā)

2020-06-11 09:18:34

動(dòng)靜分離架構(gòu)架構(gòu)設(shè)計(jì)開(kāi)發(fā)

2019-06-04 14:15:08

JavaScript V8前端

2019-07-22 15:29:53

JavaScriptGitHub語(yǔ)言

2010-08-24 09:19:59

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久久久久一级 | 婷婷色国产偷v国产偷v小说 | 成人在线观看免费视频 | 四虎伊人| japanhdxxxx裸体| 在线免费观看黄色 | 龙珠z在线观看 | 国产日韩欧美激情 | 国产精品a久久久久 | 国产成人精品午夜 | 黄色在线免费观看 | 久久精品欧美视频 | 日本午夜一区 | 免费成人午夜 | 欧美极品在线 | 日韩看片| 亚洲午夜精品在线观看 | 欧洲精品一区 | 黄色中文字幕 | 国产在线观 | 亚洲福利一区 | 中文字幕蜜臀av | 亚州精品天堂中文字幕 | 91精品国产777在线观看 | 中文字幕一区二区三区四区 | 亚洲综合天堂 | 操人网| 国产目拍亚洲精品99久久精品 | 青青草这里只有精品 | 成人久久久 | 国产视频精品视频 | 亚洲视频免费 | 九九九视频在线 | 99久久久无码国产精品 | 亚洲精品区 | 欧美日韩在线免费观看 | 一区二区免费看 | 1000部精品久久久久久久久 | 久久久久久美女 | 欧美中文字幕一区二区 | 国产综合精品一区二区三区 |