http流式返回

  1. HTTP流式返回(Stream)是一種服務器向客戶端傳輸數據的方式允許數據分塊發送而不是一次性發送完畢。
    這樣客戶端可以在接收到第一部分數據時就開始處理,而不必等待整個響應完成。

  2. 應用場景:
    2.1 業務場景:圖表的監聽(股票行情);體育比分;ota升級進度條;chartgpt聊天消息返回
    2.2 開發場景:視頻流,文件的下載

  3. 分塊傳輸的具體過程
    3.1 客戶端請求數據:客戶端向服務器發送HTTP請求。
    3.2 服務器響應頭:服務器發送響應頭,其中包含Transfer-Encoding: chunked,表明將使用分塊傳輸編碼。
    3.3 發送數據塊:數據分塊并依次發送每個塊
    3.4 結束塊:所有數據塊發送完后,服務器發送一個大小為0的結束塊,表示數據傳輸完成。

  4. 客戶端處理步驟
    4.1 讀取響應頭:客戶端首先讀取響應頭(Transfer-Encoding: chunked),了解使用了分塊傳輸編碼。
    4.2 逐塊處理數據:客戶端依次讀取每個塊的大小和數據內容,并進行處理。處理完一個塊后,繼續讀取下一個塊,直到讀取到大小為0的結束塊。

  5. 流式返回工作原理:
    5.1 塊大小:每個數據塊的大小以十六進制數表示,后跟一個回車換行(CRLF,·\r\n’)。
    5.2 數據塊:實際的數據塊(以二進制形式傳輸)。
    5.3 終止塊:最后一個數據塊大小為0(‘01r\n\z\n’),表示數據傳輸結束。

ps:HTTP流式返回(也稱為分塊傳輸編碼,chunked transfer encoding)實際上是通過十六進制表示塊的大小,然后傳輸實際數據塊的二進制內容。因此,流式返回的數據塊以二進制形式傳輸,但每個數據塊的大小通過十六進制來表示。

  1. 優點:
    6.1 實時性:流式返回允許客戶端在接收到部分數據時就開始處理,減少了等待時間。
    6.2 減少內存消耗:服務器不需要一次性準備所有數據,適用于大數據量的傳輸。
    6.3 節省帶寬:僅在有數據更新時傳輸,避免不必要的開銷。

  2. 缺點:
    7.1 丟包和重傳:在網絡不穩定的情況下,數據塊可能會丟失或損壞,導致數據不完整。雖然可以通過重傳機制解決,但這增加了實現的復雜度和系統的負擔。
    7.2 瀏覽器兼容性:并非所有瀏覽器都完美支持流式返回,尤其是一些老舊的瀏覽器,可能無法正確處理分塊傳輸編碼(Chunked Transfer Encoding)或Fetch API中的流處理。

  3. 常見問題:
    8.1 實時聊天應用:如果網絡不穩定,可能導致消息丟常見問題,需要復雜的錯誤處理和重傳機制
    8.2大文件下載:如果網絡中斷,文件下載可能不完整,需要支持斷點續傳功能。

  4. 常見優化方案:
    9.1 錯誤處理和重傳:實現可靠的錯誤檢測和重傳機制,確保數據的完整性和正確性。
    9.2 優化連接管理:使用高效的連接管理和負載均衡技術,減少長時間連接對服務器資源的占用。
    9.3 客戶端處理優化:在客戶端實現高效的數據塊拼接和解析邏輯,確保數據處理的順序和正確性。

  5. 前端代碼示例:

// app/api/streaming/route.js
const story = ["李焊玲是一個女漢子。","她力大無窮,","喜歡挑戰各種極限運動。","有一天,","她決定去攀登一座險峻的高山。","在山腳下,","她遇到了一群正準備放棄的登山者。","李焊玲鼓勵他們,","說,","只要堅持,","沒有什么是不可能的。","于是,","她帶領這群登山者一起向山頂進發。","一路上,","她用自己的力量幫助大家克服各種困難,","大家都被她的勇氣和毅力所感染。","最終,","在李焊玲的帶領下,","他們成功登上了山頂。","大家歡呼雀躍,","李焊玲卻笑著說,","這只是人生中的一個小挑戰,","未來還有更多的冒險等著我們。","從那以后,","李焊玲的故事在登山者中廣為流傳,","她成為了大家心目中的英雄。"
];export async function GET(request) {const readable = new ReadableStream({async start(controller) {// 第一塊數據// controller.enqueue("\n");// 模擬延遲并逐步發送數據塊const encoder = new TextEncoder();for (let i = 0; i < story.length; i++) {await new Promise((resolve) => setTimeout(resolve, story[i].length*50));controller.enqueue(encoder.encode(`${story[i]} \n`));}// 關閉流controller.close();},});return new Response(readable, {headers: {"Content-Type": "text/plain","Transfer-Encoding": "chunked",},});
}

PS:

ReadableStreamTransformStream 是 JavaScript 中用于處理流數據的接口。

ReadableStream

ReadableStream 用于從源讀取數據,可以異步地獲取數據。例如,可以用來讀取文件、網絡請求等。以下是一個基本的示例:

const readableStream = new ReadableStream({start(controller) {// 初始化數據controller.enqueue('Hello, ');controller.enqueue('World!');controller.close();},pull(controller) {// 當 consumer 請求更多數據時調用},cancel(reason) {// 當 consumer 取消讀取時調用console.log('Stream cancelled, reason:', reason);}
});const reader = readableStream.getReader();reader.read().then(function processText({ done, value }) {if (done) {console.log('Stream complete');return;}console.log(value);return reader.read().then(processText);
});

TransformStream

TransformStream 用于對流數據進行轉換。它接受一個輸入流,并產生一個輸出流。以下是一個簡單的示例:

const transformStream = new TransformStream({start(controller) {// 初始化},transform(chunk, controller) {// 對每個數據塊進行處理controller.enqueue(chunk.toUpperCase());},flush(controller) {// 在流結束時處理剩余的數據console.log('All chunks transformed.');}
});const readable = new ReadableStream({start(controller) {controller.enqueue('Hello, ');controller.enqueue('world!');controller.close();}
});const writable = new WritableStream({write(chunk) {console.log(chunk);},close() {console.log('All data written.');}
});readable.pipeThrough(transformStream).pipeTo(writable);

以上示例展示了如何創建一個 ReadableStream 以及如何使用 TransformStream 對數據進行轉換,然后通過 pipeThrough 將轉換后的數據傳輸到一個 WritableStream

這兩個接口可以非常靈活地處理流數據,適用于許多異步數據處理場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14508.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14508.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14508.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手動安裝maven依賴到本地倉庫

使用mvn install命令安裝jar包到指定的倉庫。 命令如下&#xff1a; mvn install:install-file -Dmaven.repo.localC:\Users\liyong.m2\repository -DgroupIdcom.aspose -DartifactIdwords -Dversion18.4 -Dpackagingjar -DfileC:\Users\liyong\Desktop\jar\words-18.4.jar 解釋…

grafana + Prometheus + node-exporter + pushgateway + alertmanager的監控解決方案

業內比較著名的監控解決方案&#xff0c;據筆者所知&#xff0c;大概是三套&#xff1a; 一個是zabbix的解決方案&#xff0c;一個是prometheusgrafana&#xff0c;一個是ELK zabbix比較重&#xff0c;而且原生支持監控SNMP&#xff0c;自帶一個儀表盤&#xff0c;不需要額外…

docker redis 持久化

1、拉取redis鏡像 docker pull redis:latest 2、 mkdir /data/redis 3、填充redis.conf文件及根據需求修改相應的配置 ?通過官網地址找到對應版本的配置文件 ?將配置信息復制到redis.conf中 ?常見的修改配置 https://redis.io/docs/latest/operate/oss_and_stack/managem…

高仿果汁導航模板

參考原文&#xff1a;果汁導航風格模板_1234FCOM專注游戲工具及源碼例子分享 極速云

sdut pta 鏈表3(優化)-----7-3 sdut-C語言實驗-鏈表的結點插入

7-3 sdut-C語言實驗-鏈表的結點插入 分數 20 全屏瀏覽 切換布局 作者 馬新娟 單位 山東理工大學 給出一個只有頭指針的鏈表和 n 次操作&#xff0c;每次操作為在鏈表的第 m 個元素后面插入一個新元素x。若m 大于鏈表的元素總數則將x放在鏈表的最后。 輸入格式: 多組輸入。…

基于springboot的畢業設計系統的開發源碼

風定落花生&#xff0c;歌聲逐流水&#xff0c;大家好我是風歌&#xff0c;混跡在java圈的辛苦碼農。今天要和大家聊的是一款基于springboot的畢業設計系統的開發。項目源碼以及部署相關請聯系風歌&#xff0c;文末附上聯系信息 。 項目簡介&#xff1a; 畢業設計系統能夠實現…

學習通高分免費刷課實操教程

文章目錄 概要整體架構流程詳細步驟云上全平臺登錄步驟小結 概要 我之前提到過一個通過瀏覽器的三個腳本就可以免費高分刷課的文章&#xff0c;由于不方便拍視頻進行實操演示&#xff0c;然后寫下了這個實操教程&#xff0c;之前的三個腳本劃到文章末尾 整體架構流程 整體大…

窗口函數 | rows between …… and ……

ROWS BETWEEN ... AND ... 是 SQL 窗口函數中的一個子句&#xff0c;用于定義窗口函數操作的行范圍。窗口函數允許用戶對一組相關的記錄執行計算&#xff0c;這些記錄被稱為窗口。 基本語法 <窗口函數> OVER ( [PARTITION BY <列名>] ORDER BY <列名> [AS…

前端基礎入門三大核心之HTML篇 —— SVG的viewBox、width和height:繪制矢量圖的魔法比例尺【含代碼示例】

前端基礎入門三大核心之HTML篇 —— SVG的viewBox、width和height&#xff1a;繪制矢量圖的魔法比例尺【含代碼示例】 基本概念與作用viewBoxwidth和height 代碼示例與實踐基礎示例動態調整示例 不同角度的使用思路保持比例縮放自動適應容器 實際問題與解決方案結語與討論 在前…

華為云之Zabbix監控平臺部署實踐

華為云之Zabbix監控平臺部署實踐 一、本次實踐介紹1.1 實踐環境簡介1.3 本次實踐完成目標 二、 相關服務介紹2.1 華為云ECS云服務器介紹2.2 Zabbix介紹 三、環境準備工作3.1 預置實驗環境3.2 查看預置環境信息 四、登錄華為云4.1 登錄華為云4.2 查看ECS狀態4.3 連接ECS彈性云服…

力扣HOT100 - 287. 尋找重復數

解題思路&#xff1a; 快慢指針 第一步&#xff0c;慢指針每次移動一步&#xff0c;快指針每次移動兩步&#xff0c;直到它們相遇。這一步保證了它們在環中相遇。 接下來&#xff0c;將其中一個指針&#xff08;快指針或慢指針&#xff09;重置到起點&#xff08;即數組的第一…

SpringBoot實現郵箱驗證碼

自行創建一個SpringBoot項目 導入SpringBoot所需要的郵箱驗證碼的包 <!--郵件發送--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>2.6.1</version>…

前后端部署筆記

windows版&#xff1a; 如果傻唄公司讓用win電腦部署&#xff0c;類似于我們使用筆記本做局域網服務器&#xff0c;社內使用。 1.安裝win版的nginx、mysql、node、jdk等 2.nginx開機自啟參考Nginx配置及開機自啟動&#xff08;Windows環境&#xff09;_nginx開機自啟動 wind…

UPPAAL使用方法

UPPAAL使用方法 由于剛開始學習時間自動機及其使用方法&#xff0c;對UPPAAL使用不太熟悉&#xff0c;網上能找到的教程很少&#xff0c;摸索了很久終于成功實現一個小例子&#xff0c;所以記錄一下詳細教程。 這里用到的例子參考【UPPAAL學習筆記】1&#xff1a;基本使用示例…

專業級潤滑油,一站式批發服務

要為機械設備提供持久穩定的動力保障嗎&#xff1f;選擇我們的專業級潤滑油&#xff0c;讓您的設備運轉更順暢&#xff0c;效率更高。 我們專業從事潤滑油批發多年&#xff0c;以優質的產品、合理的價格和完善的服務贏得了廣大客戶的信賴。無論是汽車、機械還是工業設備&#x…

【Vue3】env環境變量的配置和使用(區分cli和vite)

原文作者&#xff1a;我輩李想 版權聲明&#xff1a;文章原創&#xff0c;轉載時請務必加上原文超鏈接、作者信息和本聲明。 文章目錄 前言一、env文件二、vue3cli加載env1..env配置2..dev配置&#xff08;其他環境參考&#xff09;3.package.json文件4.使用 三、vue3vite加載e…

【html5】03-新表單元素及屬性

目錄 1 引言 2 智能表單控件-type 3 表單屬性 form input 5 答疑--解決required自定義提示信息 1 引言 HTML5引入了一系列新的表單輸入類型&#xff0c;如email、url、number、range、date、time、datetime-local、month、week、search、color和tel等。這些新類型增強了表…

FFmpeg源碼:bytestream_get_byte函數解析

一、引言 FFmpeg源碼中經常使用到bytestream_get_byte這個函數&#xff0c;比如使用FFmpeg對BMP圖片進行解析&#xff0c;其源碼會調用函數bmp_decode_frame&#xff0c;而該函數內部會通過bytestream_get_byte讀取BMP 的header。本文講解函數bytestream_get_byte的作用和內部…

Spark SQL 中DataFrame DSL的使用

在上一篇文章中已經大致說明了DataFrame APi,下面我們具體介紹DataFrame DSL的使用。DataFrame DSL是一種命令式編寫Spark SQL的方式&#xff0c;使用的是一種類sql的風格語法。 文章鏈接&#xff1a; 一、單詞統計案例引入 import org.apache.spark.sql.{DataFrame, SaveMod…

在SpringBoot中添加自定義增強SpringEvent事件組件

場景說明&#xff1a;在使用SpringBoot時&#xff0c;總是要添加一大堆自定義事件&#xff0c;實現ApplicationEvent&#xff0c;來實現事件發送。 這樣寫代碼量非常大。為了方便和避免出錯&#xff0c;封裝自定義的模塊&#xff0c;快速實現泛型中調用SpringEvent實現事件。省…