持久化执行前置课(七):崩溃恢复不是重跑,而是先判定已知与未知
📅 2026/8/2 5:16:52
👁️ 次浏览
上一篇用事务发件箱消除了事件与命令意图之间的双写但 worker 仍可能停在任意指令。恢复器若只看“最后心跳超时”就重跑会把暂时卡顿、已完成未回报和真正失联混成一种情况。一、痛点超时只说明我们不知道进程消失前可能尚未领取、正在计算、远端已成功、本地已提交。超时不是失败事实只是观察者在期限内没有得到新证据。可靠系统应把unknown作为一等状态纯计算可以重新执行有幂等回执的活动可以查询或重投不可查询且不可逆的活动则必须暂停人工核对。二、原理恢复决策是一张显式表恢复输入至少包含租约、活动类别、回执和尝试次数。下面程序把规则写成纯函数避免散落在异常处理里。相同证据永远产生相同动作manual_review不会被后台循环偷偷改成重试。fromdataclassesimportdataclassdataclass(frozenTrue)classEvidence:lease_expired:boolreceipt:str|Noneretry_safe:boolattempts:intmax_attempts:intdefrecover(e:Evidence)-str:ifnote.lease_expired:returnwaitife.receiptsucceeded:returnrecord_completionife.receiptfailed_permanent:returnrecord_failureifnote.retry_safe:returnmanual_reviewife.attemptse.max_attempts:returnexhaustedreturnretry_same_activitycases[Evidence(False,None,True,1,3),Evidence(True,succeeded,True,1,3),Evidence(True,None,False,1,3),Evidence(True,None,True,1,3),]foritemincases:print(recover(item))输出wait record_completion manual_review retry_same_activity三、实现租约使用数据库时间和栅栏令牌仅有租约会遇到旧 worker 复活。每次领取递增fence提交结果必须携带当前令牌过期持有者即使恢复也无法覆盖新持有者。示例用内存对象展示条件更新语义生产中应放进一个数据库事务。fromdataclassesimportdataclassdataclassclassLease:owner:str|NoneNoneuntil:int0fence:int0result:str|NoneNonedefclaim(lease:Lease,worker:str,now:int,ttl:int)-int:iflease.ownerisnotNoneandlease.untilnow:raiseRuntimeError(busy)lease.ownerworker lease.untilnowttl lease.fence1returnlease.fencedefcomplete(lease:Lease,worker:str,fence:int,result:str)-None:iflease.owner!workerorlease.fence!fence:raiseRuntimeError(stale_worker)lease.resultresult leaseLease()oldclaim(lease,a,0,5)newclaim(lease,b,6,5)try:complete(lease,a,old,late)exceptRuntimeErroraserror:print(error)complete(lease,b,new,ok)print(lease.fence,lease.result)输出stale_worker 2 ok四、踩坑心跳不是进度接管也不是回滚worker 可以持续心跳却死循环因此还要记录最后事件序号和活动阶段。反过来长时间 API 调用没有心跳也未必失败租约应按活动类型配置并可续期。不要使用各 worker 本地时钟裁决租约时钟漂移会制造双主应依赖数据库时间或协调服务。恢复器不能删除旧尝试。旧日志、栅栏令牌和回执共同解释为何接管。对于不安全活动人工确认也应追加结构化事件写明证据和操作者而不是直接改状态。这样之后的重放仍能得到相同结论。五、验证在每个阶段注入死亡测试应在领取前后、远端调用前后、回执写入前后和完成提交前后杀死 worker。安全活动最终应完成一次不可判定活动应稳定停在人工状态旧栅栏提交必须被拒绝。还要模拟心跳线程存活而业务线程卡死验证进度监控能报警。崩溃分类解决“能否接管”下一篇继续约束“可以重试多少次”。没有预算的安全重试仍会形成流量风暴并把永久错误伪装成暂时故障。参考来源Martin Kleppmann分布式锁的栅栏令牌KubernetesLeaseGoogle SRE处理过载 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《持久化执行前置课》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。
命令:
ip access-list resequence Worker 50 10-------------- 示例
交换机Catalyst 9300
版本: 17.0
当前ACL序号如下:
Cisco9300#sh ip access-lists Worker
Extended IP access list Worker1 permit ip host 1.1.1.1 host 10.248.1.12 pe…
📅 2026/8/2 5:16:52
5分钟实现Burp Suite完整中文界面:终极汉化指南 【免费下载链接】BurpSuiteCN-Release BurpSuite汉化发布 项目地址: https://gitcode.com/gh_mirrors/bu/BurpSuiteCN-Release
还在为Burp Suite的英文界面而烦恼吗?BurpSuiteCN-Release项目为你提…
📅 2026/8/2 5:16:52
上一篇让重复活动收敛到同一业务回执。然而决定核一次会同时产生新事件和待执行命令:若先更新状态再投队列,崩溃会丢命令;若先投队列再更新状态,消费者可能看到尚不存在的前提。
一、痛点:两次成功之间总有崩溃窗口
…
📅 2026/8/2 5:16:52
1. 项目概述与核心价值 最近在带几个刚入行的前端小伙伴做项目,发现一个挺普遍的现象:一提到后端数据库操作,很多人下意识就觉得这是后端工程师的活儿,前端只管调接口就行。但实际情况是,随着Node.js的普及和全栈开发模…
📅 2026/8/2 11:17:56
1. 项目缘起:从零到一构建网约车数据分析体系最近几年,无论是作为乘客还是从业者,都能明显感觉到网约车行业的数据驱动属性越来越强。订单匹配效率、高峰期运力调度、司机收入分析、乘客出行热点预测,这些核心业务场景的背后&…
📅 2026/8/2 11:17:56
Windows 10系统清理终极指南:用Win10BloatRemover一键去除臃肿组件 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally based…
📅 2026/8/2 11:17:55
终极MarkDownload指南:免费浏览器插件让网页转Markdown效率提升300% 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/ma…
📅 2026/8/2 11:17:55
1. 从“常见”到“根源”:为什么我们总在同一个地方摔倒?干了这么多年技术,带过不少项目,也处理过数不清的线上问题,我发现一个挺有意思的现象:很多团队,包括我自己早期,都热衷于整理…
📅 2026/8/2 11:17:54
终极视频画质增强指南:用Video2X让老旧视频焕发新生 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video2x…
📅 2026/8/2 11:16:54
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/2 0:00:48
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/2 0:00:48
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/2 0:00:48
1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…
📅 2026/8/2 0:00:48
温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…
📅 2026/8/2 0:00:48
1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同ÿ…
📅 2026/8/2 0:00:48
AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言
HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…
📅 2026/8/2 1:22:12
无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut
在数字媒体创作领域,视频编辑处理的质量损…
📅 2026/8/2 0:02:59
1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…
📅 2026/8/2 1:22:12