You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:12:13