EventBridge Scheduler把成功调用丢进DLQ

在深圳设计师 中级 1天前 586 浏览 8 点赞 约 1 分钟

先说结论:问题不在你的Agent代码,而是EventBridge Scheduler的通用目标(universal targets)调用是同步等响应的。Scheduler发出API调用后等不到30秒就会判失败,但你的Agent完全不知情,继续跑完活、发完通知——于是你收到邮件,DLQ里也多了一条“失败”记录。

EventBridge Scheduler把成功调用丢进DLQ

复现路径是这样的:

1. Schedule配置成直接调Bedrock AgentCore的invokeAgentRuntime
2. 这个API是阻塞的,要等Agent跑完才返回,30到75秒
3. Scheduler在~30秒处超时,标记invocation failed
4. Agent继续跑完,发SNS邮件,DLQ收到一条“失败”消息

根因不是bug,是设计预期。 Scheduler自带的重试策略里有个MaximumEventAgeInSeconds,但它管的是事件在重试间的最大年龄,不是单次调用的等待上限。所以那个30秒更像是个观测值,不是文档承诺值。

我怎么修的: 让Agent响应变快,而不是让搜索变快。入口函数把任务丢进后台立刻返回,Scheduler在窗口内拿到响应就完事,Agent继续跑完整场搜索。AgentCore对这个模式有原生支持——add_async_task注册后台任务,运行时在/ping上报HealthyBusy,session保持活跃不会被回收。这点很关键,因为AgentCore空闲15分钟就会终止session,没有任务追踪的话,后台工作看起来跟空闲一模一样。

关键代码:

# strong refs: asyncio只弱引用task
_background_tasks: set[asyncio.Task[Any]] = set()

async def _tracked_job_search(company: str, title: str, location: str) -> None:
    """注册为tracked async task,让ping报告HealthyBusy"""
    task_id = app.add_async_task("job_search")
    try:
        await run_job_search(company, title, location)
    finally:
        app.complete_async_task(task_id)

@app.entrypoint
async def invoke(payload: dict[str, Any] | None = None) -> dict[str, Any]:
    # ...参数校验...
    if payload.get("sync"):
        return await run_job_search(company, title, location)
    # 异步路径:立刻返回,后台跑
    task = asyncio.create_task(_tracked_job_search(company, title, location))
    _background_tasks.add(task)
    return {"status": "started"}

这个坑给两个启发:一是别信Scheduler会耐心等你的慢服务,二是AgentCore的异步模式写得挺顺,CompleteAsyncTask/ping状态配合,总算没白折腾。如果你也把长任务挂在Scheduler后面,建议直接测一下响应时间,别等DLQ报警才发现。

awsAgentCoreEventBridgeSchedulerBedrock
AI工具与大模型实操经验整理在Claude实战技巧汇总,有不少直接可参考的案例。

全部回复 (3)

强迫症脚本小子 专家 1天前
所以用Lambda中转一下,把调度和业务解耦,就避开了这个坑。
0 回复
阿杰在路上 中级 1天前
我之前是套了层SQS做缓冲,调度器只发消息,业务自己慢慢跑。
0 回复
产品经理大熊 高级 1天前
我也遇到过,业务明明跑完了,DLQ里躺着成功记录,查了半天才发现。
0 回复

发表回复

支持 Markdown 格式