Datadog 借助 Claude 和 Cursor 完成测试驱动式生产环境迁移

Datadog 借助 Claude 和 Cursor 完成测试驱动式生产环境迁移

近日,Datadog 工程师 Arnold Wakim 发表文章,分享了团队利用 AI 工具迭代核心生产系统"Stream Router"的经历。通过引入 Claude 和 Cursor,Datadog 成功完成了从键值模型到关系型模型的迁移,突破了存储后端的硬性性能瓶颈。

此次迁移不仅将单次操作耗时从 45 分钟大幅降低至约 1 秒,还将数据库成本降低了 90%。这一案例为 AI 在复杂生产环境重构中的应用提供了极具参考价值的实战样本。

核心挑战:键值模型的极限

Stream Router 是 Datadog 用于管理指标管道路由的 API。其初始版本基于键值(KV)模型构建,采用最终一致性架构。随着路由表不断扩展,该系统逐渐触及了 KV 数据库的事务容量上限。

在高负载场景下,由于存在数千次串行往返请求,单次操作耗时最长可达 45 分钟,性能出现大幅衰减。此外,在 KV 模型中,程序需要自行重建数据关联关系,将数万个条目拉取到 Pod 进程内部,模拟实现关系型数据库中外键强制执行的逻辑,这不仅效率低下,且维护成本高。

为了解决这一问题,Datadog 决定重新设计数据模型,用外键取代应用代码中的冗余逻辑,并将后端从 FoundationDB 迁移至 PostgreSQL。

解决方案:测试驱动与 AI 辅助重构

面对庞大的代码库重构工作,Datadog 引入了 Claude 和 Cursor 来加速基于测试驱动的系统化重构过程。

工作流程

迁移过程主要分为三个阶段:

  1. 意图描述:使用 Claude 描述每个关键函数的业务意图。
  2. 测试修复:通过提供预期行为及上一步的上下文,编写有针对性的提示词,让 AI 修复失败的测试用例。
  3. 蓝绿部署:使用蓝绿部署方案上线到生产环境。

在具体操作中,AI 并不能自主生成完整可用的代码。针对每一个方法,工程师会提供原有实现、新的数据结构以及一条失败测试用例。大模型先输出一版初稿代码,再由测试用例校验代码逻辑是否正确。

关键成功要素

Wakim 指出,此次迁移能够顺利完成离不开三个关键要素:

  • 高度模块化的代码架构:使得新的 Stream Router 可以在 PostgreSQL 上实现相同的 API,而无需修改其他部分。
  • 完备的测试用例:为每次 AI 生成的变更提供了明确的通过/失败标准。完备的测试套件决定了团队能在多大程度上信任 AI 生成的代码。
  • 并行部署基础设施:允许两个独立的 Stream Router 实例并排运行,处理相同的请求。同时通过功能开关控制客户端流量在两者之间切换。

为了确保迁移安全,每个集群内部都部署了独立的校验服务,定期对比两个系统之间的路由响应。一旦出现不一致,系统会立即向团队发送告警。

实践反思:AI 的局限性与应对

尽管迁移取得了成功,Wakim 也客观指出了这套方案存在的不足之处。

1. 性能优化需人工介入

Claude 倾向于生成逻辑正确但性能欠佳的查询。像批处理、UNNEST 技巧、公用表表达式(CTE)等小众优化,AI 目前尚无法独立发现,即使这些模式在文献中已经存在。

在实际操作中,AI 生成的查询虽然返回了正确结果,但产生了大量不必要的网络往返请求。团队需要人工编写优化版本,一旦大模型见过这种模式后,便能在后续方法中复现。

2. 词元(Token)消耗过高

整个流程造成了较高的 Token 消耗,主要原因有二:
* 向大模型输入完整的测试输出日志,而非精简后的片段。
* 整个流程需要反复传入测试输出、代码上下文与表结构信息,造成多次迭代循环。

迁移成果:性能与成本的双重飞跃

经过重构与迁移,Stream Router 的性能指标得到了显著改善:

  • 操作时间:从最长 45 分钟降至约 1 秒。
  • 延迟:从数百毫秒降至仅几毫秒。
  • 存储占用:最高缩减至原先的 1/40。
  • 数据库成本:降低了 90%。

此外,引入 PostgreSQL 和 DuckDB 简化了关系处理并提高了查询效率,同时 CPU 和内存使用率也明显下降。

结语

Datadog 的这次实践表明,AI 在复杂的系统重构中并非"全自动"的替代者,而是高效的辅助者。通过"完备测试 + 模块化架构 + 并行验证"的组合拳,结合 AI 的代码生成能力,企业可以在保证生产环境安全的前提下,高效完成核心系统的现代化改造。

参考资料: