跳到主要内容

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

查看所有标签

无共享智能体:为水平可扩展性设计 AI 智能体

· 阅读需 13 分钟
Tian Pan
Software Engineer

你的负载均衡器将一个传入的智能体请求分配给副本 3。但用户的对话历史存储在副本 7 的内存中。副本 3 完全不知道过去六轮发生了什么,于是它从头开始,让用户一头雾水,你的值班工程师在凌晨 2 点被叫醒。你启用了会话粘滞。现在该用户的所有请求永远路由到副本 7。你用一个正确性问题换来了一个可扩展性天花板。

就在这一刻,团队意识到:AI 智能体的"水平扩展"和 Web 服务器的水平扩展根本不是同一个问题。修复方式不同,而那些看似直接的路径会以可预见的方式失败。

级联问题:为什么 Agent 副作用在大规模运行时会呈爆炸式增长

· 阅读需 15 分钟
Tian Pan
Software Engineer

一个团队交付了一个文档处理智能体(agent)。它在开发环境中表现完美:读取文件、提取数据、将结果写入数据库,并发送确认 webhook。他们运行了 50 个测试用例,全部通过。

部署两周后,在 100 个并发智能体实例运行时,数据库中出现了 40,000 条重复记录,三个下游服务收到了数千个虚假的 webhook,一个共享配置文件被两个同时运行的智能体各覆盖了一半。

智能体本身没有出错。系统崩溃是因为没有任何一个独立的智能体测试曾被要求与其他智能体共同处于同一个运行环境中。

跨 Agent 服务边界的分布式追踪:上下文传播的断裂

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数分布式追踪方案在引入 Agent 之前都运作良好。一旦系统中出现 Agent A 跨微服务边界调用 Agent B——Agent B 调用工具服务器、工具服务器再查询向量数据库——原本连贯的端到端视图就会碎片化为互不相连的片段。追踪后端展示的是一个个孤立的操作,而你失去的是因果链:为什么某件事发生了,哪个用户请求触发了它,以及那 800 毫秒究竟消耗在了哪里

这不是监控配置问题,而是上下文传播架构问题。它有着特定的技术形态,大多数团队都是在付出代价后才意识到这一点。

智能体工具调用中的幂等性问题

· 阅读需 12 分钟
Tian Pan
Software Engineer

这种场景每次都如出一辙。你的智能体正在预订酒店房间,支付API调用返回200后、确认信息存储之前发生了网络超时。智能体框架发起重试,支付再次执行,客户被扣了两次款。支持团队升级处理,某位高管说AI"幻觉出了重复扣款"——这种说法是错的,但听起来有道理,因为没人愿意承认他们的重试逻辑从一开始就是坏的。

这不是AI问题,而是分布式系统问题——被AI层全盘照搬,却没有带来分布式系统工程师几十年苦心钻研出的应对之道。标准的智能体重试逻辑假设操作是幂等的,而大多数工具调用并非如此。

幂等性危机: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 循环运行、在后台重试、没有人类兜底的场景下会彻底失效。