森睿观点

后端架构什么时候开始拖慢自动化

platform foundationsbackend architecturekubernetesgoautomation
Senrok Team
作者Senrok Team
发布于

后端架构什么时候开始拖慢自动化

很多想做工作流程自动化的团队发现,真正的阻力不在 AI 层,而在它下面的后端架构。工作流程本身是清楚的,团队也准备好了,但每次想往前推进,底层系统就制造出足够多的摩擦,让项目停在原地。

这是运营 AI 落地过程中最常见、也最少被讨论的问题之一。它不会在 demo 里出现,而是在实施的第六周出现——当团队意识到把智能体系统连接到它需要配合的那些系统,比任何人预期的都要难得多。

后端阻塞具体是什么样子

后端阻塞通常不会清楚地宣告自己的存在,而是表现为一系列更小的问题,合在一起让进展变得非常慢。

集成花的时间远超预期

把智能体系统连接到现有系统,需要处理没有文档的 API、不一致的数据格式、没有为服务间通信设计的认证系统、以及当人工在手动处理工作时从来不是问题的速率限制。

数据不在它该在的地方

智能体系统做判断需要的信息,分散在多个系统里,格式各不相同,更新频率不一,而且没有可靠的方式知道哪个版本是最新的。

系统无法被安全地修改

工作流程依赖的后端服务,当初构建时没有预期它们会被自动化系统调用。要做支持自动化所需的修改,需要触碰没有人完全理解的代码,在没有测试覆盖的系统里,一个错误可能影响到不相关的功能。

可观测性缺失

出了问题,没有可靠的方式追踪发生了什么。日志不一致或者根本没有。错误信息含糊不清。团队花在调试基础设施上的时间,比构建自动化本身还要多。

部署很困难

把变更推进生产环境,需要经历一个为不频繁的大版本发布设计的部署流程,而不是一个演进中的智能体系统所需要的增量、频繁的变更节奏。

这些问题中的每一个,单独来看都是可以解决的。当它们同时出现的时候,通常是一个更深层症状的表现:底层架构没有被设计来支持生产级智能体系统所需要的那种自动化、面向服务的工作流程。

为什么会这样

大多数后端系统在构建时没有把自动化考虑进去。它们被构建来支持人工操作的界面:Web 应用、后台、内部工具。烘焙进它们架构里的假设,反映的是那个最初的目的。

API 是为人工发起的请求设计的,不是为高频的服务间通信设计的。数据模型是围绕原始应用的需求设计的,不是围绕一个需要以新方式查询、组合和处理这些数据的下游系统的需求设计的。错误处理是为了产出人类可读的消息设计的,不是为了产出一个调用服务可以可靠地解析和处理的结构化响应设计的。

这些都不是原始设计的失败,而是把一个为某种目的构建的系统用来服务另一种目的时可预期的结果。

问题在于,在一个没有为自动化设计的架构上面做工作流程自动化,不只是增加了复杂度,而是创造了一个在测试中很难被发现、在生产环境里修复起来很昂贵的脆弱系统。每个集成都成为潜在的故障点。对任何一个系统的每一次修改,都需要小心协调以避免破坏另一个系统。自动化随时间变得越来越难维护,而不是越来越容易。

诊断性问题

当工作流程自动化项目遭遇后端阻力时,正确的问题不是如何绕过当前的架构,而是当前的架构是否是团队想要构建的东西的正确基础。

这个问题让人不舒服,因为答案有时意味着承认后端需要大量工作,才能在它上面可靠地构建自动化。这些工作不光鲜,短期内也不会产出任何人在工程团队之外能看到的可见结果。但这是一个在生产环境里可靠运转的自动化系统,和一个需要持续关注才能保持运行的自动化系统之间的区别。

需要先做后端工作的诊断信号是相当一致的。

每个系统的集成都需要定制化的变通方案,而不是遵循一个一致的模式。这表明服务没有一个连贯的 API 设计,每个新的集成都需要同样的工作量。

来自不同系统的数据,不经过大量转换就无法被可靠地组合起来。这表明数据模型是独立设计的,没有跨系统关联数据的一致方式。

对一个服务的修改经常在其他服务里引发意料之外的问题。这表明服务之间存在紧耦合,让系统难以被安全地修改。

没有可靠的方式重放或检查过去的系统行为。这表明可观测性没有被设计进架构里,在自动化可以被安全运营之前需要先补上。

部署需要跨多个团队协调,或者涉及大量人工步骤。这表明部署架构没有被设计来支持一个演进中的智能体系统所需要的那种增量、频繁的变更节奏。

需要改变什么

支持可靠工作流程自动化所需的后端工作,分为几个类别。不是每个项目都需要全部做到。正确的范围取决于具体的架构和被自动化的具体工作流程。

服务边界

服务应该有清晰、稳定的接口,描述它们做什么、接受什么输入、产出什么输出。调用一个服务的智能体系统,不应该需要了解那个服务的内部实现。如果当前的服务没有清晰的边界,定义它们通常是第一步。

在实践中,这通常意味着把业务逻辑从单体应用里提取出来,放进职责明确定义的更小服务里。Go 非常适合这类服务,因为它产出的是小型、快速、静态类型的二进制文件,在 Kubernetes 上部署和运营都很容易。

API 设计

智能体系统将要调用的 API,需要为程序化使用设计,而不只是为人工发起的使用设计。这意味着调用服务可以解析和处理的一致错误响应、支持服务间通信的认证方式、调用服务可以优雅处理的速率限制和退避行为、以及允许 API 演进而不破坏现有调用者的版本管理。

数据可访问性

智能体系统需要的数据,应该通过一个可靠的、可查询的接口来访问,而不是埋在没有被设计来直接查询的应用数据库里。有时这意味着构建一个专用的读取层,以智能体系统可以高效使用的形式暴露它需要的数据。有时这意味着建立事件流,让智能体系统可以订阅来保持与底层系统变更的同步。

可观测性

智能体系统交互的每个服务,都应该产出结构化的日志、指标和追踪,可以跨服务边界进行关联。这让追踪一个智能体动作跨多个服务的完整执行路径成为可能,对在生产环境里调试故障和理解系统行为来说是必不可少的。在 Kubernetes 上,这通常意味着用一个一致的可观测性技术栈对服务进行埋点,并把输出路由到一个集中的平台上。

部署基础设施

部署流程应该支持一个演进中的智能体系统所需要的增量、频繁的发布节奏。在 Kubernetes 上,这意味着有一个可靠的 CI/CD 流水线、清晰的回滚流程、以及在不影响其他服务的情况下单独部署单个服务变更的能力。Helm charts 和完善的 secret 管理,是安全运营智能体相关服务的基本要求。

正确的顺序

当后端架构在阻塞自动化时,正确的顺序几乎总是先做后端工作,再在它上面构建自动化。

这个顺序反直觉,因为后端工作对干系人是不可见的,而且需要时间才能产出工程团队之外任何人能看到的结果。诱惑是先构建自动化,再在问题出现时修复后端问题。

这个做法的问题在于,自动化制造了路径依赖。一旦智能体系统是围绕当前架构构建的,改变那个架构就需要同时改变智能体系统。每一次后端改进都变得更昂贵,因为它必须与自动化层协调。技术债务在积累,而不是在减少。

先构建后端基础,意味着自动化可以被正确地、一次性地构建在一个稳定的基础上。智能体系统不需要编码对底层系统局限性的变通方案。集成是干净的。数据是可访问的。可观测性已经就位。部署流程支持演进中的智能体系统所需要的节奏。

结果是一个比构建在没有为支持它而设计的架构上更容易构建、更容易运营、也更容易随时间改进的自动化系统。

复利回报

先做后端工作还有一个在项目规划中经常被低估的理由:这些改进会产生复利。

一个设计良好的服务边界,不只是支持当前的自动化项目,而是支持每一个未来触碰同一服务的自动化项目。清晰的 API、可靠的可观测性、扎实的部署流水线,是随时间增值的资产。它们让下一个自动化项目构建起来更快,运营起来更容易,也更不容易制造出减慢当前这个项目速度的那种后端阻力。

在构建自动化层之前先投资平台基础的团队,往往发现每一个后续的工作流程自动化项目,都比前一个更快、更顺。在现有架构上直接构建自动化的团队,往往发现相反的情况:每个项目都继承了之前项目积累的技术债务,变更的成本随时间增加而不是减少。

后端不是工作流程自动化项目里光鲜的部分,但它是决定自动化能否在生产环境里可靠运转、以及团队能否在不让系统越来越难运营的情况下持续改进它的那个部分。这让它成为值得先做对的那个部分。