长时间运行 BrowserContext 的恢复与一致性
从生命周期、崩溃与网络重试、状态快照和上下文回收到可复现验证,设计稳定的长期浏览器上下文。
短脚本可以启动上下文、完成一次页面操作后退出,但长时间运行的 BrowserContext 会遇到浏览器崩溃、临时网络中断、租约过期、维护和进程重启。恢复的重点不是让上下文永远存活,而是明确哪些状态能够重建、哪些状态必须保留,以及何时创建新上下文比修复旧上下文更安全。
把上下文视为有状态租约
每个上下文应有一个负责人和一条生命周期记录。记录可以包括任务引用、获准的 profile、存储策略、网络路线、浏览器版本,以及创建、检查点、排空和关闭时间。不要把凭据、原始页面内容或无关浏览数据写进这条记录。
可使用 planned、starting、active、degraded、draining、closed 和 needs-review 等状态。状态转换必须可重复执行,因为关闭通知可能重复到达。租约需要截止时间和续期规则。续期应证明工作节点仍拥有浏览器并能报告健康状态。续期停止后,调度器暂停新任务并进入协调流程。
profile、区域、存储和路线在整个活动生命周期内保持不变。恢复可以重新建立同一获准分配,但不能因为原资源暂时不可用就悄悄换成无关 profile 或路线。若策略要求新身份,应先关闭旧租约,再创建新的会话记录。
区分持久意图和易失状态
浏览器进程、打开的页面、内存中的应用状态和网络连接都可能因重启而消失。持久意图只需描述任务目标、最后确认的检查点、重试预算和清理策略。检查点应采用应用能够确认的条件,例如文档已保存或事务收到确认,而不是把一次页面导航当成业务完成。
检查点要和租约版本一起原子写入。工作节点读取版本后完成动作,只有满足完成条件才写入新版本。版本冲突时,失败的工作节点必须协调,而不能继续假定自己拥有恢复权。Cookie、local storage、下载和草稿有不同的保留规则,应分别决定哪些可持久化、哪些必须重新创建。
让启动和恢复可重复
打开页面前先校验 profile、存储所有权、路线策略和浏览器版本。恢复使用固定顺序:重新连接获准分配,创建上下文,应用区域和路线策略,执行轻量健康检查,然后才恢复应用任务。记录这是新建上下文还是恢复上下文,以及恢复结果。
为每次恢复设置 generation。监督服务决定旧 generation 失效后,新 generation 才能接管。旧工作节点的延迟消息应被拒绝或进入协调流程。启动和恢复也必须有时间边界。超过边界就进入受控重试或 needs-review,不能无限占用调度槽位。
把崩溃变成受控转换
崩溃发生时先将租约标记为 degraded 并停止新任务,记录浏览器版本、工作节点 generation、最后检查点和主机健康状态。若浏览器组还有其他上下文,由组负责人判断影响范围。单个上下文失败不必然意味着整个组都不安全,但进程或主机故障可能影响全部上下文。
只有在策略确认存储一致时,才可使用相同 profile 和存储重新建立上下文。存储完整性不确定时,应隔离它并按策略使用干净状态。恢复动作必须可重复。对于可能已经完成的提交、下载或表单动作,使用应用确认、幂等键或读取确认,无法确认时停在检查点并交由负责人处理。
用预算管理网络重试
页面请求、长连接、路线端点和控制通道的网络故障并不相同,不应共用无限重试循环。保留原租约分配,记录故障类别,使用有限尝试次数和等待时间。只有安全可重复的读取或刷新才适合自动重试,提交、付款和文件变更需要应用确认。
重试必须留在已批准的路线和区域策略内。改变路线会改变会话身份时,应结束旧租约并按策略创建新会话。等待应有抖动和最大重试时长。预算耗尽后标记为可恢复失败,完成清理后再归还容量。
只保存可恢复的快照
快照可以包含检查点版本、分配元数据、存储引用、待执行动作类型和时间戳,但应指向受控存储,不应把凭据或页面内容写入日志。快照同时保存租约版本和 generation,所有权校验失败时拒绝使用。
快照需要 schema 版本和迁移规则。浏览器或应用版本不支持时应明确拒绝,而不是静默解释。保留最新可用检查点以及解释恢复决定所需的证据即可,过期快照应由负责人控制的清理流程删除。
在策略边界回收上下文
回收可以由任务组完成、版本排空、无法修复的状态或所有权超时触发。先停止新任务,让当前操作完成或取消,写入最终检查点,关闭页面和上下文,确认清理后再释放租约。关闭未完成时进入协调流程,不要提前把容量交回调度器。
连续授权会话不应仅为了轮换身份而回收。策略需要新分配时,应在运行记录中明确旧会话边界,并确保旧存储不会挂载到新上下文。浏览器组回收由一个负责人协调,不能在活动上下文下直接替换浏览器文件。
观察一致性并做可复现验证
除了在线时间,还要观察一条租约是否对应一个负责人、一个活动上下文是否对应一个存储分配、检查点是否按顺序推进,以及每个打开事件是否最终有关闭事件。面板可记录排队时间、续期、恢复尝试、崩溃类别、重试时长、检查点延迟和关闭时长,但应隐藏凭据、profile 内容和无关页面数据。
验证应使用与生产相同的生命周期合同。记录获准任务的分配、版本、检查点和完成条件,再一次只引入一种受控中断,例如停止工作节点、打断网络、关闭浏览器组或执行维护排空。比较中断前后的 profile、区域、路线、存储所有权、检查点顺序和最终结果,并确认旧上下文已经关闭、租约不再接收任务、新上下文只有一个负责人。
如需查看公开的浏览器一致性验证范围,可访问 BotBrowser 验证中心。浏览器上下文内存指南介绍资源规划,扩展浏览器上下文介绍接收限制和生命周期责任。
运行检查清单
- 租约有负责人、过期规则和可重复的状态机。
- profile、存储、路线、区域和浏览器版本在页面工作前已分配。
- 检查点不包含秘密和不必要的页面数据。
- 崩溃与网络恢复有有限预算和应用完成确认。
- 回收会排空工作,并在清理完成后释放容量。
- 快照版本、保留时间和迁移规则明确。
- 中断测试在每个支持版本上比较结构化记录并验证清理。
当所有权、检查点或清理关系不清楚时,应先暂停接收并协调,再决定继续原租约还是创建新租约。浏览器可以重启、网络可以恢复、工作节点可以更换,但服务仍应说明哪项分配有效、哪些工作已确认、哪些状态可以恢复,以及为什么创建了新上下文。这就是面向隐私和一致性的长期自动化恢复基础。