Rivet Actors RunnerConfigKind 枚举详解:normal 与 serverless 两种运行模式的配置模型

发布时间:2026/11/12 19:23:39

Rivet Actors RunnerConfigKind 枚举详解:normal 与 serverless 两种运行模式的配置模型 Rivet Actors RunnerConfigKind 枚举详解normal 与 serverless 两种运行模式的配置模型【免费下载链接】actorsRivet Actors are the primitive for stateful workloads. Built for AI agents, collaborative apps, and durable execution.项目地址: https://gitcode.com/GitHub_Trending/riv/actors本文聚焦 Rivet Actors SDKRust中由 OpenAPI 生成的模型RunnerConfigKind完整解析其两个枚举变体RunnerConfigKindOneOfnormal 模式与RunnerConfigKindOneOf1serverless 模式的字段语义、JSON 序列化形态并结合后端版本化迁移源码namespace_runner_config.rs说明该枚举在配置演进中的真实作用。读完本文你将掌握 Runner 配置的完整字段表、两种模式的核心差异以及如何在实际代码中构造与解析该配置。背景RunnerConfigKind 在模型体系中的位置RunnerConfigKind是rivet-api-publicRivet Actors 公共 APIRust SDK 中描述Runner 运行配置类型的枚举模型源码位于 engine/sdks/rust/api-full/rust/src/models/runner_config_kind.rs。它与RunnerConfig、RunnerConfigResponse等模型共同组成 API 对 Actor 运行器Runner配置的完整描述。从 API 参考文档 engine/sdks/rust/api-full/rust/docs/RunnerConfigKind.md 可以看到该枚举只有两个变体NameDescriptionRunnerConfigKindOneOfRunnerConfigKindOneOf1文档本身是 OpenAPI Generator 自动生成的模型参考描述为空但其含义需要结合相邻模型文档与实现源码才能完整还原。它的本质是一个未标记枚举untagged enum——即一个字段既可以承载 normal 模式配置、也可以承载 serverless 模式配置的判别联合discriminated union。这也对应了 Rivet 的general-runtime-modes概念一个命名空间下的 Runner 可以选择常驻normal或Serverless两种运行形态。枚举定义untagged 联合与默认变体#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum RunnerConfigKind { RunnerConfigKindOneOf(Boxmodels::RunnerConfigKindOneOf), RunnerConfigKindOneOf1(Boxmodels::RunnerConfigKindOneOf1), } impl Default for RunnerConfigKind { fn default() - Self { Self::RunnerConfigKindOneOf(Default::default()) } }关键实现细节engine/sdks/rust/api-full/rust/src/models/runner_config_kind.rs#[serde(untagged)]意味着不带任何外部标签直接内联序列化变体内容。反序列化时 serde 依次尝试每个变体直到某个变体成功解析为止。Default实现指向RunnerConfigKindOneOf即当用户不显式选择时默认采用 normal 模式语义。两个变体分别包装了RunnerConfigKindOneOf与RunnerConfigKindOneOf1这两个结构体各自只有一个字段充当命名空间包装器。两种变体的内部结构RunnerConfigKindOneOfnormal 模式对应文档 engine/sdks/rust/api-full/rust/docs/RunnerConfigKindOneOf.md源码在 engine/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of.rspub struct RunnerConfigKindOneOf { #[serde(rename normal)] pub normal: Boxmodels::RunnerConfigKindOneOfNormal, }它只包含一个normal字段指向 RunnerConfigKindOneOfNormal。JSON 形态为{ normal: { ... } }。RunnerConfigKindOneOf1serverless 模式对应文档 engine/sdks/rust/api-full/rust/docs/RunnerConfigKindOneOf1.md源码在 engine/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1.rspub struct RunnerConfigKindOneOf1 { #[serde(rename serverless)] pub serverless: Boxmodels::RunnerConfigKindOneOf1Serverless, }它只包含一个serverless字段指向 RunnerConfigKindOneOf1Serverless。JSON 形态为{ serverless: { ... } }。由于RunnerConfigKind是 untagged 枚举序列化时{ normal: ... }会被识别为RunnerConfigKindOneOf{ serverless: ... }会被识别为RunnerConfigKindOneOf1从而通过字段名即标签的方式实现了模式判别。字段详解normal 模式配置RunnerConfigKindOneOfNormalRunnerConfigKindOneOfNormal源码engine/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_normal.rs定义了常驻模式下与Actor 驱逐eviction相关的三个速率控制参数以及版本升级时的排空开关字段类型单位说明actor_eviction_delayOptioni32秒驱逐延迟时间actor_eviction_periodOptioni32秒驱逐周期actor_eviction_rateOptionf32每秒 Actor 数驱逐速率上限drain_on_version_upgradeOptionbool—版本升级时是否先排空再升级这些字段控制着平台在资源压力下回收空闲 Actor 的行为actor_eviction_period决定了驱逐检查的间隔actor_eviction_rate限制了单位时间内的驱逐数量避免雪崩actor_eviction_delay则给 Actor 一段宽限期再执行回收。所有字段均声明为OptionOptionT通过serde_with::rust::double_option用于区分字段缺失与显式 null两种状态。字段详解serverless 模式配置RunnerConfigKindOneOf1Serverlessserverless 模式是字段最丰富的变体见 RunnerConfigKindOneOf1Serverless源码engine/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1_serverless.rs字段类型单位说明request_lifespani32必填秒单个请求的最长生命周期到达后请求结束urlString必填—serverless 服务的入口地址actor_eviction_delayOptioni32秒驱逐延迟时间actor_eviction_periodOptioni32秒驱逐周期actor_eviction_rateOptionf32每秒 Actor 数驱逐速率上限drain_grace_periodOptioni32秒排空宽限期drain_on_version_upgradeOptionbool—版本升级时是否先排空headersOptionHashMapString, String—附加请求头max_concurrent_actorsOptioni64—最大并发 Actor 数metadata_poll_intervalOptioni64毫秒元数据轮询间隔未设置时使用全局默认值max_runnersOptioni32—已弃用min_runnersOptioni32—已弃用runners_marginOptioni32—已弃用slots_per_runnerOptioni32—已弃用值得注意的几点request_lifespan与url是必填字段构造器RunnerConfigKindOneOf1Serverless::new(request_lifespan, url)也印证了这一点见源码第 57 行。max_runners、min_runners、runners_margin、slots_per_runner四个字段在文档中标注为Deprecated其能力已被max_concurrent_actors取代——这一演进在后端迁移代码中有明确体现。headers允许为 serverless 目标注入自定义请求头适合鉴权或路由场景。RunnerConfig两种模式的顶层组合RunnerConfigKind通常不会单独出现而是作为 RunnerConfig 的组成部分被使用。RunnerConfig源码engine/sdks/rust/api-full/rust/src/models/runner_config.rs将两种模式同时以必填字段列出pub struct RunnerConfig { #[serde(rename normal)] pub normal: Boxmodels::RunnerConfigKindOneOfNormal, #[serde(rename serverless)] pub serverless: Boxmodels::RunnerConfigKindOneOf1Serverless, /// Deprecated. #[serde(rename drain_on_version_upgrade, default, ...)] pub drain_on_version_upgrade: OptionOptionbool, #[serde(rename metadata, ...)] pub metadata: OptionOptionserde_json::Value, }这种两个模式都出现、运行时择一使用的设计让配置对象可以在不同命名空间/环境中复用normal 与 serverless 的配置并存于同一个RunnerConfig中平台根据实际运行的运行模式选择对应字段。此外drain_on_version_upgrade在RunnerConfig层标记为Deprecated该开关已被下沉到各模式内部。metadata是一个自由格式的serde_json::Value用于携带自定义元数据。响应侧模型 RunnerConfigResponse 在RunnerConfig基础上额外增加了protocol_version协议版本与runner_pool_error运行池错误信息两个字段用于 API 回传时附带运行时状态。后端佐证配置版本的迁移链v1 → v5在服务端实现中Runner 配置同样是按版本演进的。位于 engine/sdks/rust/data/src/versioned/namespace_runner_config.rs 的迁移代码展示了RunnerConfigKind从 v1 到 v5 的完整演进过程可以从源码结构推断出以下关键事实v1 仅支持 serverless 模式v1到v2的迁移中v1配置被整体包进RunnerConfigKind::Serverless而反向迁移时遇到RunnerConfigKind::Normal会直接bail!(namespace runner config v1 does not support normal runner config)——也就是说 normal 模式是后续版本才引入的。字段演进路径清晰v2→v3 迁移保留url、headers、request_lifespan、slots_per_runner、min_runners、max_runners、runners_margin等字段到 v4→v5 迁移时max_runners as u64被映射为max_concurrent_actors与 SDK 中弃用max_runners、引入max_concurrent_actors的字段标注完全吻合。Normal 变体在 v2 之后持续存在从 v2 到 v5 的所有版本都定义了RunnerConfigKind::Normal与RunnerConfigKind::Serverless(serverless)两个变体与 SDK 中RunnerConfigKind枚举的两个变体一一对应。这段迁移链从实现层面证实了RunnerConfigKind的 two-variant 设计不仅存在于 API 模型层也是服务端命名空间配置的持久化形态SDK 文档中的 Deprecated 标注与后端迁移逻辑保持一致。序列化形态与使用要点由于#[serde(untagged)]RunnerConfigKind在 JSON 中不携带任何枚举标签直接表现为嵌套对象// 变体 1normal 模式 { normal: { actor_eviction_rate: 5.0, actor_eviction_period: 60, drain_on_version_upgrade: true } } // 变体 2serverless 模式 { serverless: { url: https://worker.example.com/handle, request_lifespan: 30, max_concurrent_actors: 100, headers: { Authorization: Bearer xxx } } }使用时的几个要点构造时通过RunnerConfigKind::RunnerConfigKindOneOf(Box::new(...))显式包装Default默认取 normal 变体。反序列化依赖字段名判别normal/serverless字段必须出现否则对应的 untagged 变体匹配失败。必填字段注意serverless 变体的url与request_lifespan缺失会导致该变体解析失败此时 untagged 枚举会回退尝试其他变体。可选字段的三态语义OptionOptionTdouble option区分JSON 中未出现None与JSON 中显式为 nullSome(None)在平台侧两者处理策略不同。弃用字段避免使用max_runners、min_runners、runners_margin、slots_per_runner请改用max_concurrent_actors。小结RunnerConfigKind虽然是一份由 OpenAPI 自动生成的简短枚举文档但它精确刻画了 Rivet Actors 的核心运行模型两个变体分别对应normal常驻与serverless按需两种运行模式通过untagged 联合 字段名判别实现无标签的多态序列化字段设计围绕Actor 驱逐控制actor_eviction_*与版本升级排空drain_on_version_upgrade两大主题serverless 模式额外包含url、request_lifespan、headers、max_concurrent_actors等运行时参数服务端namespace_runner_config.rs的 v1→v5 迁移链验证了该枚举的演进历史与 Deprecated 标注的准确性。对于需要以 Rust 方式操作 Rivet Actors 命名空间配置的开发者本文的字段表与源码引用路径模型定义、normal 字段、serverless 字段、后端迁移可作为直接查阅与联调的依据。【免费下载链接】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),仅供参考
延伸阅读

更多相关文章

2026/11/11 21:07:46

别找临时中转:用 TaoToken 给 OpenCode 做兼容通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/12 13:04:16

内网离线部署Qwen3:Docker+vLLM实战流程

1. 项目概述:为什么内网离线部署Qwen3必须用DockervLLM组合我去年在一家做工业智能质检的客户现场,接手过一个典型的“三无”AI项目:无外网、无GPU集群管理平台、无专职运维。客户产线边缘服务器只有两台A100 40G单卡机器,要求把Q…

2026/11/12 0:17:22

Codex 的 Base URL 填 TaoToken,通义千问 Qwen2 在编辑器中直接跑通

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/12 20:34:20

没有低级电工证课程怎么找工作?内部消息告诉你真实通过率

没有低级电工证课程怎么找工作?内部消息告诉你真实通过率 你还在为没有特种作业证而发愁?洛阳市政公用工程行业的朋友,别再等了,现在 低级电工证课程 已成为进入施工现场的门槛。最近我收到多个同行私下分享的 内部消息…

2026/11/12 20:34:20

电工证是统一的吗?通过率揭秘与南阳卧龙区水利从业者避坑指南

电工证是统一的吗?通过率揭秘与南阳卧龙区水利从业者避坑指南 你是不是也遇到过这样的问题: 不知道去哪报名怕被中介坑 ?特别是像你这样在南阳卧龙区从事水利工程的同行,想考证又怕走错路,被忽悠交了钱却办不了证?其实,电工证不是统一发的,但也不是…

2026/11/12 20:34:20

高级工电工证审核官方回应:工地太忙根本没时间复习考试怎么办

高级工电工证审核官方回应:工地太忙根本没时间复习考试怎么办 工地太忙根本没时间复习考试,这种感觉我懂,每天跑现场、盯进度、处理各种突发状况,哪还有精力去准备考试?别急,官方回应来了,高级工电工证审核其实有一套系统化的流程,即使你在工地忙得脚…

2026/11/12 20:35:13

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/12 9:51:42

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑