Friday, July 12, 2019

OpenResty + nginx + redis + spring 如何達到高吞吐量伺服器的架構? (五) 使用openresty 打造 推送server

一開始本來打算使用 firebase. 去做推送server ,後來發現這項技術,在大陸地區訪問google 或是 其他服務是很有問題的xd
這邊我們才用websocket來實現
為什麼要用websocket?
传统HTTP客户端与服务器请求响应模式如下图所示:


WebSocket模式客户端与服务器请求响应模式如下图:



,接下來就是客製化細部微調羅

B/S結構的軟體項目中有時客戶端需要實時的獲得伺服器消息,但默認HTTP協議只支持請求響應模式,這樣做可以簡化Web伺服器,減少伺服器的負擔,加快響應速度,因為伺服器不需要與客戶端長時間建立一個通信連結,但不容易直接完成實時的消息推送功能,如聊天室、後台信息提示、實時更新數據等功能,但通過polling、Long polling、長連接、Flash Socket以及HTML5中定義的WebSocket能完成該功能需要。
一、Socket簡介
Socket又稱"套接字",應用程式通常通過"套接字"向網絡發出請求或者應答網絡請求。Socket的英文原義是「孔」或「插座」,作為UNIX的進程通信機制。Socket可以實現應用程式間網絡通信。



Socket可以使用TCP/IP協議或UDP協議。
TCP/IP協議
TCP/IP協議是目前應用最為廣泛的協議,是構成Internet國際網際網路協議的最為基礎的協議,由TCP和IP協議組成:
TCP協議:面向連接的、可靠的、基於字節流的傳輸層通信協議,負責數據的可靠性傳輸的問題。
IP協議:用於報文交換網絡的一種面向數據的協議,主要負責給每台網絡設備一個網絡地址,保證數據傳輸到正確的目的地。
UDP協議
UDP特點:無連接、不可靠、基於報文的傳輸層協議,優點是發送後不用管,速度比TCP快。
二、WebSocket簡介與消息推送
B/S架構的系統多使用HTTP協議,HTTP協議的特點:
1 無狀態協議
2 用於通過 Internet 發送請求消息和響應消息
3 使用埠接收和發送消息,默認為80埠
底層通信還是使用Socket完成。



HTTP協議決定了伺服器與客戶端之間的連接方式,無法直接實現消息推送(F5已壞),一些變相的���決辦法:
雙向通信與消息推送
輪詢:客戶端定時向伺服器發送Ajax請求,伺服器接到請求後馬上返迴響應信息並關閉連接。 優點:後端程序編寫比較容易。 缺點:請求中有大半是無用,浪費帶寬和伺服器資源。 實例:適於小型應用。
長輪詢:客戶端向伺服器發送Ajax請求,伺服器接到請求後hold住連接,直到有新消息才返迴響應信息並關閉連接,客戶端處理完響應信息後再向伺服器發送新的請求。 優點:在無消息的情況下不會頻繁的請求,耗費資小。 缺點:伺服器hold連接會消耗資源,返回數據順序無保證,難於管理維護。 Comet異步的ashx,實例:WebQQ、Hi網頁版、Facebook IM。
長連接:在頁面里嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設為對一個長連接的請求或是採用xhr請求,伺服器端就能源源不斷地往客戶端輸入數據。 優點:消息即時到達,不發無用請求;管理起來也相對便。 缺點:伺服器維護一個長連接會增加開銷。 實例:Gmail聊天
Flash Socket:在頁面中內嵌入一個使用了Socket類的 Flash 程序JavaScript通過調用此Flash程序提供的Socket接口與伺服器端的Socket接口進行通信,JavaScript在收到伺服器端傳送的信息後控制頁面的顯示。 優點:實現真正的即時通信,而不是偽即時。 缺點:客戶端必須安裝Flash插件;非HTTP協議,無法自動穿越防火牆。 實例:網絡互動遊戲。
Websocket:
WebSocket是HTML5開始提供的一種瀏覽器與伺服器間進行全雙工通訊的網絡技術。依靠這種技術可以實現客戶端和伺服器端的長連接,雙向實時通信。
特點:
事件驅動
異步
使用ws或者wss協議的客戶端socket
能夠實現真正意義上的推送功能
缺點:
少部分瀏覽器不支持,瀏覽器支持的程度與方式有區別。



websocket 打造推播


參考:https://kknews.cc/zh-tw/other/qvormg.html
作者:腾讯云技术社区
链接:https://www.zhihu.com/question/20215561/answer/157908509