LinkLLM Server 对话中断流程设计与实现
前言在构建 LLM 服务网关时,流式响应(SSE)已经成为标配功能。用户可以实时看到 AI 的生成过程,获得更好的交互体验。然而,流式响应也带来了新的挑战:如何优雅地处理用户中断?如何在网络断开时正确清理资源?如何保证中断时已生成的内容不丢失? 本文将分享 LinkLLM 项目中对话中断流程的设计与实现,介绍如何构建一个企业级的流式对话中断机制。 问题背景流式对话的中断场景在实际生产环境中,流式对话面临多种中断场景: 123456789101112131415┌─────────────────────────────────────────────────────────────┐│ 流式对话中断场景 │├─────────────────────────────────────────────────────────────┤│ 场景1: 用户主动中断 ││ 用户点击停止按钮 → 需要立即停止生成 ...
Nacos基本原理(一)
重点关注naming/config模块、基于plugin模块开发自定义插件(如数据源适配)、扩展core模块的通信框架(gRPC/HTTP) 版本 默认协议 特点 配置方式 1.x HTTP 短连接,性能低 无需额外配置 2.x gRPC 长连接,性能提升 10 倍 临时实例自动启用(ephemeral=true) 3.x gRPC + QUIC 支持 AI Agent 场景,强化安全隔离 默认启用,可通过插件扩展协议 关键版本升级点: 2.0 gRPC 替代 HTTP 提升吞吐量。 插件化架构(如自定义鉴权模块) 3.0 安全增强:分离控制台 API 与服务 API 端口,支持命名空间统一管理 AI 支持:优化轻量化 Agent 的注册发现机制(如 Serverless 场景) 服务注册和发现(健康检查)服务注册机制 客户端自动注册触发机制 入口:Spring Boot 项目引入 spring-cloud-starter-alibaba-nacos-discovery 后,通过 spring.factories 加载自动...
SpringBoot启动原理解析
核心流程 启动入口:SpringApplication.run() 创建 SpringApplication 实例,初始化 ApplicationContext(默认 AnnotationConfigApplicationContext)。 加载 META-INF/spring.factories 中的 ApplicationContextInitializer 和 ApplicationListener。 准备环境(Environment) 读取默认配置application.yml及命令行参数。 配置 Profiles``prod)。 创建并刷新 ApplicationContext 调用 AbstractApplicationContext.refresh(),核心流程: Bean 定义加载:扫描 @Component、@Service 等注解类。 Bean 实例化:通过 BeanFactory 创建单例 Bean。 依赖注入:处理 @Autowired、@Resource 等注解。 初始化回调:执行 @PostConstruct、InitializingBean...
业务方案总结
Q:Redis和数据库的缓存一致性保证A: 方案如下: 更新数据库之后删除缓存(旁路缓存模式) 并发情况下可采用延迟双删策略 或者实现canal客户端订阅数据变更,更新缓存 适合:商品详情页场景,读多写少的场景 先更新缓存再更新数据库(异步更新) 更新缓存成功采用消息队列更新数据(消费幂等性保证) 场景:秒杀 双写操作 同时更新Redis和数据库,可以使用事务保证(分布式事务方案,事务补偿机制) 场景:积分 数据回写 优先更新缓存,缓存数据定期更新到数据库(Redis集群和持久化机制) 场景:广告计费系统,点赞 Q:分布式锁实现方案A: 本地同步锁 分布式锁setNX 设置超时时间 redission看门狗机制,读写锁 redisssion redlock 解决锁的高一致性问题 Q:如何快速定位线上OOMA:出现的原因: 一次性申请的对象数量过多:如查询返回结果过大 内存资源耗尽未释放:如何jdbc连接、文件资源 本身资源不够:jmap -heap PID 查看堆信息 方案: 预先设置-XX:+HeapDumpOnOutOfMemoryError...
算法热题(二)
二叉树1. 二叉树的中序遍历 (简)给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 提示: 树中节点数目在范围 [0, 100] 内 100 <= Node.val <= 100 示例:  12输入:root = [1,null,2,3]输出:[1,3,2] 代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) ...
算法热题(一)
哈希1. 两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 *target* 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 提示: 2 <= nums.length <= 104 109 <= nums[i] <= 109 109 <= target <= 109 只会存在一个有效答案 示例: 1234567输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 输入:nums = [3,2,4], target = 6输出:[1,2]解释:因为 nums[1] + nums[2] == 6 , 返回[1, 2] 代码: 123456789101112131415161718192021/** * **进阶**:**时间复杂度小于 O(n2) 的算法解决此问题吗?** * 1. 使...
命令模式
基本概念命令模式:一种行为型设计模式,它将“请求”封装为对象,使发送请求的客户端与执行请求的接收者解耦。通过这种封装,可以让请求参数化、排队执行、记录日志或支持撤销操作。 核心结构 命令接口(Command):定义执行命令的方法(如execute())。 具体命令(Concrete Command):实现命令接口,绑定接收者和具体操作。 接收者(Receiver):执行命令的具体对象,知道如何完成命令对应的操作。 调用者(Invoker):持有命令对象,通过调用命令的方法来触发请求。 客户端(Client):创建具体命令并设置其接收者,将命令交给调用者。 示例说明场景:遥控器控制家电 命令接口 1234567// 命令接口interface Command { void execute(); // 执行命令 void undo(); // 撤销命令(可选)} 接收者:电灯 1234567891011class Light { void on() { System.o...
责任链模式
基本概念责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。 核心思想:请求沿着处理者链传递,每个处理者决定是处理请求还是将其传递给下一个处理者,形成一个灵活的请求处理机制。 核心结构 Handler(处理者接口):定义处理请求的接口,包含设置下一个处理者和处理请求的方法 ConcreteHandler(具体处理者):实现处理者接口,决定是否处理请求,若不能处理则传递给下一个处理者 Client(客户端):创建处理链,并向链的起始端发送请求 示例说明场景:员工请假审批系统,不同级别领导处理不同天数的请假申请 组长:处理1天内的请假 部门经理:处理3天内的请假 总经理:处理7天内的请假 超过7天的请假不予批准 处理者接口 123456789101112public abstract class Approver { protected Approver nextApprover; // 下一个处理者 // 设置下一个处理者 publi...
观察者模式
基本概念观察者模式:一种行为型设计模式,定义了对象之间的一对多依赖关系。当一个对象(主题)的状态发生改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。 核心思想: 主题(Subject)维护观察者(Observer)列表 主题状态变化时,主动通知所有观察者 观察者无需知道其他观察者的存在,只关注主题更新 核心结构 主题(Subject):定义观察者注册/移除方法,维护观察者列表,状态变化时通知观察者。 观察者(Observer):定义更新接口,接收主题通知并作出响应。 具体主题(ConcreteSubject):实现主题接口,维护具体状态,状态变化时通知观察者。 具体观察者(ConcreteObserver):实现观察者接口,存储与主题相关的状态,响应通知。 示例说明场景:股票价格监控系统,当股票价格变化时,自动通知所有关注该股票的投资者 定义主题接口 123456789public interface Stock { void attach(Investor investor); // 注册观察者 void deta...
复合模式
基本概念复合模式:并非单一的设计模式,而是多种设计模式的组合应用,通过协同多种模式解决复杂场景问题。 核心思想:根据实际需求,将不同设计模式的优势结合,形成更强大的解决方案,同时避免单一模式的局限性。 示例说明典型复合模式示例:MVC架构(Model-View-Controller) MVC是最经典的复合模式之一,融合了多种设计模式: 观察者模式:View监听Model变化,自动更新界面 策略模式:Controller作为不同逻辑处理的策略 工厂模式:创建Model、View组件 责任链模式:请求在Controller链中传递处理 Model(数据模型,使用观察者模式) 123456789101112131415161718192021222324class UserModel { private String name; private List<View> views = new ArrayList<>();public void addView(View view) { views.add(vie...

