跳到主要内容

65 篇博文 含有标签「distributed-systems」

查看所有标签

幂等性危机:LLM 智能体作为事件流消费者

· 阅读需 12 分钟
Tian Pan
Software Engineer

每个事件流系统最终都会将同一条消息投递两次。网络抖动、Broker 重启、偏移量提交失败——至少一次投递不是 Bug,而是契约。传统消费者能够优雅地处理这种情况,因为它们是确定性的:处理同一事件两次,得到相同的结果,写入相同的记录。第二次写入是一个空操作(no-op)。

LLM 不是确定性处理器。相同的提示词加上相同的输入,每次运行都会产生不同的输出。即使设置了 temperature=0,浮点运算、批次组合效应以及硬件调度的差异也会引入方差。针对"确定性" LLM 设置的研究发现,在自然发生的多次运行中,准确率差异高达 15%,最优与最差性能之间的差距甚至达到 70%。至少一次投递加上非确定性处理器,并不会给你带来至多一次的行为,只会带来不可预测的行为——这是一场蓄势待发的生产环境危机。

Agent 链中的截止时间传播:第三跳时你的 p95 SLO 发生了什么

· 阅读需 11 分钟
Tian Pan
Software Engineer

大多数构建多步 agent 管道的工程师会在第一次生产故障后约两周发现同一个问题:他们在 API 网关设置了 5 秒超时,但 agent 管道有四跳,而整个系统的行为就好像根本没有超时一样。第三跳的 agent 不知道上游调用方三秒前就已放弃等待,它继续运行、继续调用工具、继续生成 token——而用户早已离开。

这不是配置错误,而是结构性问题。延迟约束默认不会跨 agent 边界传播,主流编排框架也没有任何一个让截止时间传播变得容易。结果是一类看起来像延迟问题、实则是上下文传播问题的故障。

LLM 速率限制是一个分布式系统问题

· 阅读需 14 分钟
Tian Pan
Software Engineer

你的 AI 产品有两个功能面:一个面向用户的聊天功能和一个后台报告生成任务。两者在同一个 Key 下调用同一个 LLM API。一个下午,你收到了一张工单:“聊天回复在中途被截断了。”没有触发任何警报。日志中也没有 429 错误。API 在整个过程中一直返回 HTTP 200。

发生了什么:报告生成任务逐渐消耗了你大部分的共享 Token 配额。聊天请求虽然能完成,但仅达到了你的 max_tokens 限制——在语义上被截断,在语法上有效,却在无声无息中出错了。你的标准监控从未察觉到这一点,因为在 HTTP 层面上没有任何异常。

这并不是一种边缘情况。当工程师将 LLM 速率限制视为简单的节流问题,而不是意识到它们实际上属于分布式系统失效类别时,就会发生这种情况。

多区域 LLM 服务:没人警告过你的缓存局部性问题

· 阅读需 12 分钟
Tian Pan
Software Engineer

当你在多个区域运行无状态 HTTP API 时,路由问题基本上已经解决了。在前面放一个全球负载均衡器,按地理位置分配请求,最糟糕的情况也不过是缓存项稍微过时。任何副本都可以处理任何请求,并获得相同的结果。

LLM 推理打破了每一个假设。一旦你添加了提示词缓存(Prompt Caching)——你肯定会加,因为缓存命中和未命中的成本差异大约是 10 倍——你的服务就会以大多数基础设施团队预料不到的方式变得有状态,直到他们在第二个区域看到延迟数据退化。

多用户共享 AI 会话:尚无人解决的并发难题

· 阅读需 14 分钟
Tian Pan
Software Engineer

大多数 AI 产品都是为单一用户、单一意图、单一对话线程和单一身份构建的。当产品是个人生产力工具(如写作助手、代码补全引擎、摘要生成器)时,这运作得足够好。但当团队开始协作使用 AI 时,情况发生了变化:产品会以难以诊断且更难修复的方式悄然失效。两个用户同时向 AI 提问,其中一个输入消失了。五个工程师共享的上下文窗口充满了重复的历史记录。AI 使用用户 B 的权限回答用户 A 的问题。没有人为这些情况做过设计,因为交付多用户共享上下文意味着要面对现代 AI 基础设施中最难的分布式系统问题之一。

本篇文章将探讨为什么同步多用户 AI 会话如此困难、生产团队尝试了哪些方案,以及新兴的架构模式是什么。如果你正在构建协作 AI 功能并疑惑为何它感觉复杂得离谱,这就是原因。

当你的 AI Agent 从 Kafka 消费数据时:那些失效的设计假设

· 阅读需 14 分钟
Tian Pan
Software Engineer

AI Agent 的标准心智模型通常假设采用 HTTP:客户端发送请求,Agent 进行处理,最后返回响应。这种模式清晰、同步、且易于推理。当一个基于 LLM 的函数执行失败时,你会收到一个错误代码;当它成功时,你就可以继续下一步。

一旦你将 HTTP 接口换成 Kafka 主题或 SQS 队列,上述每一个假设都会开始动摇。队列保证的是“至少一次交付”(at-least-once delivery),而你的 Agent 具有随机性。这种组合产生了一些在确定性系统中并不存在的故障模式——而且修复方法也与传统微服务所采用的方法不同。

本文将探讨当 AI Agent 消费消息队列时实际发生的变化:幂等性、顺序性、背压、死信处理,以及一种特定的故障模式——即重播的消息在第二次触发时会导致 Agent 产生不同的行为。

多用户共享智能体状态:你真正需要的并发原语

· 阅读需 12 分钟
Tian Pan
Software Engineer

每篇智能体教程都从单个用户、单个会话和单个上下文窗口开始。智能体读取状态、推理、行动、写回。清晰、确定。对于团队实际使用的场景来说,这种假设完全错误。

真实的协作产品——共享规划看板、多用户支持队列、文档协作副驾驶、团队项目助手——需要多个用户同时与同一个智能体交互。当两个人在同一秒内向智能体发出相互矛盾的指令时,其中一个人的修改就会消失。智能体不会告诉他们,甚至自己都不知道发生了什么。

这就是多用户共享智能体状态问题,它是一个披着AI外衣的分布式系统问题。

主动型 Agent:后台 AI 的事件驱动与定时自动化

· 阅读需 12 分钟
Tian Pan
Software Engineer

几乎所有关于构建 AI Agent 的教程都以同样的方式开场:用户输入消息,Agent 进行推理,Agent 返回响应。这个模型对聊天机器人和副驾驶(Copilot)来说运行良好,却无法描述各组织正在大规模部署的大多数生产 AI 工作。

在企业环境中默默发挥最大价值的 Agent,并不等待消息。它们在数据库行发生变更时唤醒,在队列深度超过阈值时唤醒,在凌晨 3 点的定时任务触发时唤醒,或在监控检测到指标漂移超出范围时唤醒。它们在没有用户在场的情况下行动。一旦失败,没有人会察觉,直到损失已经累积到难以挽回。

构建这类主动型 Agent 需要一套与构建被动式助手截然不同的设计语汇。适用于对话型 AI 的会话(Session)思维模型,在 Agent 循环运行、在后台重试、没有人类兜底的场景下会彻底失效。

智能体系统中的写放大:为什么一次工具调用会命中六个数据库

· 阅读需 11 分钟
Tian Pan
Software Engineer

当智能体决定记住某件事——"用户更喜欢邮件而非Slack"——看起来只是一次写入。实际上,它是六次写入:向量存储中的一个新嵌入、关系数据库中的一行记录、会话缓存中的一个条目、事件日志中的一条记录、审计轨迹中的一个条目,以及上下文存储的一次更新。每一次写入都因为系统的某个部分对数据有合理需求而发生,每一次写入都引入了新的故障点。

这是基础设施层面的写放大,也是生产智能体部署中较为隐蔽的运营危机之一。它不会导致戏剧性的故障,而是导致部分故障:用户偏好在语义上可以被搜索到,但关系查询返回的是过时数据;审计日志显示某个动作已完成,但实际上从未完全提交;缓存是热的,但上下文存储没有更新,因此下一个会话在没有已学习模式的情况下启动。

理解这一切为何发生——以及如何应对——需要借鉴数据库内部知识,而不是智能体框架文档。

异步 Agent 的静默失败:为何你的 AI 任务悄然终止却无人察觉

· 阅读需 9 分钟
Tian Pan
Software Engineer

异步 AI 任务有一个传统后台 Worker 没有的问题:它们会静默而自信地失败。一个文档处理 Agent 返回 HTTP 200,输出格式规整的结果,然后继续执行——而实际输出却悄悄出错了:可能不完整,可能建立在三步前幻觉出的事实上。你的仪表盘依然绿色,值班工程师照常入睡,客户最终才发现异常。

这不是边缘情况,而是未经可观测性设计的异步 AI 系统的默认行为。让传统分布式系统中后台作业队列保持可靠的工具——死信队列、幂等键、Saga 日志——同样适用于 AI Agent。但失败模式足够不同,需要做一些"翻译"。

零停机 AI 部署:这是一个分布式系统问题

· 阅读需 12 分钟
Tian Pan
Software Engineer

2025 年 4 月,OpenAI 为 GPT-4o 发布了一次系统提示词更新。几小时内,1.8 亿用户发现 ChatGPT 变得谄媚奉承。这一故障并未被监控系统发现,而是由 Twitter 曝光的。回滚过程耗时三天。

这次事件揭示了 AI 行业一直在默默回避的一个事实:提示词更改就是生产部署。然而,大多数团队却将其视为普通的配置文件修改。

AI 部署的核心问题在于,你部署的不是单一内容,而是四个要素:模型权重、提示词文本、工具 Schema 以及它们共同依赖的上下文结构。每一个要素都可能独立发生偏移,每一个都可以部分发布。与导致崩溃的 API 接口不同,AI 的故障通常是概率性的、渐进的,并且在影响到大部分流量之前往往是不可见的。

这本质上是披着 AI 外衣的分布式系统一致性问题。

AI Agent 的 CAP 定理:为何你的 Agent 在本该优雅降级时却彻底崩溃

· 阅读需 10 分钟
Tian Pan
Software Engineer

你的 AI Agent 运行得一切正常,直到某一刻它彻底不行了。某个工具宕机——也许是搜索 API 触发了限流,也许是数据库响应迟缓,也许是代码执行沙箱超时——整个 Agent 随之崩溃。不是部分答案,不是降级响应,而是彻底失败。要么一片空白,要么满是幻觉。

这不是一个 Bug,而是一个设计选择——而且几乎没有人是刻意做出这个选择的。我们今天所构建的 Agent 架构隐式地选择了"彻底失败",原因只有一个:没有人设计过部分可用路径。如果你有分布式系统的经验,这个模式应该让你感到似曾相识。这正是 CAP 定理,以一副新的面孔出现了。