07.2 · 云端执行:断线以后,谁还拥有这次任务?
云端执行需要把提交身份、领取资格和完成事实保存在可查询的控制账本中,让断线与接管不会凭空多出一份任务。
内容同步:2026年10月28日 · 文档版本 4
云端执行需要把提交身份、领取资格和完成事实保存在可查询的控制账本中,让断线与接管不会凭空多出一份任务。
本课的位置:云端执行位于右侧“Workspace / 云端”,负责执行承接与真实状态核对,并与Session/Run协同。
下面是教学设例:用户要求审查代码快照code-17,交付一份审查报告。客户端提交后没有收到回应,云端运行器A和B又同时尝试领取。稍后A断开连接,B接管;A恢复以后,带着旧结果回来提交。
用户只想得到一次明确交付,系统却必须分别确认:任务是否已创建、谁能执行、谁能宣布完成。控制服务保存这些事实,调度器分配资格,云端运行器执行计算,产物存储保存报告。页面连接只是观察通道。
回应没收到,不等于任务没创建
客户端在发出审查前生成稳定提交ID,例如submit-1,并在重连时继续使用它。服务受理时,把提交ID、请求内容摘要和任务记录一起可靠保存,再返回受理确认。
如果记录已经提交,只是确认回应丢失,客户端看到的超时不会撤销这条任务。重连后按submit-1查询,就能找到原任务;相同ID与相同内容再次提交时,返回原记录。
同一个ID如果换了快照或要求,就拒绝冲突,不能把它悄悄改成另一件事。内容摘要应建立在明确的字段、默认值与编码规则上,不能让无关的字段顺序改变任务身份。
也不能只按文本相同合并。用户可能确实想独立审查两次,这时使用不同提交ID。身份还要按用户或租户分区,去重记录有明确保留期,避免旧ID越过权限范围或被无限复用。
查询来自延迟副本时,“没查到”也不能直接证明没受理。重试仍然经过同一去重入口,而不是新建任务。受理、开始执行、上传完成和产物通过校验分别保存,界面不能把任一中间状态替代为完成。
A和B同时来领取,谁能启动计算?
假设两者都看到任务尚未领取。若各自先查询,再无条件写入自己的名字,它们都可能相信自己成功,最后审查两遍。
领取应在一个受控提交里完成:核对任务仍可运行、当前代次与租约满足条件,再同时写入新持有者与新代次。更新成功才允许启动计算;条件已变化,就重新查询或领取其他任务。
epoch是接管代次,每次重新授予执行资格时递增;租约是持有资格到某个时刻的约定。两者解决不同问题:租约帮助判断资格何时失效,epoch帮助识别后来出现的旧执行者。
在这个场景里,第一位成功提交领取,任务从代次0变成1;另一位仍携带0,条件不再成立。结果不依赖页面上谁先显示“运行中”,也不依赖两个运行器是否彼此看见。
具体存储可以是支持事务与条件更新的数据库,也可以结合可靠队列设计。队列负责投递不等于拥有执行资格,消息可能重复;状态入口仍要拒绝重复或过期领取。单机轻量存储便于组织小规模任务,多机器调度则要评估可用性、吞吐和共享访问条件,保留相同的资格判断原则。
领取事务要短,不把模型推理或文件上传放在事务里等待。条件不成立是正常竞争失败,存储暂时不可用则是另一类错误;后者不能被解释成“任务没有主人”。
B接管以后,A为什么不能覆盖报告?
A失联以后,系统先等待租约规则确定接管条件,不能只因页面断线就立刻宣布它不存在。租约到期,B取得代次2;A稍后恢复时仍携带代次1。
完成入口核对任务ID、经过认证的运行器身份、epoch、要求版本、租约和当前状态。检查与状态提交放在同一受控边界,避免“检查通过以后、真正写入之前”又发生接管。
A的旧结果可以留下迟到记录,但不能切换正式产物引用。B提交时还要满足当前要求,不能因为持有者正确就提交旧范围的报告。
这里有两个版本轴:用户修改审查范围,要求版本推进;机器故障接管,epoch推进。只有两者都匹配,系统才知道这份结果由当前执行者按当前要求生成。
心跳续租也要带身份、epoch与状态。否则恢复网络的旧A可能替当前任务延长租约,调度器就分不清哪个执行者仍有资格。到期以后能否继续提交,应由明确规则决定,不能让运行器自行认为“还没被人接管,所以继续有效”。
epoch拒绝的是旧执行推进,不是远程终止开关。A仍可能消耗计算资源,需要另外取消与回收;A已经发出的外部动作也要独立核对。只在报告提交处挡住它,不能代替真正动作入口的授权。
报告上传了,为什么任务还可能没有完成?
代码快照和报告是大文件,不适合随每条控制消息反复传递。提交记录保存固定版本引用、长度和摘要,运行器通过专门的存储通道获取资料。
生成报告后,先上传不可变候选产物,接收端核对完整性,再提交任务完成事实。摘要不匹配就隔离该候选,不能把传输中的旧缓存当成新结果。分段上传还要确认全部分段与整体内容的关系,不能把任意存储标记都当成通用文件摘要。
如果报告上传成功,但完成资格已经失效,这个对象仍不能公开。它属于未引用产物,等待核对或回收。反过来,完成事实已保存、最后回应丢了,客户端查询原任务就能取回正式引用,不必重新审查代码。
短期访问凭据应限定对象、操作和期限,不能写入公开日志、通用快照或模型上下文。凭据过期需要重新鉴权;拥有文件引用,也不自动拥有下载权限。
用户停止任务,控制怎样传到云端?
停止要求先保存到权威账本,推进控制版本,关闭新的领取与提交;再把取消通知传给运行器。运行器分别取消模型请求、查询和子进程,确认退出后回报。
通知暂时传不到时,取消待办继续保留,离线运行器按租约和停止策略收束。租约到期、提交被拒绝和进程已经退出是不同事实,不能在界面上混成一句“已停止”。外部操作结果未知的部分仍要继续查询。
客户端重连先拉权威状态,再恢复观察。进度事件可以按序号续读和去重;事件超出保留范围时拉状态快照,不把一条“100%”进度当成最终交付证据。
传统异步后端同样面对重复投递和网络未知。Agent增加了动态步骤、模型与文件产物,执行资格仍由程序保存和检查。下一篇继续看最后一段:报告内容通过了检查,怎样把“建议发布”变成一项可授权、可恢复的真实动作?



