67.实现AI流式回答的后端实现(2)

实现AI流式回答中断功能的后端实现(下)

前端交互设计

要实现流畅的中断体验,前后端需要紧密配合。前端需要:

  1. 在发送流式请求时获取唯一的emitter ID
  2. 提供中断按钮并绑定中断API调用
  3. 优雅处理中断后的UI状态

后端相应需要扩展:

// 扩展的流式端点,返回emitter ID
@PostMapping("/stream")
public Map<String, Object> streamResponse(...) {
    String emitterId = UUID.randomUUID().toString();
    SseEmitterWrapper wrapper = new SseEmitterWrapper(emitter);
    emitterRegistry.put(emitterId, wrapper);
    
    // ...原有逻辑...
    
    return Map.of(
        "emitterId", emitterId,
        "emitter", wrapper.getEmitter()
    );
}

注册表实现

完整的Emitter注册表实现:

@Component
public class EmitterRegistry {
    private final ConcurrentMap<String, SseEmitterWrapper> emitters = new ConcurrentHashMap<>();
    private final ScheduledExecutorService cleaner = Executors.newSingleThreadScheduledExecutor();
    
    public EmitterRegistry() {
        // 每小时清理一次已完成的emitter
        cleaner.scheduleAtFixedRate(this::cleanUp, 1, 1, TimeUnit.HOURS);
    }
    
    public void put(String id, SseEmitterWrapper wrapper) {
        emitters.put(id, wrapper);
    }
    
    public SseEmitterWrapper get(String id) {
        return emitters.get(id);
    }
    
    public void cleanUp() {
        emitters.entrySet().removeIf(entry -> 
            entry.getValue().isCompleted()
        );
    }
    
    @PreDestroy
    public void shutdown() {
        cleaner.shutdown();
    }
}

性能优化策略

  1. ​连接管理​​:

// 在WebClient配置中
WebClient.builder()
    .clientConnector(new ReactorClientHttpConnector(
        HttpClient.create()
            .responseTimeout(Duration.ofSeconds(30))
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
    ))

    总结:

    通过这两篇文章,我完整实现了:

    1. 基于SSE的流式回答功能
    2. 用户可中断机制
    3. 完善的异常处理和资源管理
    4. 性能优化策略

    关键收获:

    • takeUntil是实现中断的核心操作符
    • 状态管理需要线程安全的设计
    • 完整的生命周期管理至关重要
    • 监控和指标收集对生产环境必不可少
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值