返回专辑
·Johan·3 分钟阅读

Component Container:共享 Executor 的收益与故障域

合进程换零拷贝与同调度;重回调与崩溃会连坐,按预算决定拆合。

Component Container:共享 Executor 的收益与故障域

1. 合容器换的是命运共同体

多个组件进同一 component_container,省进程与部分序列化,换来共享 Executor 与崩溃连坐。一个回调变重,邻居一起抖;一个组件崩,容器全体消失。这是架构决策,不是 launch 语法糖。感知栈曾把驱动、整流、检测塞进同一容器:零拷贝香,直到模型换大——检测拖满执行器,驱动发布出现毛刺。检测独立进程后,驱动节拍恢复。合容器省下的拷贝,被一次升级连本带利讨回。

2. 何时合,何时分

:同生命周期、同实时预算、数据面紧耦合的前处理(去畸变→缩放)。用延迟/CPU 分布证明收益,不用进程数当 KPI。:重推理、控制链、第三方黑盒、高崩溃率、需要独立 cgroup/权限。控制与重视觉默认分——与执行器专辑同一条纪律。

| 维度 | 多进程 | 同容器 | | 故障隔离 | 强 | 弱 | | 通信开销 | 较高 | 可更低 | | 调度域 | 独立 | 共享 | | 适合 | 异等级、易崩 | 同等级流水线 |

Composition 不自动给实时性。默认互斥组 + 回调内重活,只是把多进程卡顿收成单进程卡顿。

3. 故障域与注入

合之前先答:崩了谁必须停、谁可降级、重启粒度是组件还是容器。检测可盲走短时(有激光)就不该与控制共命运。必做注入:慢回调、组件崩溃、故意缺插件/缺库。加载失败必须响亮(非零退出或 FATAL),禁止静默少一个 /scan——「节点还在、话题没有」比崩溃更阴险。

发布后无激光:容器在,过滤插件因缺库未加载,日志一行不易察觉。上层「有节点」无话题。修复:补依赖;加载失败升 FATAL 并让容器非零退出。验收必须包含故意缺库——系统应响亮失败。

4. 装配契约

命名空间、remapping、参数文件在 launch 一次说清。接口不稳不要合进程。动态库 ABI 与插件列表进发布物;现场少组件先查加载日志。

python
ComposableNode(
    package="my_perception",
    plugin="my_perception::RectifyNode",
    name="rectify",
    namespace="camera0",
    parameters=[rectify_yaml],
)

进程内传输省的是拷贝,不省回调排队。QoS 仍按数据类剖面;大 depth 一样堆延迟。接口不稳时合进程,改接口等于改爆炸半径——两边一起重测。

5. 迁移与门禁

独立进程跑稳一个版本周期 → 接口冻结 → 只合并同等级前处理并测量 → 重模型与控制保持分。每次合容器写 ADR:实时等级、爆炸半径、合前合后指标、回滚方式、三个月复查日。没有测量与回滚的提案直接打回。新组件默认独立进程;申请进容器必须附 ADR。默认保守,激进要论证——否则系统会走向拆不开的巨石容器。

决策模板进 ADR:动机与指标、成员与实时等级、爆炸半径、回调组图、合前合后测量、一小时回滚方式、三个月复查。缺回滚或测量的合容器提案不进 main。

6. 案例:静默少组件

发布后无激光:容器在,过滤插件因缺库未加载,日志一行不易察觉。上层「有节点」无话题。修复:补依赖;加载失败升 FATAL 并让容器非零退出。这类故障比崩溃更阴险——运维以为节点健康,实际数据面断流。故意缺库注入应成为发布门禁常规项。

7. 验收

  • 慢回调注入:邻居延迟可接受。
  • 崩溃注入:爆炸半径符合设计。
  • 缺库/错插件:失败可观测,验收包含故意缺库。
  • 延迟分布证明收益(或证明不该合)。
  • ADR 未过期;决策模板含回滚方式与三个月复查。

共享 Executor 是锋利的刀:先定爆炸半径与实时等级,再谈零拷贝。愿意共命运的进同一容器;不愿意就待在不同进程。

← 全部文章

johan's blog