目录 / 文档-技术白皮书(V5.05) / 07-EFT.WP.Core.Threads v1.0
I. 范围与目标
- 建立 timeout、retry 与 idempotency 的统一策略族,保证在 tau_mono 基准下的延时可预见性与外部副作用安全。
- 给出上界方程、策略合成规则、参数化建议与质量门限,形成公设 P75-*、最小方程 S75-*、运行流程 Mx-4。
- 与接口 I70-4、可观测性 I70-7、契约 I70-8、跨卷到达时 T_arr 校准保持一致。
II. 名词与变量
- 时间预算:timeout、deadline、J(单次抖动)、J_total = ∑ J_i。
- 尝试次数:retries(额外尝试数,非总次数),attempts = retries + 1。
- 失败/重试概率:p_drop、p_retry。
- 幂等:idemp_key、Delta_t_dedup、dedup_table。
- 时钟:tau_mono、ts(外部审计),二者映射见第4章。
III. 公设 P75
- P75-1(基准一致):所有策略定时以 tau_mono 计量;仅在审计时落 ts。
- P75-2(预算闭合):任意外部调用必须满足 deadline >= W_retry + margin。
- P75-3(失败有界):在已声明 attempts、timeout、J_total 的前提下,延时上界以 S75-1 裁定。
- P75-4(幂等前置):凡采用 sem="at_least_once" 或 sem="exactly_once*" 的路径,必须声明 idemp_key 与 Delta_t_dedup。
- P75-5(窗口支配):Delta_t_dedup >= span_reorder,且与存储 ttl 一致。
- P75-6(取消传播):cancel_token 穿越 hb 边后优先于后续重试生效。
- P75-7(SLO 绑定):timeout、retries 的选择受 SLA_window 与 P99 预算约束。
IV. 最小方程 S75(上界与成功率)
- S75-1(延时上界):W_retry <= timeout * ( retries + 1 ) + J_total。
- S75-2(成功率近似,独立丢弃):p_ok = 1 - ( p_drop )^( retries + 1 )。
- S75-3(期望尝试次序,几何近似):E[attempts_used] approx ∑_{k=1}^{retries+1} ( p_drop )^(k-1 )。
- S75-4(分段预算):budget_total = W_q_in + w(proc) + W_q_out + W_net <= timeout。
- S75-5(合成 deadline):deadline = max_i( W_retry_i )(并行支路取最大),或 deadline = ∑_i W_retry_i(串行支路求和)。
V. 超时策略族(以 tau_mono 计)
- 固定超时:timeout = const。用于低方差 RPC。
- 动态超时:timeout = Pq(latency_hist, q),常取 q ∈ {0.95,0.99} 并乘以安全系数。
- 分段超时:timeout_phase_i 按阶段划分(连接、首包、全量)。
- 组合建议
- 控制面优先使用短 timeout,数据面使用分段或动态 timeout。
- 对 crit(G) 上节点设置更紧 timeout,并暴露告警。
VI. 重试策略族与抖动
- 固定间隔:backoff_k = base。
- 指数退避:backoff_k = base * factor^k。
- 上限封顶:backoff_k = min( cap, base * factor^k )。
- 抖动注入(推荐):backoff_k = min( cap, base * factor^k ) + U( -jitter, +jitter )。
- 截止守恒:∑ backoff_k + attempts * timeout <= deadline - margin。
- 触发条件
- 确认型错误(5xx、超时、p_drop 情形)可重试;业务型错误(4xx、语义拒绝)禁止重试。
- 支持 retry-after 提示:当存在服务端回退信号时以其覆盖本地 backoff_k。
- 旁路策略
- hedging(镜像请求):N_hedge 限幅并绑定 idemp_key;按最先成功应答收敛,其余取消。
- circuit(断路器):错误率与延时门限触发熔断,半开探测后恢复。
VII. 幂等与去重
- 幂等定义:f(x; idemp_key) = f(x; idemp_key)。
- 键设计
- 请求天然键:业务主键或 (resource_id, op_type, ts_bucket)。
- 代理键:hash_sha256( payload || ts_bucket || uid )。
- 去重表
- 结构:dedup_table = { idemp_key -> ts_last }。
- 规则:if tau_mono_now - ts_last <= Delta_t_dedup then drop else accept & update。
- 近似一次语义(exactly_once*)
- Outbox/Inbox:同事务落库消息或消费先落库再执行业务。
- 原子标记:atomic_write( idemp_key, state ) 与消费偏移联合校核。
- 成立条件(工程近似):atomic ∧ dedup(Delta_t_dedup) ∧ ordered_ack。
VIII. 策略合成与相容性
- 合成序列
选择 sem → 生成 idemp_key → 定 Delta_t_dedup → 设 timeout → 配 retries/backoff → 对齐 deadline → 绑定告警与回退。 - 相容性矩阵
- at_most_once ↔ 短超时、零或极少重试、无需 dedup_table。
- at_least_once ↔ 正常重试、必须幂等与去重。
- exactly_once* ↔ 幂等存储、去重、顺序 ACK、可能牺牲吞吐。
- 与背压/限流的交互
- 当 rho >= 1 或 q_len 越阈时,优先收紧重试并拉长 backoff_k,避免放大拥塞。
- 结合 rate_limiter 在发送侧限流保证稳定。
IX. 接口绑定与策略原型(对齐 I70-4/I70-7/I70-8)
- with_timeout(timeout:float) -> ctx
进入上下文即以 tau_mono 设定剩余时间,超时抛出可重试错误类型。 - 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(运行前计算)。
- ensure_idempotent(fn,key_fn,window:float)
要求 window == Delta_t_dedup;key_fn 必纯函数且与业务键稳定映射。 - 可观测性(metric_emit)
发出 Threads.retry.rate、Threads.timeout.rate、Threads.dedup.drop_rate、Threads.hedge.count、Threads.circuit.open_ratio。
X. 质量指标与门限(SLI/SLO)
- 指标族
- 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
- 门限建议
- 控制面:SLI.timeout_rate <= 0.5%,p99_latency_ms <= SLO_control
- 数据面:dup_drop_rate <= 1%(乱序高峰期可放宽但需回归)
- 自愈动作
当 retry_rate 或 timeout_rate 越阈,自动拉长 backoff_k 或降低 QPS,并记录 eid_policy_change。
XI. 契约与测试矩阵(与 I70-8)
- 断言模板
- {"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}
- 乱序/重复用例
- 构造 span_reorder 接近窗口上界,验证不漏不误杀。
- 注入抖动 J 与网络分区,验证 W_retry 与 p_ok 预测符合 S75-*。
XII. 运行流程 Mx-4(部署步骤)
- 选定投递语义 sem,产出 idemp_key 设计与 Delta_t_dedup。
- 基于历史延时分布设定 timeout 与 backoff 原型,满足 S75-1 与 S75-5。
- 配置 retry(policy) 与 with_timeout(timeout);为关键调用设置 deadline 与告警阈。
- 绑定 ensure_idempotent(fn,key_fn,window);落库或缓存 dedup_table。
- 执行契约测试矩阵;校核 p_ok 与 W_retry;记录基线指标。
- 上线后持续采集 SLI.*,当越阈触发策略自愈并进行审计回放。
XIII. 出厂条件与交付件
- P75-*、S75-*、Mx-4 全量通过;SLI 达成目标;assert_thread_contract 报告通过。
- 交付包含:策略清单与参数(attempts/base/factor/cap/jitter/timeout/window)、idemp_key 规范、Delta_t_dedup 计算依据、阈值与自愈规则、审计样本与回放脚本。
版权与许可:除另有说明外,《能量丝理论》(含文本、图表、插图、符号与公式)的著作权由作者(屠广林)享有。
许可方式(CC BY 4.0):在注明作者与来源的前提下,允许复制、转载、节选、改编与再分发。
署名格式(建议):作者:屠广林|作品:《能量丝理论》|来源:energyfilament.org|许可证:CC BY 4.0
验证召集: 作者独立自费、无雇主无资助;下一阶段将优先在最愿意公开讨论、公开复现、公开挑错的环境中推进落地,不限国家。欢迎各国媒体与同行抓住窗口组织验证,并与我们联系。
版本信息: 首次发布:2025-11-11 | 当前版本:v6.0+5.05