微博網(wǎng)頁(yè)端通過(guò)輪詢收發(fā)消息,憑什么沒(méi)有延時(shí)!
有水友問(wèn)我說(shuō),微博網(wǎng)頁(yè)端IM通過(guò)HTTP收發(fā)消息,會(huì)不會(huì)有延時(shí)?
之前做過(guò)幾十年IM架構(gòu),今天和大家聊聊這里面的技術(shù)點(diǎn)。
WebIM一般如何實(shí)現(xiàn)消息推送?
通常的有三種實(shí)現(xiàn)方式:
- WebSocket;
- FlashSocket;
- HTTP輪詢;
其中1和2是基于TCP長(zhǎng)鏈接實(shí)現(xiàn)的,水友問(wèn)的問(wèn)題,主要是第三類,用HTTP短連接輪詢的方式實(shí)現(xiàn)消息的收發(fā),能否能保證消息的絕對(duì)實(shí)時(shí)性。
大家為什么會(huì)覺(jué)得HTTP長(zhǎng)輪詢有延時(shí)?
這要從大家理解的“輪詢”說(shuō)起。
什么是輪詢?
舉個(gè)栗子,在火車上想上洗手間,擠到洗手間旁,卻發(fā)現(xiàn)洗手間有人,于是你只能回座位繼續(xù)等。過(guò)了N分鐘,又朝洗手間的方向擠過(guò)去,卻發(fā)現(xiàn)洗手間還是有人,又只能回坐等。這么一而再,再而三的每隔N分鐘去洗手間查看洗手間是否有蹲位,這就是輪詢。
WEBIM采用上述輪詢的方式收發(fā)消息會(huì)存在什么問(wèn)題?
可能導(dǎo)致消息延時(shí),某一時(shí)刻剛拉取完消息,突然又產(chǎn)生了一條新消息,這條消息就必須等到N分鐘之后,下次輪詢時(shí),才有機(jī)會(huì)獲取到。延時(shí)的最大值是N。
減小輪詢時(shí)間間隔,是否能解決消息延時(shí)的問(wèn)題?
不能,只能縮小延時(shí),不能保證絕對(duì)實(shí)時(shí)。
同時(shí)還會(huì)產(chǎn)生更大的問(wèn)題,大部分的輪詢調(diào)用,都沒(méi)有消息返回,造成服務(wù)端極大的資源浪費(fèi)。
不少人基于上述直覺(jué),認(rèn)為WEBIM使用HTTP長(zhǎng)輪詢收發(fā)消息會(huì)有延時(shí)。但其實(shí),HTTP長(zhǎng)輪詢壓根不是這回事。
HTTP長(zhǎng)輪詢實(shí)際是怎么玩的?
專用消息連接。
什么是專用消息鏈接?
瀏覽器與web-server之間建立的,一條專門用來(lái)接受通知消息的HTTP鏈接。
專用消息連接的玩法細(xì)節(jié)如下:
- 沒(méi)有消息到達(dá)的時(shí)候,專用消息連接將被夯住一段時(shí)間(例如:90秒);
- 夯住90秒,專用消息連接被斷開之后,立馬再發(fā)起一個(gè)專用消息連接;
- 在1和2的配合下,每次收到通知消息時(shí),這個(gè)連接就能及時(shí)將消息帶回瀏覽器頁(yè)面;
- 在3的情況下,專用消息連接返回瀏覽器后,又立刻發(fā)起新的專用消息連接,如此一來(lái),瀏覽器與web-server之間將永遠(yuǎn)有一條能夠接受服務(wù)器通知的專用消息連接,以此,來(lái)保證WEBIM消息收發(fā)的絕對(duì)實(shí)時(shí)性。
總結(jié)
- HTTP長(zhǎng)輪詢可以保證消息的絕對(duì)實(shí)時(shí)性;
- 這種實(shí)時(shí)性不是通過(guò)增加輪詢頻率來(lái)保證的;
- 而是通過(guò)專用消息連接,通過(guò)夯住HTTP請(qǐng)求來(lái)實(shí)現(xiàn)的,這個(gè)HTTP消息連接對(duì)于web-server的請(qǐng)求壓力大約是90秒1次,能夠大大節(jié)省了服務(wù)器資源。
知其然,知其所以然。
思路比結(jié)論更重要。