目录文档-技术白皮书(V5.05)07-EFT.WP.Core.Threads v1.0

第5章 超时、重试与幂等


I. 范围与目标


II. 名词与变量


III. 公设 P75


IV. 最小方程 S75(上界与成功率)


V. 超时策略族(以 tau_mono 计)

  1. 固定超时:timeout = const。用于低方差 RPC。
  2. 动态超时:timeout = Pq(latency_hist, q),常取 q ∈ {0.95,0.99} 并乘以安全系数。
  3. 分段超时:timeout_phase_i 按阶段划分(连接、首包、全量)。
  4. 组合建议
    • 控制面优先使用短 timeout,数据面使用分段或动态 timeout。
    • 对 crit(G) 上节点设置更紧 timeout,并暴露告警。

VI. 重试策略族与抖动

  1. 固定间隔:backoff_k = base。
  2. 指数退避:backoff_k = base * factor^k。
  3. 上限封顶:backoff_k = min( cap, base * factor^k )。
  4. 抖动注入(推荐):backoff_k = min( cap, base * factor^k ) + U( -jitter, +jitter )。
  5. 截止守恒:∑ backoff_k + attempts * timeout <= deadline - margin。
  6. 触发条件
    • 确认型错误(5xx、超时、p_drop 情形)可重试;业务型错误(4xx、语义拒绝)禁止重试。
    • 支持 retry-after 提示:当存在服务端回退信号时以其覆盖本地 backoff_k。
  7. 旁路策略
    • hedging(镜像请求):N_hedge 限幅并绑定 idemp_key;按最先成功应答收敛,其余取消。
    • circuit(断路器):错误率与延时门限触发熔断,半开探测后恢复。

VII. 幂等与去重

  1. 幂等定义:f(x; idemp_key) = f(x; idemp_key)。
  2. 键设计
    • 请求天然键:业务主键或 (resource_id, op_type, ts_bucket)。
    • 代理键:hash_sha256( payload || ts_bucket || uid )。
  3. 去重表
    • 结构:dedup_table = { idemp_key -> ts_last }。
    • 规则:if tau_mono_now - ts_last <= Delta_t_dedup then drop else accept & update。
  4. 近似一次语义(exactly_once*)
    • Outbox/Inbox:同事务落库消息或消费先落库再执行业务。
    • 原子标记:atomic_write( idemp_key, state ) 与消费偏移联合校核。
    • 成立条件(工程近似):atomic ∧ dedup(Delta_t_dedup) ∧ ordered_ack。

VIII. 策略合成与相容性

  1. 合成序列
    选择 sem → 生成 idemp_key → 定 Delta_t_dedup → 设 timeout → 配 retries/backoff → 对齐 deadline → 绑定告警与回退。
  2. 相容性矩阵
    • at_most_once ↔ 短超时、零或极少重试、无需 dedup_table。
    • at_least_once ↔ 正常重试、必须幂等与去重。
    • exactly_once* ↔ 幂等存储、去重、顺序 ACK、可能牺牲吞吐。
  3. 与背压/限流的交互
    • 当 rho >= 1 或 q_len 越阈时,优先收紧重试并拉长 backoff_k,避免放大拥塞。
    • 结合 rate_limiter 在发送侧限流保证稳定。

IX. 接口绑定与策略原型(对齐 I70-4/I70-7/I70-8)

  1. with_timeout(timeout:float) -> ctx
    进入上下文即以 tau_mono 设定剩余时间,超时抛出可重试错误类型。
  2. retry(policy:dict) -> callable
    • 建议字段:{"attempts":int,"base":ms,"factor":float,"cap":ms,"jitter":ms,"retry_on":[codes], "respect_retry_after":true}。
    • 合规性断言:assert ∑ backoff_k + attempts * timeout <= deadline - margin(运行前计算)。
  3. ensure_idempotent(fn,key_fn,window:float)
    要求 window == Delta_t_dedup;key_fn 必纯函数且与业务键稳定映射。
  4. 可观测性(metric_emit)
    发出 Threads.retry.rate、Threads.timeout.rate、Threads.dedup.drop_rate、Threads.hedge.count、Threads.circuit.open_ratio。

X. 质量指标与门限(SLI/SLO)

  1. 指标族
    • SLI.retry_rate = retries_total / requests_total
    • SLI.timeout_rate = timeouts / requests_total
    • SLI.dup_drop_rate = dedup_drops / consumed_total
    • SLI.p99_latency_ms、SLI.p50_latency_ms、SLI.error_ratio
  2. 门限建议
    • 控制面:SLI.timeout_rate <= 0.5%,p99_latency_ms <= SLO_control
    • 数据面:dup_drop_rate <= 1%(乱序高峰期可放宽但需回归)
  3. 自愈动作
    当 retry_rate 或 timeout_rate 越阈,自动拉长 backoff_k 或降低 QPS,并记录 eid_policy_change。

XI. 契约与测试矩阵(与 I70-8)

  1. 断言模板
    • {"type":"timeout_upper_bound","W_retry_le":budget}
    • {"type":"retry_success_prob","p_ok_ge":target}
    • {"type":"idempotency","key_stability":true,"window":Delta_t_dedup}
    • {"type":"dedup_window","span_reorder_le":Delta_t_dedup}
    • {"type":"semantics","sem":"at_least_once","no_side_effect_dup":true}
  2. 乱序/重复用例
    • 构造 span_reorder 接近窗口上界,验证不漏不误杀。
    • 注入抖动 J 与网络分区,验证 W_retry 与 p_ok 预测符合 S75-*。

XII. 运行流程 Mx-4(部署步骤)


XIII. 出厂条件与交付件


版权与许可:除另有说明外,《能量丝理论》(含文本、图表、插图、符号与公式)的著作权由作者(屠广林)享有。
许可方式(CC BY 4.0):在注明作者与来源的前提下,允许复制、转载、节选、改编与再分发。
署名格式(建议):作者:屠广林|作品:《能量丝理论》|来源:energyfilament.org|许可证:CC BY 4.0
验证召集: 作者独立自费、无雇主无资助;下一阶段将优先在最愿意公开讨论、公开复现、公开挑错的环境中推进落地,不限国家。欢迎各国媒体与同行抓住窗口组织验证,并与我们联系。
版本信息: 首次发布:2025-11-11 | 当前版本:v6.0+5.05