偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

QQ好友狀態(tài),QQ群友狀態(tài),究竟是推還是拉?

開發(fā) 開發(fā)工具
狀態(tài)同步,有好友狀態(tài)的同步,有群友狀態(tài)的同步,有的需要實(shí)時(shí)同步,有的能夠容忍延時(shí)。任何脫離業(yè)務(wù)的架構(gòu)設(shè)計(jì)都是耍流氓,不同場(chǎng)景下,狀態(tài)同步,究竟是推送還是拉取呢?

狀態(tài)同步,有好友狀態(tài)的同步,有群友狀態(tài)的同步,有的需要實(shí)時(shí)同步,有的能夠容忍延時(shí)。任何脫離業(yè)務(wù)的架構(gòu)設(shè)計(jì)都是耍流氓,不同場(chǎng)景下,狀態(tài)同步,究竟是推送還是拉取呢?

用戶的在線狀態(tài),分為客戶端狀態(tài)(端),服務(wù)端狀態(tài)(云)兩種形態(tài)。

[[359380]]

什么是服務(wù)端狀態(tài)?

服務(wù)端狀態(tài),主要分為在線online和離線offline,不同的狀態(tài),對(duì)于不同的業(yè)務(wù)處理流程可能不同。例如對(duì)于消息的處理:

  • 服務(wù)端狀態(tài)在線,直接投遞給用戶;
  • 服務(wù)端狀態(tài)離線,直接存儲(chǔ)離線消息,等用戶下一次登錄拉取;

如何實(shí)時(shí)更新服務(wù)端狀態(tài)?

用戶uid-A登錄時(shí),會(huì)修改用戶的服務(wù)端狀態(tài)為在線。

用戶uid-A登出時(shí),會(huì)修改用戶的服務(wù)端狀態(tài)為離線。

經(jīng)常的,服務(wù)端會(huì)將用戶的服務(wù)端狀態(tài)存儲(chǔ)在高可用的緩存集群里。

什么是客戶端狀態(tài)?

不同的產(chǎn)品,會(huì)有不同的客戶端狀態(tài),例如隱身、離線、忙碌、勿擾等,這些狀態(tài)大多是產(chǎn)品功能需求。

畫外音:微信,在設(shè)計(jì)之初,就摒棄了用戶端狀態(tài)這個(gè)概念。

后文為了方便描述,不妨設(shè)待討論的是QQ這種擁有客戶端狀態(tài)的產(chǎn)品,并假設(shè)客戶端狀態(tài)也只有在線和離線兩種狀態(tài),后文統(tǒng)一稱為“用戶狀態(tài)”。

如何獲取好友的狀態(tài)?

uid-A登錄時(shí),先去數(shù)據(jù)庫(kù)拉取自己的好友列表,再去緩存獲取所有好友的狀態(tài)。

用戶uid-A的好友uid-B狀態(tài)改變時(shí)(由登錄、登出等動(dòng)作觸發(fā)),uid-A如何同步這一事件?

這里就有推拉的設(shè)計(jì)折衷了。

情況一:如果對(duì)于狀態(tài)變更實(shí)時(shí)性要求不高,可以采用拉取。

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

  • 如果uid-B的狀態(tài)改變,uid-A獲取不實(shí)時(shí),可能有1分鐘時(shí)延;
  • 如果uid-B的狀態(tài)不改變,uid-A會(huì)有大量無(wú)效的輪詢請(qǐng)求,非常低效;

情況二:如果對(duì)于狀態(tài)變更實(shí)時(shí)性要求較高,則必須推送。

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

推送的優(yōu)勢(shì)是:實(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)的一致性,和好友狀態(tài)的一致性相比,復(fù)雜在哪里?可不可以采用實(shí)時(shí)推送?

群這個(gè)業(yè)務(wù)場(chǎng)景大伙也非常之熟悉,你能夠加入若干群(例如20個(gè)),假設(shè)平均每個(gè)群有200人,即你會(huì)有4000個(gè)群友。

理論上群友狀態(tài)也可以通過實(shí)時(shí)推送的方式實(shí)現(xiàn),以保證實(shí)時(shí)性。進(jìn)一步討論之前,先一起估算下這個(gè)業(yè)務(wù)場(chǎng)景下的“消息風(fēng)暴擴(kuò)散系數(shù)”。

假設(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)求。如果說好友狀態(tài)實(shí)時(shí)推送,消息風(fēng)暴擴(kuò)散系數(shù)N=40尚可以接受,那么群友狀態(tài)實(shí)時(shí)推送,N=800則是災(zāi)難性的。此類業(yè)務(wù)往往采用輪詢拉取的方式,獲得群友的狀態(tài)。

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

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

總結(jié)

狀態(tài)的實(shí)時(shí)性與一致性是一個(gè)較難解決的技術(shù)問題,不同的業(yè)務(wù)實(shí)現(xiàn)方式不同,一般來(lái)說:

  • 好友狀態(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ù)采用推送還是拉取;

畫外音:群消息的推送,也存在“消息風(fēng)暴擴(kuò)散系數(shù)”的問題。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2016-11-01 15:16:52

QQ狀態(tài)即時(shí)通訊

2021-01-05 09:23:49

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

2021-01-08 08:22:17

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

2011-02-28 09:51:43

內(nèi)省

2018-07-05 16:15:26

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

2016-11-10 21:00:49

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

2010-06-28 14:47:45

云計(jì)算

2012-08-20 10:34:07

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

2021-09-02 08:24:27

pod EvictedKubernetes

2009-05-06 16:10:17

Java傳值引用

2019-10-21 13:58:22

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

2024-10-18 14:43:31

2011-02-16 16:13:40

Debian

2019-04-26 13:55:02

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

2020-05-07 10:53:04

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

2020-05-06 18:32:37

人工智能AI制藥

2019-02-14 10:10:11

系統(tǒng)廠商芯片

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)