ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

工作流走到一半就报错,Mastra 的重试策略怎么配

工作流走到一半就报错,Mastra 的重试策略怎么配 工作流走到一半就报错Mastra 的重试策略怎么配【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastra凌晨两点工作流在第 4 步调外部 API 超时整条流水线从头重跑。你加过重试但 5 次全打在同一个瞬时故障上还不如不试。Mastra 工作流把重试做成 step 级别的retryPolicy矛盾点在于配少了兜不住抖动配粗了会把本该直接失败的错误也陪跑到底。下面按能跑起来 → 配得准 → 配得住的顺序讲。最短能跑的重试配置const step createStep({ id: fetch-data, inputSchema: z.object({ url: z.string() }), outputSchema: z.object({ data: z.unknown() }), retryPolicy: { maxAttempts: 3, retryInterval: 1000, }, execute: async ({ $: { input }, context }) { const res await fetch(input.url); if (!res.ok) throw new Error(fetch failed: ${res.status}); return { data: await res.json() }; }, });id是步骤的唯一标识重试记录和追踪都挂在它上面。retryPolicy.maxAttempts是含首次在内的总尝试次数。retryInterval是每次尝试之间的间隔毫秒数。这段能兜住网络抖动但如果你要区分哪些错该重试、哪些该直接挂往下看。不同的错配不同的重试网络类错误最常见连接被重置、DNS 抖动、网关返回 502 或 503。这类错误的特征是再试一次环境可能就好了错误本身不携带业务含义且通常几秒内自愈。判断标准瞬时的、和环境状态相关的错误 → 重试错误信息里带着业务语义的 → 直接失败。数据校验和业务规则错误是另一类schema 校验不过、必填字段缺失、状态机不允许这次操作。这类错误由输入决定同样的输入重试 100 次结果也一样只会把失败日志刷得更多。判断标准由输入数据决定的错误 → 直接失败别浪费次数。限流和资源类错误介于两者之间429、配额用尽、后端过载。它和 502 不同你每次重试都在给一个已经喊别来了的服务加压间隔太短的连发重试会把它按得更死。判断标准429、配额类错误 → 可以重试但必须拉开间隔且次数要少持续性过载 → 直接失败并告警。从兜住单次失败到搭一条恢复链路基础重试瞬时网络抖动的场景上面那段配置就够了。maxAttempts给 3 左右比较稳再多基本是自我安慰因为同一环境故障很少在第 4 次才恢复。注意它是总次数而非重试次数3 表示首次失败后最多再试 2 次。条件重试要按错误类型分流就别让所有错误共享同一份策略。思路是在execute里把错误打标签让上层能读到再决定去留或者干脆在 step 内部对可恢复错误做一次有限重试把不可恢复的抛出execute: async ({ $: { input }, context }) { const res await fetch(input.url); if (res.status 429) { throw new Error(rate_limited); // 由上层决定是否重试 } if (!res.ok) throw new Error(fetch failed: ${res.status}); return { data: await res.json() }; }错误分类这一步是后面所有策略的地基分不准重试只是把失败放大。重试耗尽后的降级或补偿把每次尝试都当成会失败来设计maxAttempts用完之后流程要有去处。最省事的做法是把入参和最后一次错误写进一张失败表或死信队列由人工或补偿任务后续处理对可部分完成的任务降级到缓存数据或默认值同时把降级事件打点出来。关键是重试耗尽不能成为黑洞得有人能看到它发生。生产环境踩过的坑现象重试配了 5 次结果每次故障都精准把下游限流打满。根因是 429 被和 502 归进同一份重试策略连发重试等于帮下游把过载固化成了持续故障。解法是把 429 单列出来间隔拉长、次数砍半并给下游一个明确的可恢复信号再试。现象线上看执行记录某 step 的尝试次数是 1却超时 30 秒才失败重试一次没触发。根因是超时发生在execute里的 await 中没有转成 step 层面的失败重试策略压根没进场。解法是给 fetch 加AbortSignal.timeout把超时显式抛出去让retryPolicy能感知到它。重试没生效按这个顺序查确认retryPolicy挂在出错的 step 上看错误的分类是否在重试覆盖范围内翻执行日志确认尝试次数和间隔是否触发检查依赖服务本身是否可用重试是兜底手段不是设计缺陷的补丁。先让错误被正确分类重试策略才有意义。【免费下载链接】mastraMastra is the modern TypeScript framework for AI-powered applications and agents.项目地址: https://gitcode.com/GitHub_Trending/ma/mastra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表