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

QQ好友狀態,QQ群友狀態,究竟是推還是拉?

開發 開發工具
狀態同步,有好友狀態的同步,有群友狀態的同步,有的需要實時同步,有的能夠容忍延時。任何脫離業務的架構設計都是耍流氓,不同場景下,狀態同步,究竟是推送還是拉取呢?

狀態同步,有好友狀態的同步,有群友狀態的同步,有的需要實時同步,有的能夠容忍延時。任何脫離業務的架構設計都是耍流氓,不同場景下,狀態同步,究竟是推送還是拉取呢?

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

[[359380]]

什么是服務端狀態?

服務端狀態,主要分為在線online和離線offline,不同的狀態,對于不同的業務處理流程可能不同。例如對于消息的處理:

  • 服務端狀態在線,直接投遞給用戶;
  • 服務端狀態離線,直接存儲離線消息,等用戶下一次登錄拉取;

如何實時更新服務端狀態?

用戶uid-A登錄時,會修改用戶的服務端狀態為在線。

用戶uid-A登出時,會修改用戶的服務端狀態為離線。

經常的,服務端會將用戶的服務端狀態存儲在高可用的緩存集群里。

什么是客戶端狀態?

不同的產品,會有不同的客戶端狀態,例如隱身、離線、忙碌、勿擾等,這些狀態大多是產品功能需求。

畫外音:微信,在設計之初,就摒棄了用戶端狀態這個概念。

后文為了方便描述,不妨設待討論的是QQ這種擁有客戶端狀態的產品,并假設客戶端狀態也只有在線和離線兩種狀態,后文統一稱為“用戶狀態”。

如何獲取好友的狀態?

uid-A登錄時,先去數據庫拉取自己的好友列表,再去緩存獲取所有好友的狀態。

用戶uid-A的好友uid-B狀態改變時(由登錄、登出等動作觸發),uid-A如何同步這一事件?

這里就有推拉的設計折衷了。

情況一:如果對于狀態變更實時性要求不高,可以采用拉取。

uid-A向服務器輪詢拉取uid-B(其實是自己的全部好友)的狀態,例如每1分鐘一次,其缺點是:

  • 如果uid-B的狀態改變,uid-A獲取不實時,可能有1分鐘時延;
  • 如果uid-B的狀態不改變,uid-A會有大量無效的輪詢請求,非常低效;

情況二:如果對于狀態變更實時性要求較高,則必須推送。

uid-B狀態改變時(由登錄、登出等動作觸發),服務端不僅要在緩存中修改uid-B的狀態,還要將這個狀體改變的通知推送給uid-B的在線好友。

推送的優勢是:實時。

缺點是:當在線好友量很大時,任何一個用戶狀態的改變,會擴散成N個實時通知,這個N叫做“消息風暴擴散系數”。假設一個IM系統平均每個用戶有200個好友,平均有20%的好友在線,那么消息風暴擴散系數N=40,這意味著,任何一個狀態的變化會變成40個推送請求。

群友狀態的一致性,和好友狀態的一致性相比,復雜在哪里?可不可以采用實時推送?

群這個業務場景大伙也非常之熟悉,你能夠加入若干群(例如20個),假設平均每個群有200人,即你會有4000個群友。

理論上群友狀態也可以通過實時推送的方式實現,以保證實時性。進一步討論之前,先一起估算下這個業務場景下的“消息風暴擴散系數”。

假設平均每個用戶加了20個群,平均每個群有200個用戶,依然假設20%的用戶在線,那么為了保證群友狀態的實時性,每個用戶登錄,就要將自己的狀態改變通知發送給20*200*20%=800個群友,N=800,意味著,任何一個狀態的變化會變成800個推送請求。如果說好友狀態實時推送,消息風暴擴散系數N=40尚可以接受,那么群友狀態實時推送,N=800則是災難性的。此類業務往往采用輪詢拉取的方式,獲得群友的狀態。

輪詢拉取群友狀態也會給服務器帶來過大的壓力,還有什么優化方式?

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

總結

狀態的實時性與一致性是一個較難解決的技術問題,不同的業務實現方式不同,一般來說:

  • 好友狀態同步,是采用推送的方式同步;
  • 群友狀態同步,由于消息風暴擴散系數過大,一般采用拉取的方式同步;
  • 群友狀態同步,還能采用按需拉取的優化方式,進一步降低服務端壓力;
  • “消息風暴擴散系數”是指一個消息發出時,變成N個消息的擴散系數,這個系數一定程度上決定了技術采用推送還是拉取;

畫外音:群消息的推送,也存在“消息風暴擴散系數”的問題。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

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

 

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2016-11-01 15:16:52

QQ狀態即時通訊

2021-01-05 09:23:49

網頁端消息

2021-01-08 08:22:17

消息數據結構開發

2011-02-28 09:51:43

內省

2018-07-05 16:15:26

緩存數據cache miss

2016-11-10 21:00:49

消息存儲數據

2010-06-28 14:47:45

云計算

2012-08-20 10:34:07

軟件開發開發軟件

2021-09-02 08:24:27

pod EvictedKubernetes

2009-05-06 16:10:17

Java傳值引用

2019-10-21 13:58:22

爬蟲互聯網程序員

2011-02-16 16:13:40

Debian

2024-10-18 14:43:31

2019-04-26 13:55:02

Istio微服務架構

2019-02-14 10:10:11

系統廠商芯片

2020-05-07 10:53:04

人工智能技術開發

2020-05-06 18:32:37

人工智能AI制藥

2019-06-04 14:15:08

JavaScript V8前端

2019-07-22 15:29:53

JavaScriptGitHub語言

2010-08-24 09:19:59

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本三级电影在线看 | 日韩黄色免费 | 亚洲黄色一区二区三区 | 91久久精品日日躁夜夜躁国产 | 欧美一级欧美一级在线播放 | 激情网站在线 | 久久久亚洲 | 精品久久久久久久久久 | 96国产精品久久久久aⅴ四区 | 91在线看片| 国产h视频| 国产高清视频一区 | 国产精品欧美一区二区三区 | 国产日韩欧美另类 | 欧美9999| 日本又色又爽又黄又高潮 | 国产激情视频在线观看 | 国产欧美在线观看 | 日韩电影中文字幕 | 黄色av一区 | 国产精品高潮呻吟久久 | 免费在线成人 | 久久综合888 | 九九九视频精品 | 久久久性色精品国产免费观看 | www.久久精品 | 免费看a | 亚洲精品国产一区 | 精品一区二区视频 | 可以在线观看av的网站 | 国产一区二区影院 | 欧洲精品视频一区 | 91在线中文字幕 | 久久综合一区 | 三级国产三级在线 | 日本精品视频在线 | 日本高清在线一区 | 国产精品高潮呻吟久久aⅴ码 | 色桃网 | 日本一区二区高清不卡 | 久草在线 |