websocket 是長連接,受網絡限制比較大,需要處理好重連,比如用戶進電梯或電信用戶打個電話網斷了,這時候就需要重連,如果 ws 一直重連不上,有些較復雜的業務方會不願意的,是不是還要搞個 http 降級?
所以大部分不重要的業務,使用 ws 不如使用 http 輪訓來的簡單、實在。
ws 長連接的用戶收到消息是個 push 操作,http 輪訓用戶收消息是 pull 操作,push 都存在單生產推多消費,為廣播模型,怎么處理好連接,保障每個消費推且只推一次,很多程序員這個問題不一定能夠解決。
pull 就不一樣了,消費方想要你就來生產方拉一下,拉幾次,消息就准確的送達幾次,不存在多消費和連接處理的問題,缺點當然就是消息推送的不及時,優點非常明顯,簡單易實現。
websocket 當然也不是樓主說的沒有用,企業內部業務系統之間有時候用 http 協議,又想要消息及時推送,上個 mq 太粗暴,用 grpc 這些支持雙向流的 rpc 協議太復雜,此時 ws 就非常好使了。
websocket 很多坑,如果只是單頁面還好,涉及到多頁面,定時推送,復雜的推送,就非常容易出問題了,不管是前端,還是服務端都會遇到很多很多問題
一般有實時數據要求的會考慮 websocket
一、websocket與http
WebSocket是HTML5中的協議,支持持久連接;而Http協議不支持持久連接。
首先HTMl5指的是一系列新的API,或者說新規范,新技術。
WebSocket是HTML5中新協議、新API.跟HTTP協議基本沒有關系。
Http協議本身只有1.0和1.1,也就是所謂的Keep-alive,把多個Http請求合並為一個。
二、Websocket是什么樣的協議,具體有什么優點
首先,Websocket是一個持久化的協議,相對於HTTP這種非持久的協議來說
HTTP的生命周期通過 Request 來界定,也就是一個 Request 一個 Response ,那么在 HTTP1.0 中,這次HTTP請求就結束了。
在HTTP1.1中進行了改進,使得有一個keep-alive,也就是說,在一個HTTP連接中,可以發送多個Request,接收多個Response。但是請記住 Request = Response , 在HTTP中永遠是這樣,也就是說一個request只能有一個response。而且這個response也是被動的,不能主動發起。
三、Websocket的作用
(1)ajax輪詢
ajax輪詢的原理非常簡單,讓瀏覽器隔個幾秒就發送一次請求,詢問服務器是否有新信息。
(2)long poll(長輪詢)
long poll 其實原理跟 ajax輪詢 差不多,都是采用輪詢的方式,不過采取的是阻塞模型(一直打電話,沒收到就不掛電話),也就是說,客戶端發起連接后,如果沒消息,就一直不返回Response給客戶端(對於PHP有最大執行時間,建議沒消息,執行到一定時間也返回)。直到有消息才返回,返回完之后,客戶端再次建立連接,周而復始。
從上面可以看出其實這兩種方式,都是在不斷地建立HTTP連接,關閉HTTP協議,由於HTTP是非狀態性的,每次都要重新傳輸 identity info (鑒別信息),來告訴服務端你是誰。然后等待服務端處理,可以體現HTTP協議的另外一個特點,被動性。
何為被動性呢,其實就是,服務端不能主動聯系客戶端,只能有客戶端發起。從上面很容易看出來,不管怎么樣,上面這兩種都是非常消耗資源的。
ajax輪詢 需要服務器有很快的處理速度和資源。(速度)long poll 需要有很高的並發,也就是說同時接待客戶的能力。(場地大小)
(3)WebSocket
Websocket解決了HTTP的這幾個難題。首先,被動性,當服務器完成協議升級后(HTTP->Websocket),服務端就可以主動推送信息給客戶端啦。解決了上面同步有延遲的問題。
解決服務器上消耗資源的問題:其實我們所用的程序是要經過兩層代理的,即HTTP協議在Nginx等服務器的解析下,然后再傳送給相應的Handler(php等)來處理。簡單地說,我們有一個非常快速的 接線員(Nginx) ,他負責把問題轉交給相應的 客服(Handler) 。Websocket就解決了這樣一個難題,建立后,可以直接跟接線員建立持久連接,有信息的時候客服想辦法通知接線員,然后接線員在統一轉交給客戶。
由於Websocket只需要一次HTTP握手,所以說整個通訊過程是建立在一次連接/狀態中,也就避免了HTTP的非狀態性,服務端會一直知道你的信息,直到你關閉請求,這樣就解決了接線員要反復解析HTTP協議,還要查看identity info的信息。
目前唯一的問題是:不兼容低版本的IE