前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8394
  • 研究揭示:AI Agent技能仅12%经过安全审计,覆盖83%安装量
  • MCP服务器多实例实战:15个Safari-MCP并发部署踩坑全记录
  • LangChain构建语音Agent:架构、流式与生产级模式
  • Hermes Soul:让Copilot外壳调用Agent工具链实现内联编辑
  • LLM幻觉深度解析:AI为何编造内容及工程应对策略
  • Playwright AI Agent:自主浏览器自动化的完整工程指南
  • 一致性≠正确性:企业AI需要持续评估的R.A.H.S.I.框架
  • LLM账单有两个杠杆,你们团队只拉了一个
  • SFT 中究竟什么被 token 化:chat template 底层机制详解
  • 社区平台工程指南:Feed不是查询
  • 发布MCP服务器前的安全检查清单
  • Agent工具调用劫持:注入模式与运行时防护
  • AI Agent成本预测:在用户点击运行前估算工作流开销
  • 为何 AI Agent 指令文件总在多台机器间漂移
  • AI 水印无法真正证明作者身份——而且这才是关键
  • 企业级 AI 编程 ROI 量化实践:LoongSuite-Pilot + SLS
  • AI Agent 缺控层:R.A.H.S.I. 框架解决生产级连续保障
  • Grok 4.6 发布:50 万上下文、xhigh 推理级,60 分跻身第一梯队
  • AI Agent 搜索落地指南:减少幻觉的四大实践
  • 截图搜索 App 实战架构:端侧 OCR + Gemini 分类
  • 幂等性:让发布 Agent 不怕中途被杀
  • AI Agent 安全:教程里不会教的防护层
  • 2026生产级AI Agent实战指南:评估体系、生产架构与竞争策略
  • 企业级多Agent架构设计:Agent Mesh实现跨框架互操作
  • 上下文工程:6 文件替代全量历史,Token 消耗降 84%、准确率升 39%
  • AI 编码 Agent 需要确定性验收边界
  • 批处理中的静默失败:十条日志全成功仅两条执行
  • Pest 5:用测试工作流重新定义 Agent 代码验证
  • AI Agent的记忆检索正常却答错了:信息过期的隐性陷阱
  • AI编程的质量瓶颈在于上下文,而非模型本身
  • 自进化AI Agent正在淘汰静态脚手架:2026技术架构解析
  • AMD收购Taalas:芯片级AI推理的时代来了
  • Embabel:JVM上的Spring之父新作,Kotlin编写的企业级Agent框架
  • 6000+评论揭示:Cursor是AI编程安全问题最多的工具
  • 2026年AI编程工具横评:9款主流Harness对比与模型选配指南
  • LTX-2:首个DiT架构音视频生成模型开源
  • 33个生产Agent运行经验:记忆持久化模式总结
  • VLM+DOM Diff实现低误报的UI回归测试
  • 新模型来了?先用自己仓库的历史 commit 跑一遍
  • 廉价新模型上线前,我用 2 小时金丝雀测试决定要不要切
  • 免费模型评测后再付费:AI 编程任务的评估工作流
  • Meta 30B本地Agent模型Mac实测对比
  • 用测试套件自动分流免费/付费模型的工作流
  • Switchyard:Rust 编写的 LLM 流量代理,支持 OpenAI/Anthropic 协议互转
  • RAGFlow v0.4:开源 RAG 引擎支持 DeepSeek v4 与多渠道聊天
  • 廉价模型优先、失败时升级:构建可审计的双层 LLM 流水线
  • Vercel实习生直参生产:CDN、v0、AI Gateway实战复盘
  • DeepSeek-V4-Pro 正式版:Agent 能力大幅提升,支持三档思考强度
  • 2026年Claude Code最佳替代工具横评
  • DeepSeek-V4-Pro 正式版发布:Agent 能力大幅提升,支持 Responses API
  • AI编程工具选型:别比补全速度,比执行位置
  • 已加载 51 / 8394
8.0
热点
AI SCORE
编程提效2026-08-13 14:12

幂等性:让发布 Agent 不怕中途被杀

dev.to · AI#Agent#幂等性#工程实践
Editor brief · 编辑速览

详细阐述多渠道发布 Agent 的幂等设计与重试策略:如何通过 marker 标记避免重复发布,以及 429 限速下的退避实现。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

一个定时发布的 Agent 几乎是完全面向外部服务的 I/O 操作,而你既不拥有这些服务,也无法控制那个时钟。我们的 Agent 每篇文章会分发到四个目标:搜索引擎索引 ping、微博、联邦社交网络和开发者社区网站。最后那个网站限流非常严格,所以我们会把请求间隔控制在 75 秒,遇到 429 就退避。一篇三篇文章的运行因此在分发阶段就要花费超过四分钟,而其中大部分时间都在休眠。

四分钟足够被干掉了。CI 任务撞上墙钟上限。容器在休眠中途被驱逐。有人合上了笔记本。运行死掉并不是有趣的部分。有趣的是下一次运行会怎么处理它。

重试很容易;知道已经发生了什么却很难

真正让你付出代价的失败不是崩溃——而是一次没有留下明显痕迹的部分分发。三篇文章乘以四个渠道是十二次远程调用。进程死在第七次调用时。第一篇文章已经遍布各处。第二篇到达了两个渠道中的两个。第三篇除了在你的 git 历史里,哪儿都不存在。

现在选一个重试策略。重跑整个任务,第一篇文章就会被二次发布到所有没有服务端去重的渠道。跳过任何带有 published 标记的文章记录,第二篇文章就再也收不到剩下两个渠道的发布通知了——下次不会,永远不会。两种策略出错的原因是同一个:它们追踪状态的粒度和工作的实际粒度不匹配。

我们交付过一个更差的版本。有很长一段时间,我们的发布命令会构建和部署网站,但根本不会触发同步步骤。57 篇文章上线了,却从未在任何地方被通告。没有抛出任何异常。每次退出码都是零。我们是通过读脚本才发现的,不是通过读日志,因为日志里根本没有什么可读的。

一个报告成功的任务只告诉你进程结束了,而不是工作发生了。每个渠道都需要在远程调用返回后写入一条per-item记录。如果你判断一篇文章被通告的唯一证据是运行没有崩溃,那你并没有证据——你只是缺少一种特定类型的错误。

由此得出的规则是:状态属于(item, channel)这个组合。不属于运行。不属于 item。

在写重试循环之前先设计账本

三个属性做真正的工作,它们都不是重试循环本身。

分两阶段写入。在远程调用之前先把组合标记为 in_flight,在之后将其解析为 done 或 failed。在网络写入和账本写入之间被 kill 并不是假设——这是最有可能死亡的地方,因为那个窗口包含了网络。没有两阶段记录,你就无法区分从未发送和已发送但未记录,而这两种状态需要完全相反的处理。

存储远程系统给你的标识符。响应中返回的文章 ID 或 URL 是你日后无需猜测就能对账的依据。它还会把一条模糊的 in_flight 记录变成一个可以通过查询来回答的问题。

把账本放在运行之外。不是进程内存,不是任务的临时目录,不是随 worker 一起消亡的内存队列。存一份已提交的 JSON 文件或一张表。我们的账本放在仓库里,这意味着 diff 精确显示了什么东西在什么时候发了出去——这和我们在构建之前生成文章元数据而不是在构建期间生成是同一个原因。

有了这些,resume 就不是一个模式,而是一个过滤器:

// pending work is a query over the ledger, not a resume cursor
const pending = [];
for (const item of items) {
  for (const channel of CHANNELS) {
    const row = ledger.get(item.slug, channel.id);
    if (!row || row.state === 'failed') pending.push({ item, channel });
    else if (row.state === 'in_flight') pending.push({ item, channel, verify: true });
  }
}

恢复的运行和全新的运行现在走相同的代码路径。没有恢复分支需要维护,也没有 --resume 标志需要在凌晨两点时记住。这比看起来重要得多,因为你无法可靠地测试恢复分支:kill 可能落在任何地方,而你写测试的那些 case 都是你已经想到的。

当 API 不提供幂等性时,用一次读取来购买

发布 API 很少像支付 API 多年前标准化那样提供 Idempotency-Key header。实际上你面对的是三个层级之一。

规范 URL 是任何内容型事物的天然去重 key,大多数渠道都允许你搜索自己发布的文章。只有当一条记录卡在 in_flight 时才付出这次读取的成本——在干净的运行中它永远不会触发,所以成本在常见情况下为零,在真正需要它的场景下一次请求。

在写任何这些代码之前还有一种分类值得明确说明:逐渠道决定重复是否无害。索引 ping 生来就是幂等的,所以自由 ping,把它当作至少一次。社交帖子是公开且永久的,所以偏好最多一次,接受一次错过的通告而不是重复——一篇缺失的帖子明天可以手动补发,一条重复的帖子无法从用户的时间线中抹掉。把一个策略均匀地套用到两类渠道上,同一个链接就会在信息流里出现三次。

一旦账本 schema 定下来,重构在很大程度上是机械性的,而这恰恰是那种重复的、规格明确的编辑,适合交给 coding agent 来做,你自己来把握 schema 决策。

这些都不能让 agent 变得更有能力。它只是让 agent 的失败变得廉价——而对于任何按计划运行的系统,这才是决定你是否继续跑它的那个属性。

Originally published at pickuma.com. Subscribe to the RSS or follow @pickuma.bsky.social for new reviews.

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
截图搜索 App 实战架构:端侧 OCR + Gemini 分类
下一篇
AI Agent 安全:教程里不会教的防护层