中间件与网络固定源码核对
从仓库根执行 python3 labs/middleware-senior/verify_sources.py。脚本联网读取官方固定 tag,缓存到系统临时目录,检查 37 个文件的指定符号;任一获取失败或符号缺失返回非零。--only 'kafka' 可筛选,--show 'checkSequence|lastStableOffset' 可打印上下文。
范围为 Kafka 3.7.1、ZooKeeper release-3.9.2、Nacos 2.4.3、Dubbo dubbo-3.2.15 和 OpenJDK jdk-17.0.12+7。固定版本用于稳定学习,不表示仍在维护或适合生产部署;完整调用链与分支解释在对应训练正文。
本轮全部 37 个文件核对通过。文件与符号存在不能证明全部语义正确,更不表示已经运行消息复制、rebalance、注册发现分区或网络故障实验。Kafka ProducerAppendInfo 使用 OutOfOrderSequenceException,客户端/协议错误枚举与内部异常层次须区分,不按相似名称拼接调用链。
fencing 有限事件模型
需要 Python 3.9+ 标准库,无第三方依赖、容器或服务。可直接下载事件模型完整文件;源码核对另需verify_sources.py和网络。下载后保留文件名,进入所在目录运行 python3 reliability_lab.py fencing;以下命令从仓库根执行:
python3 labs/middleware-senior/reliability_lab.py fencing
python3 labs/middleware-senior/reliability_lab.py fencing --variant no-fence
python3 labs/middleware-senior/reliability_lab.py fencing --variant split-authority
python3 labs/middleware-senior/reliability_lab.py fencing --variant rollback-issuer
python3 labs/middleware-senior/reliability_lab.py fencing --case operations模型输入、原子边界和性质见租约与 fencing 权威讲解。--json 输出机器可读结果,histories 是偏序的全部拓扑序数量;默认3条、split-authority为2条。每次授予把owner/代际/发号看作一个持久原子步骤,资源比较和提交是另一个原子步骤,两者不能合并。到期/暂停/恢复均为显式事件,不使用真实墙钟。
默认模型预期 violation=null,且 oldBeforeNew.accepted=true、oldAfterNew.accepted=false。三个故意缺陷的预期是查获反例,命令正常退出不表示缺陷安全:no-fence 得到42后41覆盖;split-authority 得到旧A新发43;rollback-issuer 得到新旧两个41,由旧任期seq2覆盖新任期seq1。逐步的 counterexample.events/trace 可重放核对。operations固定输入输出 applied/applied/duplicate/conflict/stale,两个已生效操作,资源终态 (41,2,second)。
本轮已运行五条入口及对应 Node 公开 CLI 断言。有限调度只覆盖两客户端、两次授予、一个资源、一次暂停与到期,以及声明的故障开关;operations是授权已成立的资源事务模型,不模拟发号服务。没有运行真实 ZooKeeper/Raft 集群、网络分区、掉电与数据库提交试验;本机 Redis standalone 不替代这些证据。模型无业务数据读写,不需清理服务资源。
业务幂等、Outbox与流程恢复
同一个完整脚本新增以下公开入口,Python 3.9+标准库即可运行;下载后将路径改为 python3 reliability_lab.py ...:
python3 labs/middleware-senior/reliability_lab.py inbox --case all --json
python3 labs/middleware-senior/reliability_lab.py outbox --case all --json
python3 labs/middleware-senior/reliability_lab.py workflow --case all --jsonInbox输入同一op-001加100,提交前回滚后重试为ROLLED_BACK/SUCCEEDED/DUPLICATE,提交后丢确认重投为COMMITTED_RESPONSE_LOST/DUPLICATE,余额均100、Inbox与effects各1;同键加200冲突。SETNX独立资源先占位的故意缺陷保留预约却没有效果。外部付款模型使用独立SQLite文件:client key可查并同键重试,两请求一扣款;仅有响应receipt-id的契约维持UNKNOWN。
Outbox输入订单7与e-7-1,本地回滚两者均无,提交后PENDING可恢复。发送后未记SENT重试两次但收方效果1;先SENT的故意缺陷丢意图。旧领取者保留自己事务返回的claim_id/version,B接管后旧CAS零行、新CAS一行,外部仍能有两次发送。批量只有成功项SENT,另一项保留CLAIMED。--case可选rollback、committed、send-before-mark、mark-before-send、stale-claim、batch;Inbox可选before-commit、after-commit、conflict、setnx、external。
workflow检查取消墓碑、异参冲突、确认/取消两种竞争先后;库存1总和保持1。协调者CONFIRM在SQLite提交后重开读取,尝试反向CANCEL不会改变决定;两个分支恢复同向确认。故意去掉全局决定时,局部CAS仍可分别得到CONFIRMED和CANCELLED。参与者原子转换为有限模型前提,只有决定用真实文件事务,不能当成完整TCC/XA实机。正文见业务幂等、Outbox、跨资源长流程。
本轮以上命令和公开CLI断言已运行。SQLite实验使用临时目录,正常结束自动删除文件;注入为显式回滚/省略确认/确定先后,不是OS强杀、真实网络分区、InnoDB竞争、Kafka或CDC实验,不生成吞吐结论。
MQ复制、交付前缀与积压恢复
Python 3.9+标准库,使用同一个完整下载文件。独立下载后保留文件名,将以下命令的目录前缀去掉即可,无其他输入依赖:
python3 labs/middleware-senior/reliability_lab.py replication --json
python3 labs/middleware-senior/reliability_lab.py offsets --json
python3 labs/middleware-senior/reliability_lab.py offsets --case stale --json
python3 labs/middleware-senior/reliability_lab.py offsets --case handoff --json
python3 labs/middleware-senior/reliability_lab.py backlog --json
python3 labs/middleware-senior/reliability_lab.py backlog --case stale --json
python3 labs/middleware-senior/reliability_lab.py backlog --case deferred-repeat --jsonreplication输入固定三副本/minISR2/requiredOffset105:稳定ISR的[105,103,103]得到HW103等待,[105,105,105]达到HW105确认;第三项是另一待完成请求在HW已达105但ISR已收缩为1时的独立观察,返回ERROR_AFTER_APPEND,不会撤销上一项已送达的ACK。另计算HW110/open104→LSO104、107不可见,未决事务稳定后LSO110。模型没有动态ISR扩张、选主、磁盘或marker复制,不证明Kafka集群保证。
offsets输入交付100/103/108、完成108/100/103,安全可提交水位100/101/109。错误的max完成+1策略实际运行后给出首个遗漏反例109与[100,103]。stale三次保持100;handoff在100完成后撤销,不接纳not-owner/old-assignment通知,新owner重放103/108后前缀才到109。本地assignment epoch与broker generation不是同一件事;模型不执行OffsetCommit请求或取消外部SQL。
backlog输入120万积压/8000每秒新流,有效完成10000/7000/9000时分别600秒/不能清空/1200秒。这是恒定流体预算,不是实测吞吐。版本模型用临时SQLite保存version和事件状态,每次关闭重开连接;输入12/11/11/13得到DEFERRED/APPLIED/DUPLICATE/APPLIED,效果顺序11/12/13、终态13。缺失14的15到显式截止后持久隔离,提交后重开查到ISOLATE_AND_RECONCILE。stale先输入未知旧9返回STALE而不回退;deferred-repeat在11前重复12仍为DEFERRED。故意旁路按12/11直接更新会倒退至11。这里只保存有限事件版本,不模拟任意payload/schema冲突、真实消费线程或SQL引擎并发。
本轮七条命令及Node公开断言均已运行。模型临时SQLite正常结束自动删除,没有启动Kafka/RabbitMQ服务、网络分区、broker掉电、rebalance或真实压测。正文权威入口:复制、LSO与事务、位点与交接、重试与恢复。源码核对可运行 python3 labs/middleware-senior/verify_sources.py --only kafka,只检查固定版本文件与符号,不代替模型或真实集群试验。
会话、配置切换与截止时间预算
同一个完整脚本新增三个公开入口,Python 3.9+标准库,无第三方依赖:
python3 labs/middleware-senior/reliability_lab.py session --json
python3 labs/middleware-senior/reliability_lab.py config --json
python3 labs/middleware-senior/reliability_lab.py budget --json
python3 labs/middleware-senior/reliability_lab.py budget --first-attempt-ms 600 --jsonsession是声明的会话/watch事件模型:A断连→重连→再断连时owner均为A;expire后owner清空,B新会话创建owner为B,A用旧session恢复被拒。两次更新只触发一次普通watch,重读得到最终值;create响应丢失时盲目重建得到2个候选,GUID匹配复用只留1个。输出model=finite-session-watch-not-zookeeper-cluster,不模拟真实超时毫秒、quorum或回调线程。
config验证应用侧解析/校验/切换契约:非法v2被整体拒绝且运行态保留v1;故意逐字段部分变更留下坏运行时对象;两个dataId分批到达产生mixed={rules:2,limits:1}混版;manifest待齐校验后三步WAITING→HASH_CONFLICT→APPLIED统一切换。输出model=finite-application-snapshot-not-nacos-server,不是Nacos服务端实现。
budget在每次尝试前检查"退避+完整尝试"能否放入剩余预算:默认800/100/150/80/3次得到剩余550/320/90,stop=ATTEMPT_LIMIT,放大27;--first-attempt-ms 600时第二次因剩余100装不下80+150被拒,stop=INSUFFICIENT_DEADLINE,对照"只数次数"策略超支360ms。输出model=deterministic-deadline-admission-not-network,不模拟真实网络超时精度。
本轮四条命令及Node公开断言均已运行。没有启动ZooKeeper/Nacos/Dubbo集群、网络故障或真实压测。正文权威入口:ZooKeeper协调与会话恢复、Nacos注册发现与配置一致性、Dubbo调用链与服务治理、超时重试、熔断限流降级。源码核对可运行 python3 labs/middleware-senior/verify_sources.py --only zookeeper|nacos|dubbo。