多Uvicorn Worker下LangGraph中断后恢复功能异常求助
问题原因及解决指导
核心问题原因
多Uvicorn Worker是独立进程模式,你当前使用的MemorySaver是进程内内存存储,进程间无法共享状态。当请求被负载均衡到不同Worker时,恢复中断流程的请求找不到之前保存的会话状态,导致无法读取query字段,触发500错误。单Worker模式下所有请求共享同一进程内存,所以状态能正常读取。
解决方案
1. 替换内存型检查点为分布式共享存储
将MemorySaver替换为支持跨进程共享的检查点存储,比如Redis、SQLite(需挂载共享文件)、PostgreSQL等。下面以Redis为例给出修改代码:
# 导入Redis检查点 from langgraph.checkpoint.redis import RedisCheckpointer # 初始化Graph时替换MemorySaver graph = StateGraph(GraphState) # 连接你的Redis服务(需确保Docker容器能访问Redis) checkpointer = RedisCheckpointer.from_url("redis://redis-host:6379/0") # 其他节点配置保持不变... self.graph = graph.compile(checkpointer=checkpointer)
2. 确保会话ID的一致性传递
每个中断会话需要唯一的thread_id,恢复流程时必须携带该ID,确保不同Worker能通过共享存储找到对应状态。在FastAPI接口中需显式处理会话ID:
import uuid from fastapi import FastAPI app = FastAPI() # 假设你的代理实例是agent_instance @app.post("/run-agent") async def run_agent(input_data: dict): # 从请求中获取或生成唯一会话ID thread_id = input_data.get("thread_id", str(uuid.uuid4())) # 配置会话ID到graph的config中 config = {"configurable": {"thread_id": thread_id}} # 运行或恢复流程 result = await agent_instance.graph.ainvoke(input_data["input"], config=config) return result
3. 验证中断工具的状态保存逻辑
确保interrupt函数生成的中断状态被正确写入检查点:
- 检查
metadata中的query字段是否完整存入状态 - 恢复流程时,确认Graph能从检查点中正确读取该字段
额外注意事项
- Docker部署时,需确保共享存储(如Redis容器)与Uvicorn Worker容器在同一网络,能正常通信
- 若使用SQLite,需将SQLite文件挂载为Docker共享卷,避免每个Worker使用独立的本地文件
内容的提问来源于stack exchange,提问作者Archana Acharya T
相关产品推荐
相关产品推荐

