SSE:Server Sent Event;服務器發送事件。
Server-Sent Events(SSE)是一種由服務器向客戶端推送實時數據的技術。它是構建基於事件的、服務器到客戶端的通信的一種方法,特別適用於需要實時更新和推送信息的應用場景,如實時通知、股票交易、實時遊戲狀態更新等。
SSE的工作原理是,一旦客戶端(通常是瀏覽器)與服務器建立連接,該連接會保持開放狀態,服務器就可以推送事件給客戶端,直到客戶端或服務器決定關閉它,而無需客戶端不斷地詢問服務器是否有新消息。這大大減少了網絡通信量,提高了應用程序的性能和響應速度。
從技術原理來看,其實就是事件的發佈訂閱。客戶端訂閱服務器端的事件數據;一旦服務器端數據就緒,封裝成事件推送到客戶端。
但從底層來分析,其實現依賴於底層協議與瀏覽器的支持。SSE的底層協議還是HTTP協議,以ChatGLM的請求爲例,請求頭中設置Accept:
返回的響應只有響應頭:
此時只是建立了連接;一旦服務端數據準備好了,將會推送事件消息給客戶端,基本的消息由以下幾部分組成:
- data:實際的消息數據;
- id:可選,消息的唯一標識符,用於在連接重新建立時同步消息;
- event:可選,定義事件類型,用於客戶端區分消息的類型;
- retry:可選,自動重連的時間(毫秒),如果連接中斷,客戶端在自動重新連接之前,需要等待多長時間;
每個消息要以兩個換行符(\n\n)結束。SSE返回示例數據如下:
id: 110
event: foo
data: Hello,
id: 111
event: foo
data: ,
id: 112
event: foo
data: world
id: 113
event: foo
data: !
標準的SSE返回內容是增量生成返回的,因此客戶端需要單獨處理合並內容塊。
ChatGPT等AI模型回覆消息時的 打字機 效果,其原理就是基於SSE協議實現的,只是在服務端做了處理,拼接了SSE每次返回的內容;前端直接展示效果就行。返回內容:
id: 110
event: foo
data: Hello,
id: 111
event: foo
data: Hello, world!
後端可以處理爲全量返回,如上,客戶端可以直接展示,不需要多餘的處理。
首發於個人公衆號