正在统计访客…
浏览全部文档
开始 · 9找到适合你的 Runifold 学习路径45 分钟掌握 Runifold理解完整的 Runifold 平台第一次可信运行选择正确的执行 API选择 Crate 与 Cargo Feature构建常见 Runifold 应用Runifold 常见问题排查 Runifold 应用故障
执行内核 · 7理解 RunContext安全协调外部副作用使用预算与取消限制工作安全地处理错误与重试事件、Journal 与执行证据设计 Capability 安全执行从 Checkpoint 安全恢复
模型与服务商 · 7在避免重复输出的前提下路由模型选择并配置模型服务商使用服务商中立的模型协议基于 Provider Runtime 契约构建使用 OpenAI 控制面与 Realtime API测试与 Benchmark Provider Adapter配置 OpenAI、Anthropic、Gemini 与 Ollama
Agent · 7构建并配置 Agent为 Agent 添加类型化工具加入会话与语义记忆安全地委派给子 Agent返回结构化 Rust 值在不丢失语义的前提下流式输出使用检索为 Agent 提供事实依据
持久工作流 · 7组合确定性工作流让工作流持久化运行持久工作流 Worker协调 Timer、Signal 与持久等待运行多租户工作流基础设施运行并行 Branch 与安全 Race对持久 Workflow 进行版本管理
集成 · 7通过 MCP 连接外部能力选择存储与持久化边界通过 MCP Tasks 暴露持久工作构建并评估检索流水线使用 MCP Resources、Prompts 与 Sampling在不跨越权限的前提下缓存 MCP 响应在 Rust Web Service 中部署 Runifold
质量与运维 · 10在没有网络的情况下测试评估质量并阻止回归观测完整运行树在浏览器与边缘环境安全运行准确理解可靠性声明在 CI 中运行可复现评测使用 SLO 运维 Runifold治理 Task 保留与删除把审计证据归档到 S3-Compatible WORM 存储管理兼容性与可信发布
文档/持久工作流
第一次使用?通过 45 分钟核心课程建立完整心智模型
持久工作流

运行多租户工作流基础设施

隔离租户身份、Admission、公平认领、持久预算账本、清理所有权与不可变 Tombstone。

实践指南·12 min

租户是安全边界

WorkflowTenantId 参与排队、Claim、Wait、Signal、预算、Task Lookup、Retention 与审计, 不是装饰性 Metadata。每次 Store 操作都必须先按 Tenant 限定,再观察或修改 Workflow Identity。

可能泄漏存在性时,把跨租户 Lookup 统一成 Not Found。先认证调用者,再把应用身份转换成 Workflow Tenant。

Admission 与公平性

Admission Policy 在 Task 进入系统前限制每个 Tenant 的排队与活跃工作。Claim 顺序应避免 Hot Tenant 独占所有 Worker;全局和每个 Tenant 的 Batch Size 与并发都保持有界。

Backpressure 是产品行为。返回类型化 Overload 或 Quota 结果;不要接受无法持久表示的工作, 然后期待 Worker 最终追上。

持久预算账本

内存 Run Budget 约束一棵因果执行树。多进程 Workflow Budget 还需要持久 Reservation 与 不可变 Audit Fact。Dispatch 前预留,在带栅栏所有权下协调实际用量并 Release 或 Forfeit。

Projection 与 Supervisor 可以把 Ledger 转换成 Metric,但 Metric 不是 Ledger。一次漏采 不能恢复消费权限。

保留控制面

物理清理只处理超过运维 Retention 的 Terminal Task。Cleanup Ownership 也按 Tenant 带 Lease 与 Fencing。Candidate Selection、Tombstone Insert、依赖状态删除与 Task 删除必须 原子完成。

普通 Lookup 返回 Not Found 后,不可变 Tombstone 仍保存 Tenant、Workflow Identity、终止 状态与生命周期时间。删除审计证据需要另一项独立策略。

运维不变量

  • 每条存储与授权路径都包含 Tenant Identity;
  • 过期 Claim 或 Cleanup Owner 无法写入;
  • Queued、Leased 与 Waiting Task 永远不是 Retention Candidate;
  • 需要时,预算 Reservation 与 Task Transition 原子提交;
  • Task ID 与 Signal ID 本身永远不授予权限;
  • Fairness、Quota、Cleanup 与 Projection Batch 都保持有界;
  • Audit Fact 比可变运维记录保存得更久。

配置 Tenant Admission

let tenant = WorkflowTenantId::parse("tenant-acme")?;
store
    .set_tenant_policy(
        tenant.clone(),
        WorkflowTenantPolicy::new(
            1_000, // 最大 Non-terminal Task
            20,    // 最大 Concurrent Lease
        )?,
    )
    .await?;
 
let task = WorkflowTask::new("order-review", 1, input)?
    .with_tenant(tenant);
store.enqueue(task).await?;

WorkflowTenantId 必须从服务端已认证身份派生,不能直接接受模型或不可信 Request Body 中的值。入队前配置 Policy,拒绝时返回类型化 Overload / Quota Result。按有界 Tenant Class 统计 Queue Age 与 Active Lease,不要把 Tenant ID 放进 Metric Label。