首页 文章 精选 留言 我的

精选列表

搜索[状态机],共2146篇文章
优秀的个人博客,低调大师

桌面任务断网后如何恢复:状态机、持久化回执与幂等确认

桌面应用执行异步任务时,最难处理的往往不是第一次请求,而是请求之后发生的断网:远端可能已经接受操作,本地却没有收到响应。如果用户此时关闭应用,下一次启动究竟应该重新执行,还是继续查询? 本文给出一套可落地的设计思路。讨论范围是具有稳定任务标识、支持查询结果的远端服务。对于不支持幂等提交的第三方系统,需要更加保守地处理不确定结果。 一、先拆开提交与后续处理状态 一次提交成功,不一定代表全部业务已经完成。例如文件上传后还需要转码,内容提交后还需要审核,导出任务受理后还需要生成文件。 可以分别保存 submissionStatus 和 reviewStatus。前者描述原始提交是否被接收,后者描述后续处理进度。后续状态可采用 pending、published、rejected。驳回时另存 reason,文章地址或结果地址独立保存在 resultUrl。 这样,审核驳回只改变审核结果,不会把已发生的提交改写成未提交。页面也可以明确显示“已提交,审核中”,避免把不同阶段混为一个成功标记。 二、把不确定结果作为独立状态处理 超时只说明客户端没有在规定时间内取得响应,不能单独证明远端操作失败。 当请求可能已到达远端时,应记录 needsReview 一类不确定状态,保留原任务编号、账号、内容指纹以及尝试时间。恢复流程优先查询原记录,不立即重放具有业务副作用的提交动作。 只有取得明确的未提交证据,才考虑重新执行。这个约束比增加重试次数更能减少重复内容、重复扣费或重复订单。 三、先持久化回执,再等待确认 客户端读取到结果后,可以先将待回写记录写入本地持久队列,再发送给业务后台。队列项至少包含 taskId、accountId、resultUrl、状态、原因和证据摘要。 存储键应包含服务地址、租户、设备和任务身份。不同绑定的数据不能混在一个默认队列中。敏感字段需要使用操作系统提供的安全存储能力,日志只记录必要的任务标识与错误类型。 本地存储也有失败的可能。文件方案要考虑临时文件写入与原子替换;数据库方案要把相关修改放入事务。SQLite 官方对事务原子提交的说明可以帮助理解崩溃恢复需要解决的问题,但具体持久性仍取决于存储配置和运行环境。 四、用幂等确认处理响应丢失 考虑下面的时序:客户端发送回执,后台已保存,响应在返回途中丢失。客户端保留记录并再次发送,这并不意味着业务操作应该再执行一次。 后台可以使用稳定的幂等标识识别同一回执,并在重复请求时返回已保存结果。确认响应应同时带回 taskId、accountId、状态与 resultUrl。客户端核对这些字段一致后,才能移除对应队列项。 不要仅凭 HTTP 200 就删除本地记录。响应可能是旧接口的普通成功提示,也可能没有接受当前这条审核结果。确认字段应明确表达本次数据已经被接收。 五、重启时恢复查询,不恢复提交动作 重启恢复可以分为三步:读取原绑定、启动结果队列同步、重新获取未完成的审核候选。 候选由后台已保存的任务重新构建,不依赖旧进程中的数组或浏览器标签页。查询只需要原账号、任务编号、文章标识和必要的内容指纹,不需要再次下发可执行的提交计划。 审核查询使用单独的临时页面,读完即关闭;已有人工编辑页不应被导航或覆盖。客户端还需要对同一账号做互斥,避免审核、登录检查和人工发布同时争用一个会话。 六、网络错误不能生成审核结论 管理页面打不开、登录过期、没有找到匹配记录,都属于证据不足。它们不等同于平台驳回,更不能成为清空原链接或重新发布的理由。 只有在同一条记录中取得匹配的标题、文章标识和明确状态文字,才生成新观察。驳回原因应来自平台可见提示,不能根据匿名阅读页的 404 自行推断。 查询失败后保留原状态,按照有上限的间隔再次检查。终态确认后退出候选,减少无意义请求。 七、防止迟到结果覆盖新结果 网络恢复后,旧 pending 回执可能晚于新的终态到达。后台需要明确状态转换规则:pending 可以进入终态,已经确认的终态不能被迟到的 pending 回退。 客户端切换服务地址、租户或设备时,也要使旧请求失效。可以为每次绑定维护代次,在请求返回与浏览器读取完成时再次核对。旧结果留在原绑定的队列中,不能借用新绑定提交。 八、验收要包含两个不同的断网位置 第一种是在尚未取得终态前断网:重启后应重新查询远端,随后生成并回写新结果。 第二种是在已取得结果、尚未收到后台确认时断网:重启后应重传回执,并通过幂等响应清空队列。 还应补充平台仍不可达、后台先恢复、确认响应丢失以及终态后再次重启等情况。验证时同时检查原提交次数、任务数量和事件记录,不能只看页面最后是否出现成功提示。 一个可靠的恢复流程,最终应回答三个问题:原操作是否已经执行,当前结果是否有可核对证据,后台是否明确确认了这条结果。把这三个问题分别建模,恢复路径才会清晰。 参考资料 SQLite 官方文档:Atomic Commit In SQLite https://www.sqlite.org/atomiccommit.html

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册