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

網頁端收消息,究竟是推還是拉?

開發 開發工具
任何脫離業務的架構設計都是耍流氓。網頁端收消息,究竟是推還是拉?

任何脫離業務的架構設計都是耍流氓。

網頁端收消息,究竟是推還是拉?

什么業務場景?

對于在網頁端登錄的用戶A,發送方,也就是消息的來源有幾方面:

  • 系統發給A的“系統通知”,可能對實時性要求沒這么高;
  • 用戶發給A的“聊天消息”,有對實時性要求比較高,越實時越好。

消息的處理方,也就是系統側,一般來說:

  • 有服務對消息進行邏輯處理;
  • 有數據庫對數據進行落地;
  • 有緩存對數據進行加速。

拋開這些技術細節不談,暫且認為服務端對每一個用戶都有一個“待收消息”的隊列,里面存放了需要給這個用戶的一切消息。

消息的接收方,也就是用戶A,如果是在網頁端登錄,因為HTTP協議是“請求-響應”式的,服務端與網頁之間沒有消息通道,對于這類“收消息”的需求,是如何處理的呢?

方案一:輪詢拉取

輪詢拉取,是最容易想到的實現方式:

  • 發送方發送了消息,先入隊列;
  • 網頁端起一個timer,每個一段時間(例如10秒),發起一個輪詢請求,拉取隊列里的消息;
  • 如果隊列里有消息,就返回消息;
  • 如果隊列里無消息,就10秒后再次輪詢。

這種方式的優勢是:實現簡單,直觀且,容易理解,互聯網興起時,人數不多的聊天室就是這么玩的。畫外音:創辦于1996年的互聯網老站碧海銀沙,曾經中國最火爆的聊天室,已于2017.9.27停止運營。

缺點也很明顯:

  • 實時性差:最壞的情況下,1條消息進入隊列后,10s之后才會收到;
  • 效率低下:發消息是一個低頻動作,如果10次輪詢才收到1條消息,請求有效性只有10%,浪費了大量服務器資源。

更要命的是,在這種方案下,實時性與效率是一對不可調和的矛盾:如果將輪詢周期設為1/10,將時延縮短到1秒,意味著100次輪詢才會收到1條消息,請求有效性則降為了1%。

方案二:建立長連接

如果要兼顧實時性和效率,長連接是最佳之選,PC端聊天軟件基本都是使用長連接。網頁端常見的實現長連接的方式有兩種:

  • WebSocket
  • FlashSocket

這兩種方案的細節不再展開,ta們均有一定的局限性。

更為通用的方式,是“長輪詢”。

長輪詢,是通過拼裝HTTP短連接來達到長連接的效果,即保證了消息100%實時,又最大化的系統效率。

方案三:HTTP長輪詢

HTTP長輪詢的核心在于,瀏覽器與服務端之間建立了一條“通知連接”,它的特點是:

  • 這是一條browser發往web-server的HTTP連接;
  • 這條連接只用來收取推送通知;
  • 不像普通的“請求-響應”式HTTP請求,這個HTTP會被服務端夯住,直到有推送通知到達,或者超過約定的時間。

畫外音:對于HTTP請求,為了提高效率,一般來說browser和web-server都會有一些設置,如果一條HTTP請求長時間沒有數據(例如,150秒),會被斷開。“通知連接”為了不被browser和web-server粗暴斷開,一般會設置一個約定閾值(例如,小于150秒),由系統返回一個空消息,以便“優雅返回”。

更具體的,對于這條“夯住”與“只收推送通知”的“通知連接”,是怎么玩的呢?

場景一,發起通知連接時,隊列里正好有消息,則:

  • 發起通知連接,正好隊列里有消息;
  • 實時把隊列里的消息帶回;
  • 立馬再發起通知連接。

場景二,發起通知連接時,隊列里無消息,則:

  • 發起通知連接時,隊列里無消息;
  • 一直等待,直到觸發“時間閾值”,返回無消息;
  • 立馬再發起通知連接。

場景三,新消息來時,正好有通知連接在,則:

  • 新消息來時,正好有通知連接在;
  • 通知連接實時將消息帶回;
  • 立馬再發起通知連接。

上面三個場景的最終狀態,都是“一定,永遠,會有一條通知連接,連接在瀏覽器與服務器之間”,這樣就能夠保證消息的實時性。當然,有人會說,HTTP的返回與再次發起會有一個時間差,如果這個時間差,恰巧有新消息過來呢?

場景四,新消息來時,沒有通知連接,則:

  • 新消息來時,沒有通知連接;
  • 把新消息放入隊列。

最后這個場景,發生的概率非常小,但也確保了在“HTTP的返回與再次發起會有一個時間差”內,消息不會丟失,在通知連接發起后,消息能夠實時返回。

總結

網頁端收消息,究竟是推還是拉?

  • 最容易想到的是拉,但實時性和效率是一對無法調和的矛盾;
  • 最佳的方式是推,但WebSocket和FlashSocket各有局限性;
  • 最通用的方式是長輪詢,通過HTTP短連接拼裝長連接,具體是通過“夯住”“只收推送通知”的“通知連接”來實現的,能夠做到消息的實時性到達。

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

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

 

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

2016-11-01 15:16:52

QQ狀態即時通訊

2021-01-08 08:22:17

消息數據結構開發

2020-12-22 21:24:45

在線狀態服務端狀態狀態同步

2011-02-28 09:51:43

內省

2018-07-05 16:15:26

緩存數據cache miss

2010-06-28 14:47:45

云計算

2012-08-20 10:34:07

軟件開發開發軟件

2024-10-18 14:43:31

2009-05-06 16:10:17

Java傳值引用

2019-10-21 13:58:22

爬蟲互聯網程序員

2019-04-26 13:55:02

Istio微服務架構

2011-02-16 16:13:40

Debian

2019-02-14 10:10:11

系統廠商芯片

2020-05-06 18:32:37

人工智能AI制藥

2020-05-07 10:53:04

人工智能技術開發

2020-06-11 09:18:34

動靜分離架構架構設計開發

2019-06-04 14:15:08

JavaScript V8前端

2019-07-22 15:29:53

JavaScriptGitHub語言

2010-08-24 09:19:59

2018-05-30 15:29:56

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线激情 | 亚洲一区二区三区四区五区中文 | 成人夜晚看av | 一区二区三区小视频 | 男女国产网站 | 7799精品视频天天看 | 国产成人精品午夜 | 91av在线免费播放 | 国产精品一区二区三区在线 | 日日摸夜夜添夜夜添特色大片 | 亚洲人人 | 亚洲精品视频观看 | 一级免费a | 韩日精品一区 | 亚洲欧美一区二区三区1000 | 免费在线国产视频 | 中文字幕视频在线 | h视频亚洲 | 自拍偷拍亚洲视频 | 亚洲高清一区二区三区 | 国产精久久久久久 | 午夜国产羞羞视频免费网站 | 午夜视频网站 | 91观看| 国产伊人精品 | 日韩第一夜 | 成年人视频免费在线观看 | 欧美日韩一 | 九九精品网 | 亚洲精品日日夜夜 | 久久久久久国产精品免费免费 | 久久久青草婷婷精品综合日韩 | 香蕉一区 | 欧美日韩高清在线一区 | 久久久毛片 | 国产精品日韩在线 | 欧美日韩免费视频 | 视频一区在线观看 | 亚洲国产成人一区二区 | 日韩在线视频一区 | 影视一区 |