Springboot使用事件流调用大模型接口

什么是事件流

事件流(Event Stream) 是一种处理和传递事件的方式,通常用于系统中的异步消息传递或实时数据流。在事件驱动架构(Event-Driven Architecture)中,事件流扮演着至关重要的角色。

事件流的概念:

  1. 事件(Event)
    事件是指系统中的某个状态变更或者操作的发生。例如,用户点击按钮、订单创建、传感器检测到的温度变化等都可以视为事件。

  2. 事件流(Event Stream)
    事件流是指一系列有序的事件,这些事件按照时间顺序传输并可能被处理。事件流是一个数据流,它将事件按顺序传递给系统中的不同组件或服务。

  3. 流的特性

    • 时间序列:事件流通常按照时间顺序传递,也就是说,先发生的事件会先传递。
    • 异步性:事件流通常是异步的,意味着事件的生产者和消费者之间不一定同步工作,消费者可以在稍后的时间消费事件。
    • 连续性:事件流是一个连续的过程,事件会不断地产生并被处理。

事件流的应用场景:

  1. 日志流
    在现代分布式系统中,日志通常会以事件流的形式处理和传输。例如,系统的操作、错误或者状态变更会作为事件记录下来,并通过事件流传输到日志收集和分析系统中。

  2. 实时数据处理
    事件流在实时数据处理场景中非常重要,比如流式处理框架(例如Apache Kafka、Apache Flink等)就是用于处理不断产生的事件流。这些流可以表示实时的交易、用户活动、传感器数据等。

  3. 消息传递
    在消息队列系统中,消息也可以被视为事件流的一部分。生产者发布消息(事件),消费者接收并处理这些消息。

  4. 事件驱动架构(EDA)
    在事件驱动架构中,系统的各个组件通过事件进行通信。每当一个事件发生时,系统的某个部分会被触发并响应这些事件。

事件流与传统流的不同:

  • 传统流:通常是指一系列数据或任务的流转,它通常是在一定的顺序和时间点进行处理。
  • 事件流:是一种更加灵活的流动方式,侧重于异步传递、处理和反应的模式。事件流中的每个事件通常是独立的、无状态的,并且具有明确的触发条件。

事件流的优势:

  • 解耦:生产者和消费者之间通过事件流进行通信,从而降低了系统组件之间的耦合度。
  • 扩展性:可以通过增加事件消费者来横向扩展系统处理能力。
  • 实时性:适合处理实时数据流,事件流可以实时反映系统中的变化。

事件流的实现方式

(1) Servlet 编程中的响应对象:HttpServletResponse

HttpServletResponse 是经典的 Servlet 编程中的响应对象,可以用于向客户端实时推送数据。主要适用于简单的事件流场景。

实现方式

  • 使用 HttpServletResponse 来直接写数据到客户端。
  • 通常通过长连接保持客户端和服务器之间的连接,以便持续推送事件数据。

示例代码

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/event-stream")
public class EventStreamServlet extends HttpServlet {
   
   

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
   
        // 设置响应头,告知客户端这是一个事件流
        response.setContentType("text/event-stream");
        response.setCharacterEncoding("UTF-8");

        // 获取输出流
        PrintWriter out = response.getWriter();

        // 模拟一个简单的事件流
        int endIndex = 100;
        while (true) {
   
   
        	endIndex--;
        	if( endIndex <= 0 ){
   
   
        		break;
        	}
            out.println("data: " + System.currentTimeMillis());
            out.println(); // 事件的分隔符
            out.flush();

            try {
   
   
                Thread.sleep(1000); // 每秒推送一次事件
            } catch (InterruptedException e) {
   
   
                Thread.currentThread().interrupt();
            }
        }
    }
}

特点

  • 基本实现:简单地使用 HttpServletResponse 输出流来推送数据。
  • 客户端与服务器之间通过长连接保持数据传输。
  • 没有事件的流控或背压处理,适用于低负载、简单的应用场景。

客户端代码(HTML + JavaScript)

<!DOCTYPE html>
<html>
<head>
    <title>SSE Example</title>
    <script>
        const eventSource = new EventSource("/sse-stream");

        eventSource.onmessage = function(event) {
     
     
            console.log("Received event: ", event.data);
            document.getElementById("output").innerText = event.data;
        };
    </script>
</head>
<body>
    <h1>Server Sent Events Example</h1>
    <div id="output"></div>
</body>
</html>

(2) SseEmitter‌

仅需spring-boot-starter-web即可实现基本SSE功能
SSE(Server-Sent Events)是一种基于HTTP的单向通信协议,允许服务器主动推送实时数据到客户端。其核心特点包括轻量级协议、自动重连机制和浏览器原生支持

实现方式

  • 使用 SseEmitter 长连接保持客户端和服务器之间的连接,以便持续推送事件数据。
  • 注意事项
      • ‌超时设置‌:SSE连接默认无超时限制,需显式设置SseEmitter超时参数以避免资源泄漏。
      • ‌‌响应
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值