news 2026/10/14 20:10:21

FastAPI 流式响应中,如何优雅处理客户端断连后的数据库操作?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI 流式响应中,如何优雅处理客户端断连后的数据库操作?

问题出现过程

1. 客户端发起流式对话请求

我们从一个典型的流式对话接口开始。我们使用依赖注入来获取一个 SQLAlchemy 的 AsyncSession,在对话开始时创建消息,在对话结束后更新 AI 的回答。

流式对话原始代码(伪代码)

2. 客户端取消对话(主动断开)

当用户取消发送时,会抛出这个异常

pymysql.err.InterfaceError:

原因:当客户端断开时 ,FastAPI 会立即把它的 session连接回收掉,底层的那个物理连接被标记为 Cancelled,然后执行finally的时候,再往下传原来session连接就不对了,save_conversation函数就会抛pymysql.err.InterfaceError。

问题解决尝试

尝试一:在 save_conversation 函数中创建新连接

一个自然的想法是:既然旧的 session 不能用了,那就在保存的时候检查一下,如果不可用就创建一个新的。

代码更新

结果:失败! 没想到,即使创建了新的 session,依然抛出了 pymysql.err.InterfaceError。

原因分析:之所以还会抛错误,原因是这个新会话 依然在使用已经被取消的连接池资源,因为 FastAPI/Starlette 在主请求取消时,会把整个 AsyncSessionLocal() 对象的连接都标记为 “cancelled”。即便你重新 async with AsyncSessionLocal(),底层复用的还是同一个数据库连接池里的连接,而那个连接刚被 cancel。

重新创建个数据库引擎 是肯定可以的,但是只是对话后更新,这么搞完全没必要。

或者创建个独立线程,在新线程中去创建新连接,应该是可以的,个人还是感觉比较重,浪费资源。

尝试二:创建个协程去执行save_conversation

代码更新

疑惑点:asyncio.create_task 启动的协程仍然跑在同一个线程和进程里,也会复用那个全局的连接池,理论上确实还有可能拿到刚才那个被 cancel 的连接啊?

主要在于操作的时序和上下文隔离:

先清理,后执行

当原始请求被取消后,FastAPI 会立即开始清理与该请求相关的资源(包括回收它持有的数据库连接)。这个清理动作在 finally 块中调用 create_task 之前就已经触发了。我们派生出的后台任务是在这个清理逻辑之后才启动的。

上下文隔离

这个后台协程已经完全不挂在 HTTP 请求的上下文上了。客户端断开与否,都影响不了它的独立运行。只要连接池中还有任意一个好连接,它就能完成写入。

高成功率

因为顺序已经变成了:先断开、先清理 → 再新建、再执行,所以新任务向连接池请求时,拿到那个“坏掉”连接的概率已经大大降低。连接池会优先分配一个健康的、空闲的连接。

即使在极端情况下又拿到了旧连接,它也很有可能在 session.begin() 阶段就失败,我们还可以在后台任务的 try...except 块里加入重试逻辑(比如 await asyncio.sleep(0.1) 后重试),进一步提高健壮性。

大量测试后,发现真没问题😁。

结论

对于需要确保最终操作(如数据写入)一定执行的流式 API,asyncio.create_task 提供了一种轻量级且非常有效的解决方案。它避免了引入像 Celery 这样复杂的任务队列,同时优雅地解决了因客户端断连导致资源状态污染的问题。

通过将关键的收尾工作与不稳定的 HTTP 请求生命周期解耦,我们能构建出更加健壮和可靠的 FastAPI 应用。"

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 7:18:20

3.1 符号主义:基于逻辑的推理系统、知识表示与专家系统

3.1 符号主义:基于逻辑的推理系统、知识表示与专家系统 符号主义,亦称为逻辑主义或“老式人工智能”,是人工智能发展史上第一个形成完整体系并长期占据主导地位的研究范式。其核心假设在于:人类智能,特别是高阶认知功…

作者头像 李华
网站建设 2026/10/15 19:24:07

企业选对会议服务商:7个关键维度避坑指南

企业选对会议服务商:7个关键维度避坑指南 在数字化转型浪潮下,会议活动已从简单的场地与人员组织,演变为一个集技术集成、创意策划与精准执行于一体的复杂系统工程。企业选择会议服务商,实质上是选择一位能够驾驭技术变革、保障活…

作者头像 李华
网站建设 2026/10/15 10:21:20

泰克示波器 4 系列 MSO 在嵌入式开发中的实测分析

嵌入式系统广泛应用于消费电子、工业控制、汽车电子等领域。嵌入式开发人员需要面对复杂的硬件电路、复杂的软件代码以及各种通信协议。泰克 4 系列 MSO 结合了示波器、逻辑分析仪、协议分析仪等多种功能,可以帮助开发人员快速定位问题、验证设计并优化性能。泰克 4…

作者头像 李华
网站建设 2026/10/15 16:33:44

LCR测试仪温度漂移补偿的解决方案

LCR测试仪是电子测量中重要的仪器,广泛应用于元器件的参数测试,如电感(L)、电容(C)和电阻(R)。然而,温度变化会导致待测元件参数的漂移,进而影响测试结果的准…

作者头像 李华
网站建设 2026/10/15 9:31:36

C++医学图像处理经典ITK库用法详解<四>: 图像分割模块功能

1、ITK库概述ITK (Insight Segmentation and Registration Toolkit) 是一个开源的跨平台软件开发工具包,主要用于图像处理,特别是生物医学图像处理领域。该工具包提供了一套丰富的图像处理算法,特别是在图像分割和配准方面具有强大的功能。IT…

作者头像 李华
网站建设 2026/10/15 16:33:46

C++医学图像处理经典ITK库用法详解<五>: 数学运算与变换模块功能

1、ITK库概述ITK (Insight Segmentation and Registration Toolkit) 是一个开源的跨平台软件开发工具包,主要用于图像处理,特别是生物医学图像处理领域。该工具包提供了一套丰富的图像处理算法,特别是在图像分割和配准方面具有强大的功能。IT…

作者头像 李华