本技能是 DBOS Rust SDK(dbos crate)的使用指南,面向需要构建可靠、容错 Rust 应用的开发者。它提供了一组按优先级分类的最佳实践规则,用于指导在 Rust 代码中正确使用 DBOS 的持久化工作流能力。
用途
该技能适用于以下场景:向现有 Rust 代码添加 DBOS;创建工作流和步骤;在工作流内并发运行 DBOS 调用;使用队列进行并发控制;实现工作流通信(事件、消息、流);配置和启动 DBOS 应用;从外部应用使用 DBOS Client;测试 DBOS 应用。
主要能力
技能按优先级组织规则,涵盖九类:生命周期(CRITICAL)、工作流(CRITICAL)、步骤(HIGH)、队列(HIGH)、通信(MEDIUM)、模式(MEDIUM)、测试(LOW-MEDIUM)、客户端(MEDIUM)和高级(LOW)。每条规则附有前缀标识,便于按类别查阅。
使用方式
安装依赖:使用 cargo add 添加 dbos(0.6)、tokio(full 特性)、serde(derive 特性)、thiserror、tracing-subscriber、futures 以及开发依赖 uuid(v4 特性)。serde 用于工作流输入输出,thiserror 用于工作流错误类型,tracing-subscriber 用于查看 DBOS 日志,futures 用于 join DBOS 调用(try_join_all),uuid 用于测试中生成新的工作流 ID。DBOS 默认运行在 Tokio 上,smol 和 async-global-executor 是 Cargo 特性。注意:DBOS for Rust 不支持 DBOS Conductor 或 DBOS Cloud。
配置与启动:应用必须创建 DBOS 实例、注册每个工作流并在运行任何工作流之前启动。应用版本是必需的,DBOS for Rust 不会自动计算版本,需设置 config.app_version(或 DBOS__APPVERSION),否则启动失败。新应用设为 "0.1.0" 或 env!("CARGO_PKG_VERSION");编辑现有应用时保持已配置版本不变。Config::from_env(app_name) 从 DBOS_SYSTEM_DATABASE_URL 读取系统数据库 URL,数据库不存在时 DBOS 会创建。DBOS 实例可廉价克隆,工作流外部可调用其方法(dbos.send、dbos.cancel、dbos.list_workflows、队列和调度管理);队列、调度和应用版本管理没有自由函数形式;从另一个应用使用 Client。
关键约束
工作流必须具备确定性,非确定性操作应放入步骤。不得在工作流体内对任何 DBOS 调用进行竞态、超时、spawn 或按完成顺序消费(禁止 tokio::select!、tokio::time::timeout、FuturesUnordered、buffer_unordered 或 tokio::spawn 包裹 DBOS 调用);应使用 dbos::select_step! 进行竞态,使用 tokio::join! / futures::future::try_join_all 并发运行,使用 dbos::sleep 等待。每个 DBOS 调用在构建处而非等待处获取步骤 ID,例外是 dbos::patch、dbos::deprecate_patch 和 debouncer 的 debounce,需单独 await,不可放入 join。工作流的 future 必须是 Send + 'static,不得在 .await 期间持有 Rc、std::sync::MutexGuard 或借用。启动子工作流需在父工作流的注册闭包中捕获其 WorkflowRef,WorkflowRef 不能作为工作流输入。不得在步骤内启动或入队工作流,或调用 dbos::recv、dbos::set_event、dbos::patch(会返回 Error::InsideStep)。不得在工作流闭包中捕获 DBOS 实例,应使用自由函数(dbos::send、dbos::cancel_workflow 等)。所有工作流必须在启动前注册;队列在启动后注册,调度在启动后创建。不得从工作流或步骤修改全局变量。使用已存在 ID 启动工作流默认返回现有工作流;设置 workflow_id_reuse_policy: WorkflowIdReusePolicy::Reject 可获得 dbos::sysdb::Error::WorkflowIdInUse。工作流中的 panic 不会导致进程崩溃,工作流保持 PENDING 状态,类似崩溃,在下次启动时恢复。步骤为至少一次语义,没有事务性步骤,因此在步骤中的数据库写入需幂等。
适用场景与限制
适用于需要持久化工作流、容错和并发控制的 Rust 应用开发。限制包括:不支持 DBOS Conductor 和 DBOS Cloud;应用版本必须手动设置;工作流确定性等约束需要严格遵守。更多细节可查阅 references 目录下的规则文件。