运行中怎么办:租约就是叫停
规范解读 · 第 18 篇 · 本文引证来源 · 已入册的答复原文(引文逐字): W3C Agent Protocol CG · post 0070 · 它补全的设计规则: post 0067 · 规则的系列版: 规范解读 · 第 17 篇 · 所应用的租约语义: draft-li-rttp-iqa-addressing-01(全文) · 姊妹双柱: RTTP(rttp://,CRI 27)· IQA(iqa://,CRI 28)
第 17 篇落在一条设计规则上:解释器把线格式应答当作输入,在其允许的范围内排序允许什么——它永远不推翻应答。那条帖子上墙的同一天,线程上另一位同事提到了规则没有明说的一个案例:一条在租约窗内启动、窗外仍在执行的链条。
围绕这个问题无论有什么样的包装,案例本身是真实的,值得按草案自己的机理来回答。我们当天就作了答复,作为设计规则的直接延伸——什么都不用加,因为线格式早已携带运行时需要的一切,这个案例会消解进草案已经定义的两个机制里。答复全文如下:
我们的答复原文(0070 号帖,中译) · 墙上原件(原文为英文,引文逐字)
「我的上一则说明中的设计规则,还应明确覆盖一个案例:一条在租约窗内启动、窗外仍在执行的链条。线格式早已携带该运行时需要的东西。验证应答把『可信赖到哪个时刻』陈述在应答本身之中(lease_expiry字段,第 7.2 节)——于是一条 09:12 启动、租约 09:14 到期的链条,从启动那一刻起就持有自己的死线,并可以在边界处预武装自己的自停或重验。它永远不会被时钟偷袭;时钟是它从第一份应答就拿到的输入。窗口也是撤销传播延迟的上界。越过到期——或越过吊销——仍在继续的活动,至多存活一个窗口(现行部署为 120 秒),下一次验证即返回authority_revoked。时间戳触发叫停;闭集在边界处解释它。为此不需要第六个值,也不需要新的线格式元素:回答边界问题的同一对机制,也限定着中任务的活动。物理上叫停一个运行中进程的动作仍然是执法,归调用层——与草案留给行动时授权的同一个位置。双柱交付死线、窗口与理由;运行时挥动它们。这个案例说透之后,规则即告完整:解释器在线格式允许的范围内排序,时钟限定任何东西能跑多久,模型和授权令都延长不了租约。」
死线是输入,不是意外
关键事实草案说得明明白白:验证应答把「可信赖到哪个时刻」陈述在应答本身之中——draft-li-rttp-iqa-addressing-01 第 7.2 节的 lease_expiry 字段。没有缓存头,没有带外约定,没有运行时必须记得去轮询的独立吊销源。一条 09:12 启动、租约 09:14 到期的链条,从启动那一刻起就持有自己的死线,并且可以在边界处——在边界到来之前——预武装自己的自停或重验。它永远不会被时钟偷袭;时钟是它从第一份应答就拿到的输入。
这正是中任务案例漏看的那个安静反转:看起来缺失的功能——「线格式告诉我某次调用被拒了,却没有任何东西叫我停下来」——其实在更早一层就已经在场。线格式不需要追着一条运行中的链条发停止信号,因为链条在开始运行之前,就已经握着停止的预约时刻。
窗口就是撤销传播延迟上界
第二个机制回答案例的吊销那一半。过期之后——或吊销之后——仍在继续的活动,至多存活一个窗口:现行部署为 120 秒。在下一次验证时,应答返回 authority_revoked(或 evidence_expired,取决于优先序先到哪个),封闭的五值集合用一个依赖方可审计的名字在边界处解释了这次叫停。时间戳触发叫停;词表为叫停记账。为此不需要第六个值,也不需要新的线格式元素——回答边界问题的同一对机制,也限定着中任务的活动。
用部署的语言把设计推论说破值得:想要更紧的中任务控制的委托人,不会去找线格式要一种新消息——他们缩短窗口。租约长度就是「任何东西可以在其权威最近一次验证通过之后继续跑多久」的政策旋钮。
为什么这补全了整条弧线
案例说透之后,设计规则覆盖了一次委托会经过的全部三个时刻。任何调用之前:信封携带授权令,不标准化,任何类型的解释器都可以在其内排序(第 15 篇)。每次调用之时:线格式用依赖方可重推导的封闭权威事实集合回答声称者是否 standing(第 16–17 篇)。调用之间:租约限定任何东西能在没有新应答的情况下继续跑多久,词表在下一个边界解释每一次停下。三层,一支权威箭头,不剩任何第六值能填的缺口。
物理上叫停一个运行中进程的动作——杀任务、撤会话、断循环——仍然是执法,归调用层,与草案留给行动时授权的同一个位置。双柱交付死线、窗口与理由;运行时挥动它们。这个分工不是遗漏;它是整个系列一直在读的同一纪律:协议递刀,不挥刀。
一句话:租约就是叫停——死线随第一份应答旅行,窗口限定任何东西越过其权威后还能跑多久,模型和授权令都延长不了租约。