亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringAI流式輸出的底層實現(xiàn)原理解析

 更新時間:2025年04月24日 08:48:19   作者:磊哥  
在 Spring AI 中,流式輸出(Streaming Output)是一種逐步返回 AI 模型生成結果的技術,允許服務器將響應內容分批次實時傳輸給客戶端,而不是等待全部內容生成完畢后再一次性返回,這篇文章主要介紹了SpringAI流式輸出的底層實現(xiàn),需要的朋友可以參考下

在 Spring AI 中,流式輸出(Streaming Output)是一種逐步返回 AI 模型生成結果的技術,允許服務器將響應內容分批次實時傳輸給客戶端,而不是等待全部內容生成完畢后再一次性返回。

這種機制能顯著提升用戶體驗,尤其適用于大模型響應較慢的場景(如生成長文本或復雜推理結果)。

技術實現(xiàn)

在 Spring AI 中流式輸出的實現(xiàn)有以下兩種方式:

  • 通過 ChatModel 實現(xiàn)流式輸出。
  • 通過 ChatClient 實現(xiàn)流式輸出。

ChatModel 流式輸出

Spring AI 中的流式輸出實現(xiàn)非常簡單,使用 ChatModel 中的 stream 即可實現(xiàn):

@RequestMapping(value = "/streamChat", produces = "text/event-stream")
public Flux<String> streamChat(@RequestParam(value = "msg") String msg) {
    return chatModel.stream(msg);
}

ChatClient 流式輸出

ChatClient 流式輸出實現(xiàn)也很簡單,也是調用 stream().content() 返回 Flux 對象即可:

@RequestMapping("/stream")
public Flux<String> stream(String question) {
    return chatClient.prompt(question)
            .stream()
            .content();
}

底層實現(xiàn)

那么問題來了流式輸出的底層實現(xiàn)究竟是啥呢?

根據(jù)以往的經驗我們知道,流式輸出的實現(xiàn)技術基本有兩種:

  • Spring MVC(Servlet)+ SSE 實現(xiàn)流式輸出。
  • Spring WebFlux Reactor 模型實現(xiàn)流式輸出。

SSE 介紹

SSE(Server-Sent Events)是一種允許服務器向瀏覽器或其他客戶端推送實時更新的技術。它是一種單向通信機制,服務器可以主動向客戶端發(fā)送數(shù)據(jù),而客戶端無需頻繁輪詢服務器請求數(shù)據(jù)。SSE 是基于 HTTP 協(xié)議的,使用標準的 text/event-stream MIME 類型來傳輸數(shù)據(jù)。

SSE 主要特點

  • 單向通信:SSE 僅支持服務器到客戶端的單向通信,客戶端不能向服務器發(fā)送消息。如果需要雙向通信,可以結合 WebSocket 或其他技術。
  • 基于 HTTP:SSE 使用標準的 HTTP 協(xié)議,不需要額外的協(xié)議支持,因此兼容性較好。
  • 自動重連:客戶端在連接中斷后會自動嘗試重新連接。
  • 數(shù)據(jù)格式:SSE 數(shù)據(jù)以特定的格式發(fā)送,每條消息以 data: 開頭,以兩個換行符 \n\n 結尾。
  • 事件類型:可以為每條消息指定事件類型,客戶端可以通過監(jiān)聽特定事件類型來處理不同的消息。

Spring MVC(Spring Web)底層是基于 Servlet 實現(xiàn)的,它是使用 SseEmitter 技術實現(xiàn) SSE 協(xié)議實現(xiàn)流式輸出的。

SseEmitter 基本用法

這里提供一個 SseEmitter 的簡單使用案例,實現(xiàn)流式輸出,讓大家更好的理解這個技術點:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
@RestController
public class SseDemoController {
    @GetMapping(value = "/sse-demo", produces = "text/event-stream")
    public SseEmitter streamData() {
        // 設置超時時間(單位:毫秒)
        SseEmitter emitter = new SseEmitter(30_000L); // 30秒超時
        // 異步任務模擬流式輸出
        new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    String message = "第 " + i + " 條消息";
                    emitter.send(message);
                    Thread.sleep(1000); // 每秒發(fā)送一次
                }
                emitter.complete(); // 完成推送
            } catch (IOException | InterruptedException e) {
                emitter.completeWithError(e); // 異常處理
            }
        }).start();
        return emitter;
    }
}

Spring WebFlux 介紹

Spring WebFlux 是 Spring Framework 5 引入的響應式 Web 框架,旨在解決高并發(fā)場景下傳統(tǒng)同步阻塞模型(如 Spring MVC)的性能瓶頸。其核心目標是通過非阻塞異步編程模型提升系統(tǒng)吞吐量,適用于 I/O 密集型任務(如微服務通信、實時數(shù)據(jù)流處理)。

Spring WebFlux 與 Spring MVC 不同,它基于 Reactive Streams 規(guī)范實現(xiàn)的,支持背壓機制(Backpressure),防止數(shù)據(jù)生產者壓垮消費者。

背壓機制:通過訂閱者主動控制數(shù)據(jù)流速,避免內存溢出。例如,消費者可動態(tài)調整請求量,生產者根據(jù)反饋調整數(shù)據(jù)生成速度.

Spring AI 流式輸出

說完了前置知識,咱們回到主題:Spring AI 是如何實現(xiàn)流式輸出的?

要搞清楚這個問題,我們需要看流式輸出對象 Flux 的實現(xiàn)源碼:

查看 Flux 源碼我們發(fā)現(xiàn)它是屬于 reactor.core.publisher 包下的抽象類:

并且看類注釋和類所在的 jar 包我們就明白了:

Spring AI 中的流式輸出是通過 Reactor Streams 模型實現(xiàn)的,和 Spring WebFlux 的底層實現(xiàn)是一樣的技術。

具體執(zhí)行流程:Reactor Streams 會訂閱數(shù)據(jù)源,當有數(shù)據(jù)時,Reactor Streams 以分塊流的方式發(fā)送給客戶端(用戶)。

Reactor 介紹

Reactor 是一種事件驅動的高性能網絡編程模型,主要用于處理高并發(fā)的網絡 I/O 請求。其核心思想是通過一個或多個線程監(jiān)聽事件,并將事件分發(fā)給相應的處理程序,從而實現(xiàn)高效的并發(fā)處理。

Reactor 模型的主要特征如下:

  • 事件驅動:所有 I/O 操作都由事件觸發(fā)并處理。
  • 非阻塞:操作不會因為 I/O 而掛起,避免了線程等待的開銷。
  • 高效資源利用:通過少量線程處理大量并發(fā)連接,提升性能。
  • 組件分離:將事件監(jiān)聽(Reactor)、事件分發(fā)(Dispatcher)和事件處理(Handler)解耦,使代碼結構更清晰。

Reactor 實現(xiàn)方式有三種:

  • 單線程 Reactor 模型:所有操作在一個線程完成,適用于低并發(fā)場景。
  • 多線程 Reactor 模型:主線程處理連接,子線程池處理 I/O 和業(yè)務。
  • 主從 Reactor 模型:主線程池處理連接,子線程池處理 I/O(進一步優(yōu)化資源分配)。

生產級別使用的 Reactor 基本都是主從 Reactor 模型,它的執(zhí)行流程如下:

小結

Spring AI 中的流式輸出有兩種實現(xiàn),而通過查看這兩種流式輸出的實現(xiàn)源碼可知,Spring AI 中的流式輸出是通過 Reactor Streams 技術實現(xiàn)的,當客戶端發(fā)送請求時,會建立連接并訂閱數(shù)據(jù)源,當有數(shù)據(jù)時,Reactor Streams 以分塊流的方式發(fā)送給客戶端(用戶)。

到此這篇關于SpringAI流式輸出的底層實現(xiàn)原理解析的文章就介紹到這了,更多相關SpringAI流式輸出內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Boot 實現(xiàn)程序的優(yōu)雅退出(詳細步驟)

    Spring Boot 實現(xiàn)程序的優(yōu)雅退出(詳細步驟)

    Spring Boot 為我們提供了優(yōu)雅退出的功能,使應用程序能夠在關閉時正常處理完所有當前請求,避免請求被中斷導致數(shù)據(jù)丟失或不一致等問題,本文將全面介紹如何在 Spring Boot 應用程序中實現(xiàn)優(yōu)雅退出,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 最常用的1000個Java類(附代碼示例)

    最常用的1000個Java類(附代碼示例)

    這篇文章主要介紹了最常用的1000個Java類(附代碼示例),需要的朋友可以參考下
    2015-04-04
  • 基于Spring Cloud Zookeeper實現(xiàn)服務注冊與發(fā)現(xiàn)

    基于Spring Cloud Zookeeper實現(xiàn)服務注冊與發(fā)現(xiàn)

    這篇文章主要介紹了基于Spring Cloud Zookeeper實現(xiàn)服務注冊與發(fā)現(xiàn),幫助大家更好的理解和學習spring框架,感興趣的朋友可以了解下
    2020-11-11
  • SpringBoot下獲取resources目錄下文件的常用方法

    SpringBoot下獲取resources目錄下文件的常用方法

    本文詳細介紹了SpringBoot獲取resources目錄下文件的常用方法,包括使用this.getClass()方法、ClassPathResource獲取以及hutool工具類ResourceUtil獲取,感興趣的可以了解一下
    2024-10-10
  • 淺談Java并發(fā)之同步器設計

    淺談Java并發(fā)之同步器設計

    這篇文章主要介紹Java并發(fā)之同步器設計,本文以記錄方式并發(fā)編程中同步器設計的一些共性特征。并簡單介紹了Java中的AQS,需要的朋友可以參考一下文章的詳細內容
    2021-10-10
  • SpringBoot開啟異步調用方法

    SpringBoot開啟異步調用方法

    這篇文章主要為大家詳細介紹了SpringBoot開啟異步調用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • SpringBoot實現(xiàn)redis緩存菜單列表

    SpringBoot實現(xiàn)redis緩存菜單列表

    本文主要介紹了SpringBoot實現(xiàn)redis緩存菜單列表,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringAOP 構造注入的實現(xiàn)步驟

    SpringAOP 構造注入的實現(xiàn)步驟

    這篇文章主要介紹了SpringAOP_構造注入的實現(xiàn)步驟,幫助大家更好的理解和學習使用spring框架,感興趣的朋友可以了解下
    2021-05-05
  • java線程池實戰(zhàn)應用步驟詳解

    java線程池實戰(zhàn)應用步驟詳解

    這篇文章主要介紹了java線程池實戰(zhàn)應用小結,包括線程池的創(chuàng)建方式,本文給大家分享兩種方式,結合實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2025-04-04
  • Mybatis多參數(shù)及實體對象傳遞實例講解

    Mybatis多參數(shù)及實體對象傳遞實例講解

    在使用Mybatis的時候,經常會有各種各樣的參數(shù)傳遞,不同類型,不同個數(shù)的參數(shù),下面小編通過例子給大家講解下Mybatis多參數(shù)及實體對象傳遞,一起看看吧
    2016-12-12

最新評論