日韩欧美人妻无码精品白浆,夜夜嗨AV免费入口,国产欧美官网在线看,高校回应聋哑女生因长相完美被质疑

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

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

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

導(dǎo)讀

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

一、 前言

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

1. 輪詢的缺點(diǎn)

我們都知道輪詢的缺點(diǎn)有幾種:

資源浪費(fèi)

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

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

用戶體驗(yàn)

  • 界面卡頓:頻繁的請(qǐng)求和更新可能會(huì)造成用戶界面的卡頓,影響用戶體驗(yàn)。

2. websocket的缺點(diǎn)

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

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

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

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

  2. 適用場(chǎng)景

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

    • SSE 更適合單向數(shù)據(jù)推送的場(chǎng)景,如股票價(jià)格更新、新聞?dòng)嗛喌取?/p>

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

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

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

  4. 瀏覽器支持

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

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

    • WebSocket 連接需要更多的服務(wù)器資源來(lái)維護(hù),因?yàn)樗鼈兪侨p工的,服務(wù)器需要監(jiān)聽(tīng)來(lái)自客戶端的消息。

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

二、 詳細(xì)對(duì)比

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

以下是 WebSocket、輪詢和 SSE 的對(duì)比表格:

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

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

三、 SSE(Server-Sent Events)介紹

我們先來(lái)簡(jiǎn)單了解一下什么是Server-Sent Events ?

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

工作原理

  1. 建立連接

    • 客戶端通過(guò)一個(gè)普通的 HTTP 請(qǐng)求訂閱一個(gè) SSE 端點(diǎn)。

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

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

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

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

  3. 客戶端接收消息

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

  4. 連接管理

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

著名的計(jì)算機(jī)科學(xué)家林納斯·托瓦茲(Linus Torvalds) 曾經(jīng)說(shuō)過(guò):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) { // 無(wú)限循環(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請(qǐng)求,后續(xù)所有的返回結(jié)果都可以在event.data里面獲取,先不談性能,對(duì)于有強(qiáng)迫癥的同學(xué)是不是一個(gè)很大改善呢?

總結(jié)

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

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

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

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

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


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

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