🐳 第五章 Cordis让插件能够动态组合
📄 一句话概括

动态组合的第二条维度是空间的:环境变了(依赖没了、键被改了),插件的处境必须是明确的失效,而不是 undefined 地继续跑。

📝 本节和前面几节的关系

5.1、5.2 管的是时间与声明,这一节管处境:插件活在环境里,环境不是静止的。

一、环境会变,这是常态

会话进行中,环境随时在变:

问题不是【会不会变】,是变了之后插件的处境清不清楚。

二、实测:isolate 画出的空间格子

配置里 10 处 cordis:group,部分带 isolate 声明:

isolate 的意思:这一组的键只在组内可见——组里换实现影响不到组外,组外的变化也进不来。

每个插件活在自己声明过的格子里——格子内的变化它看得见,格子外的变化与它无关。

三、两种失效,一种合格

环境变了,插件的处境有三种可能:

空间维度要的就是第一种:失效可以,但必须明明白白——能被发现、能被记录、能被恢复。

四、和虚拟化的对照

云平台早就做过同一道题:虚拟机迁移或宿主机变化时,虚机的处境必须明确——要么活着(迁移成功),要么挂了(有记录),不能【半死不活】。

isolate 之于插件,就是隔离之于虚机:把变化限制在格子里,让每个单元的生死都清楚可查。

五、动手 Demo:空间维度——环境变了还能不能跑

isolate 格子与三种处境:

groups = [
    ("compaction", "isolate: compaction / toolResultPruner"),
    ("delegation", "isolate: workflowEngine"),
]
for a, b in groups:
    print("  %-12s %s" % (a, b))
print()
for s in ("明确的失效", "沉默的降级", "undefined 的继续跑"):
    print("  处境: %s" % s)
print("  -> 只要第一种")

实跑输出:

--------------------------------------------------------------------
空间维度——环境变了还能不能跑
--------------------------------------------------------------------
  空间维度一句话:**当能力环境变化时,插件还能不能运行**。

  实测:配置里有 10 处 `cordis:group`,部分带 `isolate` 声明:

  分组                   isolate 声明                      隔离了什么
  --------------------------------------------------------------------------
  compaction(压缩)     compaction / toolResultPruner     压缩相关的能力键
  delegation(委托)     workflowEngine                    工作流引擎
  --------------------------------------------------------------------------

  isolate 的意思:**这一组的东西只在组内可见**——
  组里换实现、组里开关,影响不到组外;组外的变化也进不来。

  这就是空间边界:每个插件都活在自己声明过的环境里,
  环境变了(依赖没了、键被改了),它的处境是【明确的失效】,
  而不是【 undefined 的继续跑】。

沉默的降级最危险——比崩溃难发现得多;空间边界就是防它的。 isolate 的格子让【组内变化、组外无感】成为默认行为,变化半径被物理限制。 和云平台虚拟化的对照说明:这不是新问题,是老问题的新住址。

30 秒实验

  1. 在配置树里找一处 isolate,说出它隔离了哪个键。
  2. 举一个【沉默的降级】例子:什么软件坏了一半却没人发现?
  3. 说说分组与 3.2.2 作用域的关系(提示:格子也是边界)。

常见误区

  1. 错误:环境变化是异常情况,可以不管。——纠正:动态组合下变化是常态,处境必须始终明确。
  2. 错误:isolate 只是性能隔离。——纠正:它是可见性隔离——组内的键不外泄,组外的变化不渗入。
  3. 错误:插件挂了但还在跑,说明它健壮。——纠正:那叫沉默的降级,是最危险的处境。
自测三问(点开对答案) 1. 空间维度的问题是什么? —— **当能力环境变化时,插件还能不能运行**——处境必须明确。 2. isolate 声明隔离了什么? —— **组内的键只在组内可见**——组内换实现不影响组外,组外变化进不来。 3. 三种处境里只要哪一种? —— **明确的失效**——沉默的降级与 undefined 的继续跑都不可接受。

相关笔记