http如何像tcp一樣實時的收訊息?
一、webim如何實現訊息推送
webim通常有三種方式實現推送通道:
1)websocket
2)flashsocket
3)http輪詢
其中1)和2)是用tcp長連線實現的,其訊息的實時性可以通過tcp保證。
方案3)才算是webim實現訊息推送的「正統」方案,用http短連線輪詢的方式實現「偽長連線」,既然是輪詢,有朋友就對訊息的實時性產生了質疑。本文要解答,webim使用http長輪詢如何保證訊息的絕對實時性。
二、人們為什麼會誤解http長輪詢不實時
什麼是輪詢?我擦,這個該怎麼解釋咧。
舉個栗子,在火車上想上洗手間,擠到洗手間旁,卻發現洗手間有人,於是你只能回座位繼續等。過了n分鐘,又朝洗手間的方向擠過去,卻發現洗手間還是有人,又只能回坐等。這麼一而再,再而三的每隔n分鐘去洗手間檢視洗手間是否有蹲位,這就是輪詢。
webim用輪詢的方式拉取訊息會存在什麼問題?
webim每隔n分鐘,輪詢呼叫 「獲取訊息」介面,有可能出現訊息的延時,某一時刻剛拉取完訊息,突然又產生了一條新訊息,這條訊息就必須等到n分鐘之後,再次發起「獲取訊息」輪詢時,才有機會獲取到。
減小輪詢時間間隔是否能解決訊息延時的問題?
減小輪詢時間間隔的確可以縮短延時時間,但也不能保證訊息絕對的實時,同時又會產生新的問題,絕大部分的輪詢呼叫,都沒有訊息返回,造成服務端極大的資源浪費。
很多人基於上述直覺,認為webim使用http長輪詢的方式拉取訊息,會導致訊息有延時,其實,webim的http長輪詢根本不是這麼玩的。
三、長輪詢實際怎麼玩
訊息連線
webim和webserver之間建立一條http連線,專門用作訊息通道,這條連線叫http訊息連線【見下圖】
訊息連線的4大特性
1)沒有訊息到達的時候,這個http訊息連線將被夯住,不返回,由於http是短連線,這個http訊息連線最多被夯住90秒,就會被斷開(這是瀏覽器或者webserver的行為)
2)在1)的情況下,如果http訊息連線被斷開,立馬再發起乙個http訊息連線【見下圖中的步驟1、2】
3)在1)和2)的配合下,瀏覽器與webserver之間將永遠有一條訊息連線在(極限情況下會出現4)),每次收到訊息時,這個訊息連線就能及時將訊息帶回瀏覽器頁面,並且在返回後,會立馬再發起乙個http訊息連線【見下圖中的步驟1、2、3】
4)如果訊息到達時,上乙個http訊息連線正在返回,沒有http訊息連線可用(理論上http訊息連線的返回是瞬時的,沒有連線可用出現的概率極小),則將訊息暫存入訊息池中,下乙個訊息連線到達後(上乙個訊息連線返回後,根據2)和3)會立馬返回新的訊息連線,無等待時間),將訊息帶回,並又立刻返回生成新的訊息連線【見下圖中的步驟1、2、3、4、5、6、7】
上述1-4就能夠保證一直有一條http訊息連線在,以保證webim訊息推送的絕對實時性。
四、結論
webim通過http長輪詢可以保證訊息的絕對實時性。這種實時性的保證不是通過增加輪詢頻率來保證的,而是通過夯住http訊息連線來保證的,在大部分時間沒有實時訊息的情況下,這個http訊息連線對於webserver的請求壓力是90秒1次,能夠大大節省了web伺服器資源。
http如何像TCP一樣實時接收訊息
即時訊息 webim 通常有三種方式實現推送 1 websocket 2 flashsocket 3 http輪詢 其中 1 和 2 是用tcp長連線實現的,其訊息的實時性可以通過tcp保證。方案 3 才算是webim實現訊息推送的 正統 方案,用http短連線輪詢的方式實現 偽長連線 什麼是輪詢 ...
像外行一樣思考,像專家一樣實踐
像外行一樣思考,像專家一樣實踐,不只是說說而已。題記 看了試讀的章節有些日子,看完了試讀部分,其中一部分是能和我共鳴,還有一部分觀點,自己也比較贊成,但貌似又有些抽象。我想,書不單是用來讀的,讀一本好書,就像吃肉一樣,吸收書中的營養,把營養轉換為自己的血液,直到骨髓中,成為生命中的一部分。像外行一樣...
《像外行一樣思考,像專家一樣實踐》
這本書是在看 暗時間 時收集到的,書的副標題是科研成功之道,自己是個資訊工作者,也號稱科研工作者,雖然經常忙著一些雜活,沒有時間認真思考和做實驗。但從中找點立項 研究 演講 總結的經驗也是有益的。這本書的目錄比較有特點,竟然佔了12頁,基本上看了目錄也能了解了書的主要思想和內容。專家由於他受固有思想...