
Rivet Actors CrashPolicy 详解restart / sleep / destroy 三种崩溃恢复策略的语义、默认值与源码实现【免费下载链接】actorsRivet Actors are the primitive for stateful workloads. Built for AI agents, collaborative apps, and durable execution.项目地址: https://gitcode.com/GitHub_Trending/riv/actorsCrashPolicy是 Rivet Actors 中控制有状态 Actor 在崩溃、异常退出或无法分配资源时如何处置的核心枚举。本指南以 SDK 自动生成的模型文档 engine/sdks/rust/api-full/rust/docs/CrashPolicy.md 为骨架结合引擎侧调度工作流、API 请求模型、SDK 枚举定义与端到端测试完整讲解三种取值restart、sleep、destroy的行为语义、各语言 SDK 的用法差异以及底层实现依据帮助你在 AI Agent、协作应用、持久化执行等有状态负载中正确选择崩溃恢复策略。CrashPolicy 是什么CrashPolicy是 Actor 在生命周期中遇到**异常终止crash**时的处理策略。它属于 Actor 创建请求的必填字段在 Actor 的整个生命周期内固化保存引擎在 Actor 停止Stop或分配Allocate流程中根据该策略决定下一步动作。模型文档给出了最简定义——一个三值枚举NameValueRestartrestartSleepsleepDestroydestroyRestartActor 崩溃后重新分配、重新启动继续对外提供能力SleepActor 进入休眠状态不再占用计算资源等待后续被唤醒DestroyActor 被彻底销毁清理其全部状态。从源码结构看这个枚举同时出现在外部 API 模型和引擎内部类型两套定义中二者取值一致但默认值不同下文详述。各语言 SDK 中的枚举定义CrashPolicy由 API 定义自动生成到各语言 SDK序列化后的 wire format 均为小写字符串restart/sleep/destroy。Rust SDK生成代码位于 engine/sdks/rust/api-full/rust/src/models/crash_policy.rs#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum CrashPolicy { #[serde(rename restart)] Restart, #[serde(rename sleep)] Sleep, #[serde(rename destroy)] Destroy, } impl std::fmt::Display for CrashPolicy { fn fmt(self, f: mut std::fmt::Formatter) - std::fmt::Result { match self { Self::Restart write!(f, restart), Self::Sleep write!(f, sleep), Self::Destroy write!(f, destroy), } } } impl Default for CrashPolicy { fn default() - CrashPolicy { Self::Restart } }关键点枚举派生Serialize/Deserialize通过#[serde(rename ...)]保证与 JSON wire format 完全对应实现Display可直接打印出restart等字符串Rust SDK 的Default实现为Restart——在 SDK 层如果用户不显式指定默认按restart处理。Rust SDK 中该类型还被Actor、ActorsCreateRequest、ActorsGetOrCreateRequest等模型引用例如 engine/sdks/rust/api-full/rust/docs/ActorsCreateRequest.md 中crash_policy字段的类型即models::CrashPolicy。TypeScript SDKFern 生成的类型定义位于 engine/sdks/typescript/api-full/src/api/types/CrashPolicy.tsexport type CrashPolicy restart | sleep | destroy; export const CrashPolicy { Restart: restart, Sleep: sleep, Destroy: destroy, } as const;TypeScript 侧同时提供字符串字面量联合类型和同名常量对象既可直接书写restart也可以使用CrashPolicy.Restart获得类型安全。Go SDK定义位于 engine/sdks/go/api-full/types.go第 377 行起type CrashPolicy string const ( CrashPolicyRestart CrashPolicy restart CrashPolicySleep CrashPolicy sleep CrashPolicyDestroy CrashPolicy destroy )同时提供了NewCrashPolicyFromString解析函数与Ptr()方法用于与omitempty的可选字段配合。引擎内部的 CrashPolicy默认值是 Destroy注意一个关键差异引擎内部类型API 服务层的默认策略是Destroy而不是restart。定义见 engine/packages/types/src/actors.rs#[derive(Debug, Copy, Clone, Default, Serialize, Deserialize, PartialEq, Eq, Hash, ToSchema)] #[serde(rename_all snake_case)] pub enum CrashPolicy { Restart, Sleep, #[default] Destroy, }这条信息非常重要因为同一枚举在 SDK 侧Default Restart面向客户端构造请求时的便捷默认在引擎服务端Default Destroy面向服务端反序列化缺失字段时的安全默认。这意味着如果请求中省略crash_policy服务端将按destroy语义处理。因此文档和官方示例见下文都建议显式传值不要把行为交给默认值决定。同时Actor结构体同一文件中也持久化保存了crash_policy: CrashPolicy字段伴随 Actor 的整个生命周期。崩溃策略如何影响引擎调度源码级实现分配失败时Sleep 立即休眠其余进入等待队列crash_policy在分配allocate阶段直接参与决策。见 engine/packages/pegboard/src/workflows/actor/runtime.rs 第 447 行附近match (crash_policy, input.force_allocate, for_serverless) { (CrashPolicy::Sleep, false, false) Ok(AllocateActorOutputV2 { serverless: false, status: AllocateActorStatus::Sleep, }), // Write the actor to the alloc queue to wait _ { let pending_allocation_ts util::timestamp::now(); tx.write( keys::ns::PendingActorByRunnerNameSelectorKey::new( namespace_id, runner_name_selector.clone(), pending_allocation_ts, input.actor_id, ), input.generation, )?; ... } }语义解读CrashPolicy::Sleep当目标计算池由runner_name_selector指定当前没有可用容量时Actor 不排队等待直接进入Sleep状态把sleep_ts写入数据库避免空耗调度资源其他策略含 Restart 和 Destroy写入PendingActorByRunnerNameSelectorKey分配等待队列等待对应池子出现空闲 runner 后重新分配。该分支还受force_allocate与for_serverless池子是否为 serverless 类型影响serverless 池或强制分配场景下即使 Sleep 策略也会进入等待队列。停止/崩溃后Restart 重试优雅退出则结束Actor 停止流程中对crash_policy的决策见 engine/packages/pegboard/src/workflows/actor/mod.rs 第 1242 行附近let graceful_exit !state.going_away matches!( variant, StoppedVariant::Normal { code: protocol::mk2::StopCode::Ok, .. } ); match (input.crash_policy, graceful_exit) { (CrashPolicy::Restart, false) { match runtime::reschedule_actor(...) { runtime::SpawnActorOutput::Allocated { .. } {} runtime::SpawnActorOutput::Sleep { state.sleeping true; ... } runtime::SpawnActorOutput::Destroy { return Ok(StoppedResult::Destroy); } } } ... }语义解读(Restart, false)Actor 以非优雅方式StopCode不是Ok即崩溃终止时触发reschedule_actor重新调度——这正是崩溃后自动重启的实现路径。重启结果有三种成功重新分配Allocated、分配超时转入休眠Sleep、被销毁Destroygraceful_exit true正常停止例如显式销毁或收到正常停止码时不触发重启配合其他分支走正常的停止/销毁流程。其中 Restart 策略在等待分配时的超时时间由常量控制engine/packages/pegboard/src/workflows/actor/mod.rs 第 18-19 行/// How long an actor with crash_policy Restart should wait pending before setting itself to sleep. const RESTART_PENDING_TIMEOUT_MS: i64 util::duration::seconds(60);即Restart 策略的 Actor 如果 60 秒内未能完成重新分配会退化为进入休眠状态reschedule_actor以AllocationOverride::PendingTimeout { pending_timeout: RESTART_PENDING_TIMEOUT_MS }调用而不是无限期等待。通过 API 创建带崩溃策略的 Actorcrash_policy是创建请求的必填字段。引擎 API 请求模型见 engine/packages/api-types/src/actors/create.rs#[derive(Serialize, Deserialize, ToSchema)] #[serde(deny_unknown_fields)] #[schema(as ActorsCreateRequest)] pub struct CreateRequest { // Ignored in api-peer pub datacenter: OptionString, pub name: String, pub key: OptionString, /// Arbitrary base64 encoded binary data. pub input: OptionString, pub runner_name_selector: String, pub crash_policy: rivet_types::actors::CrashPolicy, }curl 示例官方调试文档 docs/content/docs/debugging.mdx 给出了创建与 get-or-create 的完整示例。创建 Actor始终新建curl -X POST $RIVET_API/actors?namespace$RIVET_NAMESPACE \ -H Authorization: Bearer $RIVET_TOKEN \ -H Content-Type: application/json \ -d { name: my-actor, runner_name_selector: default, crash_policy: restart }按key幂等创建或获取curl -X PUT $RIVET_API/actors?namespace$RIVET_NAMESPACE \ -H Authorization: Bearer $RIVET_TOKEN \ -H Content-Type: application/json \ -d { name: my-actor, key: [\default\], runner_name_selector: default, crash_policy: restart }请求字段速查参考 container-runner/docs/multiple-compute-pools.md字段必填说明name是已在构建中注册的 Actor 名称runner_name_selector是指定运行计算池pool名称例如version_acrash_policy是restart、sleep或destroykeyPUT专用get-or-create 的稳定身份标识input否base64 编码的二进制输入创建时传递给 Actordatacenter否将 Actor 固定到指定数据中心namespace是必填查询参数。POST /actors总是新建PUT /actors幂等复用。Node.js 示例e2e 测试仓库自带的端到端脚本 container-runner/examples/e2e-test/create-actor.mjs 展示了生产可用的调用方式且支持通过环境变量覆盖策略const body { name: ACTOR_NAME, key, input, runner_name_selector: RUNNER_NAME, crash_policy: process.env.ACTOR_CRASH_POLICY || destroy, }; const res await fetch(url, { method: POST, headers: { content-type: application/json }, body: JSON.stringify(body), });该示例默认crash_policy为destroy与引擎内部默认一致运行时可执行ACTOR_CRASH_POLICYrestart node create-actor.mjs切换策略。同目录下 create-cloud-actor.mjs、load-test.mjs 等脚本也以crash_policy: destroy构造请求。端到端测试验证sleep 策略的崩溃行为引擎的端到端测试直接验证了崩溃策略的行为。engine/packages/engine/tests/envoy/actors_lifecycle.rs 中的envoy_crash_policy_sleep测试第 869-904 行起构造了一个启动即崩溃的测试 ActorCrashOnStartActor并以CrashPolicy::Sleep创建// MARK: 5. Crash Handling and Policies #[test] fn envoy_crash_policy_sleep() { common::run( common::TestOpts::new(1).with_timeout(75), |ctx| async move { ... // Create actor with sleep crash policy let res common::create_actor( ctx.leader_dc().guard_port(), namespace, crash-actor, envoy.pool_name(), rivet_types::actors::CrashPolicy::Sleep, ) .await; ... }, ); }测试流程验证了Actor 崩溃后在sleep策略下不会无限重启而是进入休眠状态sleep_ts被记录从而为崩溃后按策略处置提供了可重复的自动化验证。该测试文件中也大量使用CrashPolicy::Sleep构造生命周期测试场景如第 44、109、235、900 行等是阅读崩溃处理逻辑的绝佳入口。三种策略的选择建议结合文档与源码行为可以给出如下选型参考场景推荐策略理由无状态或可恢复的服务如游戏匹配、HTTP workerrestart崩溃后自动重新调度60 秒内分配失败才转入休眠可用性优先需要严格节省资源的长驻 Actor如空闲会话、按需唤醒的 AI Agentsleep无可用容量时立即休眠不排队空耗可被后续事件唤醒一次性任务、实验性脚本、失败无意义的负载destroy崩溃后彻底清理状态避免僵尸 Actor 占用命名空间资源需要特别强调的是crash_policy是创建时的必填字段但在 SDK 与服务端存在两套默认值Rust SDK 默认restart、引擎服务端默认destroy务必显式指定避免跨语言、跨版本的行为不一致Restart 不等于无限重试分配等待超过 60 秒RESTART_PENDING_TIMEOUT_MS会转入休眠Sleep 策略下 Actor 仍然保留actor_id与数据库记录通过 get-or-createPUT /actors或后续唤醒机制可恢复而 Destroy 会彻底移除实例。延伸阅读模型文档engine/sdks/rust/api-full/rust/docs/CrashPolicy.md、engine/sdks/rust/api-full/rust/docs/ActorsCreateRequest.md、engine/sdks/rust/api-full/rust/docs/Actor.md引擎内部类型定义engine/packages/types/src/actors.rs分配阶段策略分支engine/packages/pegboard/src/workflows/actor/runtime.rs停止/重启阶段策略分支engine/packages/pegboard/src/workflows/actor/mod.rsAPI 请求模型engine/packages/api-types/src/actors/create.rs端到端测试engine/packages/engine/tests/envoy/actors_lifecycle.rs实操示例docs/content/docs/debugging.mdx、container-runner/examples/e2e-test/create-actor.mjs、container-runner/docs/multiple-compute-pools.md【免费下载链接】actorsRivet Actors are the primitive for stateful workloads. Built for AI agents, collaborative apps, and durable execution.项目地址: https://gitcode.com/GitHub_Trending/riv/actors创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考