Skip to content

如何使用 DBOS 构建高可靠的 TypeScript 耐久工作流

解决分布式应用中的状态丢失与执行失败问题:通过 DBOS 的耐久工作流(Durable Workflows)机制,确保 TypeScript 业务逻辑在面对崩溃或网络波动时能够可靠地恢复执行。

为什么需要这个技能

在传统的 TypeScript 后端开发中,如果一个长耗时的业务流程(如订单处理、多步 API 调用)在执行中途崩溃,很难在原处精准恢复,通常需要编写复杂的重试机制和状态机。

DBOS 将“工作流”的概念引入 TypeScript,通过将逻辑拆分为可记录的“步骤(Step)”,自动持久化执行状态。即使服务器重启,系统也能根据记录自动跳过已完成的步骤,直接从失败点继续执行,从而构建出天然具备容错能力的健壮应用。

适用场景

  • 复杂业务链路:需要跨多个外部服务调用且必须保证最终一致性的流程。
  • 高可靠任务处理:不能因为临时故障而导致任务丢失的异步处理场景。
  • 并发控制:需要通过队列(Queue)严格控制并发量以保护下游资源的场景。
  • 状态机替代:用顺序代码代替繁琐的状态数据库更新逻辑。

核心工作流

1. 环境初始化与启动

在运行任何工作流之前,必须先配置并启动 DBOS 运行时:

typescript
import { DBOS } from "@dbos-inc/dbos-sdk";

async function main() {
  DBOS.setConfig({
    name: "my-app",
    systemDatabaseUrl: process.env.DBOS_SYSTEM_DATABASE_URL,
  });
  await DBOS.launch();
  await myWorkflow();
}

main().catch(console.log);

2. 拆分工作流与步骤

DBOS 的核心原则是:工作流定义逻辑,步骤执行操作。任何涉及外部 I/O 或复杂操作的函数必须通过 DBOS.runStep 调用。

typescript
import { DBOS } from "@dbos-inc/dbos-sdk";

async function fetchData() {
  return await fetch("https://api.example.com").then(r => r.json());
}

async function myWorkflowFn() {
  // 关键:使用 runStep 保证该步骤的可恢复性
  const result = await DBOS.runStep(fetchData, { name: "fetchData" });
  return result;
}
const myWorkflow = DBOS.registerWorkflow(myWorkflowFn);

3. 遵循核心约束

为了确保工作流的确定性(Determinism)和可靠性,必须遵守以下禁令:

  • 禁止在 Step 内部调用、启动或将工作流加入队列。
  • 禁止在工作流中使用非确定性操作(如 Math.random()Date.now()),这些操作必须放入 Step 中执行。
  • 禁止在工作流或步骤中修改全局变量
  • 并发控制:不要使用原生的 Promise.all 或多线程启动工作流,应使用 DBOS.startWorkflow 或 DBOS 队列。

下载和安装

下载 dbos-typescript 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐