已开启
[Feature] Agent 实例优雅停机关机流程与连接排空机制 #53
张鑫宇创建于 6月15日
openJiuwen-bot
6月15日 评论:
6月15日 评论:
欢迎来到 openJiuwen 社区
Hey @xinyu-jiuwen , 感谢你对社区的贡献.
机器人使用手册
有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。


Hey @xinyu-jiuwen , 感谢你对社区的贡献.
有关指令的使用,可以点击 此处 查看详情。开发人员可以在每个PR或Issue下方评论特定指令来触发机器人任务。


背景
当前 agent-runtime 在停止或重启 Agent 实例时,直接终止子进程/容器,未提供优雅关闭(Graceful Shutdown)机制。这会导致正在处理中的请求被强行中断,客户端收到连接重置或超时错误,影响生产环境的服务可靠性和用户体验。
现状
stop_agent接口直接终止进程,未等待正在处理中的请求完成期望行为
503或从负载均衡摘除,再执行排空建议实现方案
1. AgentApp 层
在
AgentApp基类中增加GracefulShutdownMiddleware,在收到停止信号后:class AgentApp: def __init__(self, drain_timeout: int = 30): self.drain_timeout = drain_timeout self._shutdown_event = asyncio.Event() async def shutdown_handler(self, sig: int): logger.info(f"收到信号 {sig},开始优雅关闭(排空超时:{self.drain_timeout}s)") self._shutdown_event.set() # 等待正在处理中的请求完成 await asyncio.sleep(self.drain_timeout) logger.info("排空完成,执行最终清理")2. 部署策略层
SubprocessStrategy:通过process.terminate()替代process.kill(),配合process.wait(timeout=drain_timeout)DockerStrategy:使用docker stop --time=<drain_timeout>而非docker killK8sStrategy:在 Deployment YAML 中自动注入terminationGracePeriodSeconds和lifecycle.preStop3. 与健康检查联动
在
HealthService中暴露一个is_draining状态,当实例进入排空阶段时,健康检查端点返回503 Service Unavailable,这样上游负载均衡器能提前将流量切走。受影响模块
agent_runtime/applications/agent_app/agent_runtime/service/deployment/agent_runtime/service/health/agent_runtime/foundation/