亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【前端開發(fā)】WebSocket太笨重?試試SSE的輕量級魅力!

admin
2025年1月10日 15:34 本文熱度 1583

導(dǎo)讀

這篇文章主要介紹了在項目中發(fā)現(xiàn)的頻繁請求問題及解決方案。先指出輪詢的缺點,對比 WebSocket 與 SSE 的優(yōu)缺點,包括客戶端實現(xiàn)、適用場景等。接著詳細介紹 SSE 的工作原理、代碼示例及改造效果,最后總結(jié) SSE 有優(yōu)勢也有局限,選擇數(shù)據(jù)通信策略應(yīng)綜合考慮項目需求等因素。

一、 前言

在查看代碼以后發(fā)現(xiàn)這些頻繁的請求是因為我們的項目首頁有一個待辦任務(wù)數(shù)量和消息提醒數(shù)量的展示,所以之前的同事使用了定時器,每隔十秒鐘發(fā)送一次請求到后端接口拿數(shù)據(jù),這也就是我們常說的輪詢做法。

1. 輪詢的缺點

我們都知道輪詢的缺點有幾種:

資源浪費

  • 網(wǎng)絡(luò)帶寬:頻繁的請求可能導(dǎo)致不必要的網(wǎng)絡(luò)流量,增加帶寬消耗。

  • 服務(wù)器負載:每次請求都需要服務(wù)器處理,即使是空返回,也會增加服務(wù)器的CPU和內(nèi)存負載。

用戶體驗

  • 界面卡頓:頻繁的請求和更新可能會造成用戶界面的卡頓,影響用戶體驗。

2. websocket的缺點

那么有沒有替代輪詢的做法呢? 聰明的同學(xué)肯定會第一時間想到用websocket,但是在目前這個場景下我覺得使用websocket是顯得有些笨重。我從以下這幾方面對比:

  1. 客戶端實現(xiàn)

    • WebSocket 客戶端實現(xiàn)需要處理連接的建立、維護和關(guān)閉,以及可能的重連邏輯。

    • SSE 客戶端實現(xiàn)相對簡單,只需要處理接收數(shù)據(jù)和連接關(guān)閉。

  2. 適用場景

    • WebSocket 適用于需要雙向通信的場景,如聊天應(yīng)用、在線游戲等。

    • SSE 更適合單向數(shù)據(jù)推送的場景,如股票價格更新、新聞訂閱等。

  3. 實現(xiàn)復(fù)雜性

    • WebSocket 是一種全雙工通信協(xié)議,需要在客戶端和服務(wù)器之間建立一個持久的連接,這涉及到更多的編程復(fù)雜性。

    • SSE 是單向通信協(xié)議,實現(xiàn)起來相對簡單,只需要服務(wù)器向客戶端推送數(shù)據(jù)。

  4. 瀏覽器支持

    • 盡管現(xiàn)代瀏覽器普遍支持 WebSocket,但 SSE 的支持更為廣泛,包括一些較舊的瀏覽器版本。

  5. 服務(wù)器資源消耗

    • WebSocket 連接需要更多的服務(wù)器資源來維護,因為它們是全雙工的,服務(wù)器需要監(jiān)聽來自客戶端的消息。

    • SSE 連接通常是單向的,服務(wù)器只需要推送數(shù)據(jù),減少了資源消耗。

二、 詳細對比

對于這三者的詳細區(qū)別,你可以參考下面我總結(jié)的表格:

以下是 WebSocket、輪詢和 SSE 的對比表格:

特性WebSocket輪詢PollingServer-Sent Events (SSE)
定義全雙工通信協(xié)議,支持服務(wù)器和客戶端之間的雙向通信。客戶端定期向服務(wù)器發(fā)送請求以檢查更新。服務(wù)器向客戶端推送數(shù)據(jù)的單向通信協(xié)議。
實時性高,服務(wù)器可以主動推送數(shù)據(jù)。低,依賴客戶端定時請求。高,服務(wù)器可以主動推送數(shù)據(jù)。
開銷相對較高,需要建立和維護持久連接。較低,但頻繁請求可能導(dǎo)致高網(wǎng)絡(luò)和服務(wù)器開銷。相對較低,只需要一個HTTP連接,服務(wù)器推送數(shù)據(jù)。
瀏覽器支持現(xiàn)代瀏覽器支持,需要額外的庫來支持舊瀏覽器。所有瀏覽器支持。現(xiàn)代瀏覽器支持良好,舊瀏覽器可能需要polyfill。
實現(xiàn)復(fù)雜性高,需要處理連接的建立、維護和關(guān)閉。低,只需定期發(fā)送請求。中等,只需要處理服務(wù)器推送的數(shù)據(jù)。
數(shù)據(jù)格式支持二進制和文本數(shù)據(jù)。通常為JSON或XML。僅支持文本數(shù)據(jù),通常為JSON。
控制流客戶端和服務(wù)器都可以控制消息發(fā)送。客戶端控制請求發(fā)送頻率。服務(wù)器完全控制數(shù)據(jù)推送。
安全性需要wss://(WebSocket Secure)來保證安全。需要https://來保證請求的安全。需要SSE通過HTTPS提供,以保證數(shù)據(jù)傳輸?shù)陌踩?/td>
適用場景需要雙向交互的應(yīng)用,如聊天室、實時游戲。適用于更新頻率不高的場景,如輪詢郵箱。適用于服務(wù)器到客戶端的單向數(shù)據(jù)流,如股票價格更新。
跨域限制默認不支持跨域,需要服務(wù)器配置CORS。默認不支持跨域,需要服務(wù)器配置CORS。默認不支持跨域,需要服務(wù)器配置CORS。
重連機制客戶端可以實現(xiàn)自動重連邏輯。需要客戶端實現(xiàn)重連邏輯。客戶端可以監(jiān)聽連接關(guān)閉并嘗試重連。
服務(wù)器資源較高,因為需要維護持久連接。較低,但頻繁的請求可能增加服務(wù)器負擔(dān)。較低,只需要維護一個HTTP連接。

這個表格概括了 WebSocket、輪詢和 SSE 在不同特性上的主要對比點。每種技術(shù)都有其適用的場景和限制,選擇合適的技術(shù)需要根據(jù)具體的應(yīng)用需求來決定。

三、 SSE(Server-Sent Events)介紹

我們先來簡單了解一下什么是Server-Sent Events

Server-Sent Events (SSE) 是一種允許服務(wù)器主動向客戶端瀏覽器推送數(shù)據(jù)的技術(shù)。它基于 HTTP 協(xié)議,但與傳統(tǒng)的 HTTP 請求-響應(yīng)模式不同,SSE 允許服務(wù)器在建立連接后,通過一個持久的連接不斷地向客戶端發(fā)送消息。

工作原理

  1. 建立連接

    • 客戶端通過一個普通的 HTTP 請求訂閱一個 SSE 端點。

    • 服務(wù)器響應(yīng)這個請求,并保持連接打開,而不是像傳統(tǒng)的 HTTP 響應(yīng)那樣關(guān)閉連接。

  2. 服務(wù)器推送消息

    • 一旦服務(wù)器端有新數(shù)據(jù)可以發(fā)送,它就會通過這個持久的連接向客戶端發(fā)送一個事件。

    • 每個事件通常包含一個簡單的文本數(shù)據(jù)流,遵循特定的格式。

  3. 客戶端接收消息

    • 客戶端監(jiān)聽服務(wù)器發(fā)送的事件,并在收到新數(shù)據(jù)時觸發(fā)相應(yīng)的處理程序。

  4. 連接管理

    • 如果連接由于任何原因中斷,客戶端可以自動嘗試重新連接。

著名的計算機科學(xué)家林納斯·托瓦茲(Linus Torvalds) 曾經(jīng)說過:talk is cheap ,show me your code

我們直接上代碼看看效果:

java代碼

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import javax.servlet.http.HttpServletRequest;

import java.io.IOException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;


@RestController

@RequestMapping("platform/todo")

public class TodoSseController {

    private final ExecutorService executor = Executors.newCachedThreadPool();

    @GetMapping("/endpoint")

    public SseEmitter refresh(HttpServletRequest request) {

        final SseEmitter emitter = new SseEmitter(Long.MAX_VALUE);

        executor.execute(() -> {

            try {

                while (true) { // 無限循環(huán)發(fā)送事件,直到連接關(guān)閉

                   // 發(fā)送待辦數(shù)量更新

                    emitter.send(SseEmitter.event().data(5));

                    // 等待5秒

                    TimeUnit.SECONDS.sleep(5);

                }

            } catch (IOException e) {

                emitter.completeWithError(e);

            } catch (InterruptedException e) {

                // 當(dāng)前線程被中斷,結(jié)束連接

                Thread.currentThread().interrupt();

                emitter.complete();

            }

        });

        return emitter;

    }

}

前端代碼

beforeCreate() {

  const eventSource = new EventSource('/platform/todo/endpoint');

  eventSource.onmessage = (event) => {

    console.log("evebt:",event)

  };

  eventSource.onerror = (error) => {

    console.error('SSE error:', error);

    eventSource.close();

  };

  this.$once('hook:beforeDestroy', () => {

    if (eventSource) {

    eventSource.close();

  }

  });

},

改造后的效果

可以看到,客戶端只發(fā)送了一次http請求,后續(xù)所有的返回結(jié)果都可以在event.data里面獲取,先不談性能,對于有強迫癥的同學(xué)是不是一個很大改善呢?

總結(jié)

雖然 SSE(Server-Sent Events)因其簡單性和實時性在某些場景下提供了顯著的優(yōu)勢,比如在需要服務(wù)器向客戶端單向推送數(shù)據(jù)時,它能夠以較低的開銷維持一個輕量級的連接,但 SSE 也存在一些局限性。例如,它不支持二進制數(shù)據(jù)傳輸,這對于需要傳輸圖像、視頻或復(fù)雜數(shù)據(jù)結(jié)構(gòu)的應(yīng)用來說可能是一個限制。此外,SSE 只支持文本格式的數(shù)據(jù)流,這可能限制了其在某些數(shù)據(jù)傳輸場景下的應(yīng)用。還有,SSE 的兼容性雖然在現(xiàn)代瀏覽器中較好,但在一些舊版瀏覽器中可能需要額外的 polyfill 或者降級方案。

考慮到這些優(yōu)缺點,我們在選擇數(shù)據(jù)通信策略時,應(yīng)該基于項目的具體需求和上下文來做出決策。如果項目需要雙向通信或者傳輸二進制數(shù)據(jù),WebSocket 可能是更合適的選擇。

如果項目的數(shù)據(jù)更新頻率不高,或者只需要客戶端偶爾查詢服務(wù)器狀態(tài),傳統(tǒng)的輪詢可能就足夠了。

而對于需要服務(wù)器頻繁更新客戶端數(shù)據(jù)的場景,SSE 提供了一種高效的解決方案。

總之,選擇最合適的技術(shù)堆棧需要綜合考慮項目的需求、資源限制、用戶體驗和未來的可維護性。


作者:秋天的一陣風(fēng)
鏈接:https://juejin.cn/post/7451991754561880115
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

該文章在 2025/1/10 15:34:56 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved