首頁 常見問題 SSE 與 WebSocket

SSE 與 WebSocket

Apr 17, 2024 pm 02:18 PM
python websocket sse

在本文中,我們將比較伺服器發送事件(SSE)和 WebSocket,兩者都是用來傳遞資料的可靠方法。我們將在八個方面對它們進行分析,包括通訊方向、底層協定、安全性、易用性、效能、訊息結構、易用性和測試工具。這些方面的比較總結如下:類別伺服器發送事件(SSE)WebSocket通訊方向單向雙向底層協定HTTPWebSocket 協定安全性與HTTP 相同存在安全漏洞易用性設定簡單設定複雜效能訊息傳送速度快受訊息處理和連線管理影響訊息結構純文字文字或二元易用性廣泛可用對WebSocket 整合有需求測試工具使用Postman 和集合使用JMeter、Gadling、sse-perf、Testable 或k6

SSE 與 WebSocket

#在今天的文章中,我想仔細研究一下伺服器發送事件(簡稱SSE)和WebSocket。兩者都是經過實務檢驗的良好資料交換方法。

SSE 與 WebSockets 圖像

我將從這兩個工具的簡短特徵開始——它們是什麼以及它們提供什麼。然後,我將根據八個類別對它們進行比較,在我看來,這對現代系統來說是最重要的。

類別如下:

  • 溝通方向

  • #底層協定

  • ## 安全

  • 簡單

  • 表現

  • #訊息結構

  • 易於採用

  • 工裝

與我之前比較REST 和gRPC 的比較相比,我不會宣布每個類別有任何獲勝者或授予分數。相反,在摘要段落中,您會發現一種 TL;DR 表。此表包含兩種技術在上述領域的主要差異。

為什麼

與 REST 不同,SSE 和 WebSocket 都更注重用例。在這個特定的情況下(或多個情況),這兩個概念的主要焦點是提供「即時」通訊媒介。由於其特定的重點,它們不如 REST 受歡迎,REST 是一種更通用且一刀切的工具。

儘管如此,SSE 和 WebSocket 都提供了一系列有趣的可能性,並且與解決問題的經典 REST 方法相比略有更新。

在我看來,了解它們並在我們的工具箱中為它們找到一些空間是件好事,因為有一天它們可能會派上用場,為您提供一個更簡單的解決方案來解決相當複雜的問題- 特別是當您需要“真正的” -時間”更新或當您的應用程序需要更加面向推送的方法時。

除了在這裡對它們進行比較和描述之外,我還想讓它們更受歡迎。伺服器和客戶端之間提供雙向通訊。 Unicode 文字。 TCP。 TLS 進行保護

wss - 指示連接受TLS 保護

此外,不應該從安全站點(https) 開啟非安全性WebSocket 連線( ws)。 HTTP 概念。 CSRF的攻擊變得更加容易。 5 規範的一部分,與WebSocket 類似,利用單一長期HTTP 連接「即時」發送資料。 2006 年實作了第一個實作SSE 的方法。它還可以充分利用 HTTP/2,這消除了 SSE 的最大問題之一,實際上消除了由HTTP/1.1。

根據定義,伺服器發送事件有兩個基本構建塊:

  • EventSource - 基於WHATWG 規範並由瀏覽器實現的接口,它允許客戶端(在本例中為瀏覽器)訂閱事件。

  • 事件流- 一種協議,描述伺服器發送的事件的標準純文字格式,EventSource 用戶端必須遵循該格式才能理解和傳播它們。

根據規範,事件可以攜帶任意文字資料、可選 ID,並由換行符號分隔。他們甚至有自己獨特的MIME 類型:text/event-stream.

不幸的是,伺服器發送事件作為一種技術被設計為僅支援基於文字的訊息,儘管我們可以使用自訂格式發送事件,但最終訊息必須是UTF-8 編碼的字串。

更重要的是,SSE 提供了兩個非常有趣的功能:

  • #自動重新連接- 如果客戶端意外斷開連接,EventSource 會定期嘗試重新連接。

  • 自動串流復原 - EventSource 會自動記住上次收到的訊息 ID,並在嘗試重新連線時自動傳送 Last-Event-ID 標頭。

比較

溝通方向

兩者之間最大的差異可能是他們的溝通方式。

  • SSE 僅提供單向通訊-事件只能從伺服器傳送到客戶端。

  • WebSockets 提供完整的雙向通信,使有興趣的各方能夠交換資訊並對雙方的任何事件做出反應。

我想說,這兩種方法都有其優點和缺點,而且每種方法都有一組專用的用例。

一方面,如果您只需要向客戶端推送持續更新的串流,那麼 SSE 將是更合適的選擇。另一方面,如果您需要以任何方式對其中一個事件做出反應,那麼 WebSocket 可能會更有利。

從理論上(和實踐)來看,所有可以用 SSE 完成的事情也可以用 WebSocket 完成,但是我們正在進入支持、解決方案的簡單性或安全性等領域。

我將在下面的段落中描述所有這些領域以及更多內容。此外,在所有情況下使用 WebSocket 都可能是一種嚴重的矯枉過正,而基於 SSE 的解決方案可能更容易實現。

底層協定

這是兩種技術之間的另一個巨大差異。

  • SSE 完全依賴 HTTP,並且支援 HTTP/1.1 和 HTTP/2。

  • 相比之下,WebSocket 使用自己的自訂協定——令人驚訝的是——WebSocket 協定。

就 SSE 而言,利用 HTTP/2 解決了 SSE 的主要問題之一—最大並行連線限制。 HTTP/1.1 根據其規格限制了並行連線的數量。

此行為可能會導致稱為隊頭阻塞的問題。 HTTP/2 透過引入多路復用解決了這個問題,從而解決了應用層的 HOL 阻塞。然而,隊頭阻塞仍然可能發生在 TCP 層級。

關於WebSocket協議,我在上面幾行已經詳細提到過。在這裡,我只是重申最重要的幾點。儘管使用 HTTP 升級標頭來初始化 WebSocket 連接並有效地更改通訊協議,但該協議與經典 HTTP 略有不同。

儘管如此,它也使用 TCP 協定作為基礎,並且與 HTTP 完全相容。 WebSocket協定最大的缺點是它的安全性。

簡單

一般來說,設定基於 SSE 的整合比其 WebSocket 整合更簡單。背後最重要的原因是特定技術所利用的通訊的本質。

SSE 的單向方式及其推送模型使其在概念層面上變得更容易。將其與開箱即用的自動重新連接和流連續性支援相結合,我們需要處理的事情顯著減少。

憑藉所有這些功能,SSE 也可以被視為減少客戶端和伺服器之間耦合的一種方法。客戶端只需要知道產生事件的端點即可。

然而,在這種情況下,客戶端只能接收訊息,因此如果我們想要將任何類型的信息發送回伺服器,我們需要另一種通訊介質,這可能會使事情變得非常複雜。

就 WebSocket 而言,情況有些複雜。首先,我們需要處理從HTTP協定到WebSockets協定的連線升級。儘管這是最簡單的事情,但這是我們需要記住的另一件事。

第二個問題來自 WebSocket 的雙向特性。我們必須管理特定連線的狀態並處理處理訊息時發生的所有可能的異常。例如,如果處理其中一則訊息在伺服器端引發異常怎麼辦?

接下來是處理重新連線的問題,對於 WebSockets,我們必須自己處理。

還有一個影響這兩種技術的問題——長時間運行的連接。

這兩種技術都需要維持長期的開放連結以發送連續的事件流。

管理此類連接(尤其是大規模連接)可能是一項挑戰,因為我們很快就會耗盡資源。此外,它們可能需要特殊配置,例如延長逾時,並且更容易遇到任何網路連線問題。

安全

#

就 SSE 而言,安全性沒有什麼特別之處,因為它使用普通的舊 HTTP 協定作為傳輸媒體。所有標準 HTTP 的優點和缺點都適用於 SSE,就這麼簡單。

另一方面,安全性是整個 WebSocket 協定的最大缺點之一。首先,不存在「同源策略」這樣的東西,因此對於我們想要透過 WebSocket 連線的位置沒有限制。

甚至還有一種旨在利用此漏洞的特定類型的攻擊,即跨源 WebSocket 劫持。如果您想更深入地了解同源策略和 WebSocket 主題,這裡有一篇您可能感興趣的文章。除此之外,WebSocket 中不存在特定於協定的安全漏洞。

我想說,在這兩種情況下,所有標準和最佳安全實踐都適用,因此在實施解決方案時要小心。

表現

我想說這兩種技術在性能方面是平等的。這兩種技術本身都不存在理論上的效能限制。

然而,我想說,就每秒發送的訊息數量而言,SSE 可以更快,因為它遵循即發即忘的原則。 WebSocket 還需要處理來自客戶端的回應。

唯一可以影響它們兩者效能的是我們在應用程式中使用的底層客戶端及其實作。檢查、閱讀文件、執行自訂壓力測試,您最終可能會對您正在使用的工具或整個系統有非常有趣的了解。

訊息結構

訊息結構可能是協定之間最重要的差異之一。

正如我上面提到的,SSE 是一個純文字協定。我們可以發送不同格式和內容的訊息,但最終一切都以 UTF-8 編碼的文字結束。不可能有複雜的格式或二進位資料。

另一方面,WebSocket 可以處理文字和二進位訊息。讓我們能夠發送圖像、音訊或只是常規文件。請記住,處理文件可能會產生很大的開銷。

易於採用

在這裡,這兩種技術處於非常相似的階段。從 SSE 的角度來看,有許多工具可以新增 WebSocket 和伺服器發送事件支援(客戶端和伺服器)。

大多數已建立的程式語言都有多個這樣的函式庫。無需贅述太多細節。我準備了表格,總結了基本庫,並添加了 WebSockets 和 SSE 支援。

爪哇:

    Spring SSE / WebSockets

    Quarkus SSE / WebSockets

Sdu:

##   # 像SSE / Web#SSE / Web

#    播放/ WebSockets

JavaScript

    事件來源

    Total.js SSE/WebSocekts

    Total.js SSE/WebSocekts

  

    小星星

    快速API

如您所看到的,如果我們想將SSE 或WebSockets 整合新增到我們的應用程式中,我們有很多成熟的選擇。當然,這只是從所有庫中挑選的一個很小的例子;還有更多。真正的問題可能是找到最適合您的特定用例的一種。

工裝

自動化測試

就我所知,SSE 或 WebSockets 都沒有自動化測試工具。但是,使用Postman和集合可以相對輕鬆地實現類似的功能。

Postman 支援伺服器發送事件和WebSockets。透過使用源自 Postman 集合的一些魔法,您可以準備一組測試來驗證端點的正確性。

效能測試

對於效能測試,您可以使用 JMeter 或 Gadling。據我所知,這是兩個最成熟的整體性能測試工具。當然,它們都也支援SSE(JMeter,Gadling)和WebSockets(JMeter,Gadling)。

還有其他工具,例如sse-perf(僅限 SSE)、Testable或k6(僅限 WebSockets)。

在所有這些工具中,我個人推薦 Gattle 或 k6。兩者似乎都具有最佳的用戶體驗並且最適合生產。

文件

在某種程度上,沒有專門用於記錄 SSE 或 WebSocket 的工具。另一方面,有一個名為AsyncAPI的工具,它可以以這種方式用於這兩個概念。

不幸的是,OpenAPI似乎不支援SSE 或 WebSockets。

概括

正如我所承諾的,總結將是快速而簡單的—請看下面。

SSE 與 WebSocketWebSockets 和 SSE 之間的比較表

我認為上表是主題和整篇文章的一個很好而緊湊的總結。

最重要的區別是通訊方向,因為它決定了特定技術的可能用例。它可能會對選擇其中一個產生最大的影響。

在選擇特定的通訊方式時,訊息結構也可能是非常重要的類別。僅允許純文字訊息是伺服器發送事件的一個非常重要的缺點。

以上是SSE 與 WebSocket的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

mysql 是否要付費 mysql 是否要付費 Apr 08, 2025 pm 05:36 PM

MySQL 有免費的社區版和收費的企業版。社區版可免費使用和修改,但支持有限,適合穩定性要求不高、技術能力強的應用。企業版提供全面商業支持,適合需要穩定可靠、高性能數據庫且願意為支持買單的應用。選擇版本時考慮的因素包括應用關鍵性、預算和技術技能。沒有完美的選項,只有最合適的方案,需根據具體情況謹慎選擇。

HadiDB:Python 中的輕量級、可水平擴展的數據庫 HadiDB:Python 中的輕量級、可水平擴展的數據庫 Apr 08, 2025 pm 06:12 PM

HadiDB:輕量級、高水平可擴展的Python數據庫HadiDB(hadidb)是一個用Python編寫的輕量級數據庫,具備高度水平的可擴展性。安裝HadiDB使用pip安裝:pipinstallhadidb用戶管理創建用戶:createuser()方法創建一個新用戶。 authentication()方法驗證用戶身份。 fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

Navicat查看MongoDB數據庫密碼的方法 Navicat查看MongoDB數據庫密碼的方法 Apr 08, 2025 pm 09:39 PM

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

mysql 需要互聯網嗎 mysql 需要互聯網嗎 Apr 08, 2025 pm 02:18 PM

MySQL 可在無需網絡連接的情況下運行,進行基本的數據存儲和管理。但是,對於與其他系統交互、遠程訪問或使用高級功能(如復制和集群)的情況,則需要網絡連接。此外,安全措施(如防火牆)、性能優化(選擇合適的網絡連接)和數據備份對於連接到互聯網的 MySQL 數據庫至關重要。

mysql 無法連接到本地主機怎麼解決 mysql 無法連接到本地主機怎麼解決 Apr 08, 2025 pm 02:24 PM

無法連接 MySQL 可能是由於以下原因:MySQL 服務未啟動、防火牆攔截連接、端口號錯誤、用戶名或密碼錯誤、my.cnf 中的監聽地址配置不當等。排查步驟包括:1. 檢查 MySQL 服務是否正在運行;2. 調整防火牆設置以允許 MySQL 監聽 3306 端口;3. 確認端口號與實際端口號一致;4. 檢查用戶名和密碼是否正確;5. 確保 my.cnf 中的 bind-address 設置正確。

mysql workbench 可以連接到 mariadb 嗎 mysql workbench 可以連接到 mariadb 嗎 Apr 08, 2025 pm 02:33 PM

MySQL Workbench 可以連接 MariaDB,前提是配置正確。首先選擇 "MariaDB" 作為連接器類型。在連接配置中,正確設置 HOST、PORT、USER、PASSWORD 和 DATABASE。測試連接時,檢查 MariaDB 服務是否啟動,用戶名和密碼是否正確,端口號是否正確,防火牆是否允許連接,以及數據庫是否存在。高級用法中,使用連接池技術優化性能。常見錯誤包括權限不足、網絡連接問題等,調試錯誤時仔細分析錯誤信息和使用調試工具。優化網絡配置可以提升性能

如何針對高負載應用程序優化 MySQL 性能? 如何針對高負載應用程序優化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

如何將 AWS Glue 爬網程序與 Amazon Athena 結合使用 如何將 AWS Glue 爬網程序與 Amazon Athena 結合使用 Apr 09, 2025 pm 03:09 PM

作為數據專業人員,您需要處理來自各種來源的大量數據。這可能會給數據管理和分析帶來挑戰。幸運的是,兩項 AWS 服務可以提供幫助:AWS Glue 和 Amazon Athena。