跳转至

Fresh 单收件人 Mailbox 融合快路径 Delta

日期:2026-08-24
状态:实现、独立复核、真实 Redis 回归与短压 A/B 已完成;发布性能门禁仍未通过

变更摘要

为 standalone Redis 的最窄热态增加一次 Lua 调用的物化路径:当规范 manifest 恰有一个 canonical final chunk、该 chunk 恰有一个用户且只生成一个完整事件组时,脚本在首次写入前 验证全部状态,并原子写入 DispatchProgress(DP)、邮箱条目及保留证明、完成索引和 64 lane packed watermark(W)。不满足适用条件、DP 已存在或无法完整证明热态时,接口返回 None 且 零写,继续既有通用链路;脚本/状态错误返回 Err,该 record 必须停止,绝不降级为通用链路。

范围与非目标

项目 本 Delta 的行为
Redis 部署形态 仅 production 已明确支持的 standalone Redis,启动前必须由 INFO server 严格证明 redis_version >= 7.0.0。
Redis Cluster 不是支持 Cluster。 M-REDIS-04 仍 fail-closed;本 Lua 同时访问 {shard} DP/W 与 {tenant:user} mailbox keys,未来若支持 Cluster,必须另行设计事务/键槽架构。
适用 dispatch 精确一个 manifest chunk、该 chunk 是 canonical final、唯一收件人、唯一 Entry。多用户、多 chunk、零 chunk 走通用链路。
DP 身份 仅 DP key 完全不存在的 Fresh。DP 存在(无论 identity)在任何写入前返回 None;Existing、partial 和冲突继续通用链路。
邮箱保留状态 仅空 user key 空间,或 V4 热态:active_day_count=1、min_day=max_day=entry day、active-days zset 仅该 day、该 day 的 expiry/proof 严格一致。同日可有任意既有 seq。
排除状态 legacy、迁移、promotion、过期日、跨日活动范围或不能完整证明的状态,一律在写前 None;wrongtype、损坏、identity 缺失、future day/expiry、非法输入一律 Err。DP 已被 replay-safe GC 而同日 candidate identity 仍存在时也返回 None,由通用链路安全重建/覆盖事件组。

接口与集成点

MailboxStore 增加机会型的聚合方法 try_materialize_fresh_single_recipient。默认实现固定 Ok(None),不进行任何写入,因此 Memory/Scylla 及测试替身仍保持既有语义。输入包含已经由 MailboxNode 验证的 single-recipient dispatch、mailbox_seq=0 的唯一 entry 模板,以及从接管 快照取得的完整 64 lane expected-previous;成功结果返回 canonical receipt 和 64 lane 结果。

materialize_with_watermark_cache 在现有 begin_dispatch 前完成结构判定并调用该方法:

接管 W cache snapshot
  └─ 合格 single recipient?
       ├─ Some:更新同一 cache,构造 volatile output,返回(不调用 begin/append/finish)
       ├─ None:原有 begin → append/完成 chunk → finish 链路
       └─ Err :停止本 record,cache 不更新,不 fallback

Redis override 使用自身配置的 epoch 将 entry 模板的 canonical mailbox_seq 设为 (current epoch, observed offset),随后在 Rust 内确定性编码;Lua 仅验证该 bytes 的 sequence 前缀及其余参数的一致性,不重新解释业务 entry。MailboxNode 不从可能全空的 W cache 推断 epoch, 也不为此新增远程读取。

原子事实与验证顺序

新 Lua 的所有 TYPE、格式、identity、expiry、V4 proof、DP 不存在、64 lane packed-v1 和 CAS 验证都位于首次写命令之前。成功时在同一脚本内写入:

  1. v2 DP:64 个 m:<lane> 字段、期望/完成/剩余计数 1/1/0、canonical final、完成时间、 last_seen、max_observed;
  2. dpcomplete:{shard};
  3. 单 entry 的当天 mailbox zset、V4 meta、identity 索引及 active-day proof,全部使用既有固定 绝对 EXPIREAT 规则(相同 day 只会重设同一 expiry,不延长 retention);
  4. wm:{shard} 的 packed-v1 blob,64 lane 按现有 CAS 语义推进。

脚本成功后不得再进行会导致逻辑失败的检查。若 EVAL 已成功而响应丢失,上层把该 record 作为 失败停止;重放时 DP 已存在,快路径 None,通用 Existing 链路读取 final-complete DP 并收敛, 不会重复事件组。

风险与防线

风险 防线
错把部分/历史状态当热态而混写 热态证明逐字段严格校验;无法证明只 None。
Lua 在错误后留下半事实 所有可失败验证和 key type 检查先完成;测试以字节级快照断言零写。
64 lane cache 与持久 W 分叉 只在返回完整成功结果后更新 cache;Err/None 均不更新。
响应丢失造成重复 entry 成功后 DP 已存在使重放转入现有 Existing 收敛路径。
Cluster 跨槽误解为已支持 文档和代码注释显式限于 standalone;既有 Cluster 拒绝门禁不变。
Lua 命令/ACL 与部署版本不符 启动门禁在任何 unsafe-dev 放宽前要求 Redis ≥7.0.0;部署 ACL 必须允许现有 Lua 所用命令(含 EXPIRETIME 及其他既有脚本使用的 Redis 7 条件过期选项)。本快路径写后只使用无选项的绝对 EXPIREAT。运行期 ACL 变更/Redis 进程级错误仍由脚本失败闭合,不在热路径逐条预检。

验收计划

能力与边界

Must Have 验证
Fresh 成功恰一次 EVAL 语义 真实隔离 Redis 校验 DP、唯一 entry、dpcomplete、V4 proof 和 64 packed W。
同日已存在 V4 热态仍成功 第二个 Fresh user record 同日写入,保留证明和身份索引保持一致。
已有 DP 零写退回 字节级快照证明 None 不改变任何 key。
响应丢失重放收敛 首次成功后重放经通用 Existing,只有一个事件组且 W 收敛。
CAS 与 key/type 损坏 fail-closed CAS gap、每类 wrongtype、meta/identity 损坏、legacy、跨日/过期/future 分别断言 Err 或 None;每例都对 DP、completion、mailbox、meta、identity、active-days、W 共 7 key 的 (DUMP, EXPIRETIME) 前后完全相等。
MailboxNode 不误用快路径 fake store 证明 Some 不调用 begin/append/finish,None 调用完整通用链,Err 不 fallback 且不更新 cache。

禁止区

  • 不修改通用 begin_dispatch、Existing 或 partial 恢复语义。
  • 不在不合格输入上尝试“部分融合”或预写 DP。
  • 不将跨 hash tag Lua 解释、测试或宣传为 Cluster 支持。
  • 不为快路径引入新依赖、额外 Redis 往返或本地时间判定。

实际验证环境

使用 redis-server 启动在非 6379 的临时独立端口和临时目录,测试进程仅连接该实例的 DB 15; 结束后精确关闭该 PID 并删除该临时目录。随后运行 qstore/qmailbox 定向测试、fmt、严格 clippy、 契约检查与 diff 检查。

实际结果:

  • cargo test -p qim-common --lib:86/86;真实 standalone Redis 版本门禁:1/1。
  • cargo test -p qim-store --lib:52/52;隔离 Redis redis_store:38/38。
  • cargo test -p qim-mailbox --bin qim-mailbox:50/50。
  • cargo clippy -p qim-common -p qim-store -p qim-mailbox --all-targets -- -D warnings、 cargo fmt --all -- --check、scripts/check-contract.sh、git diff --check 均通过。
  • 独立复核发现并关闭了两项边界:Redis 版本/写后命令半事实风险,以及 None/Err 测试未覆盖 全部关联 key TTL。最终零写矩阵对 7 个 key 同时比较 (DUMP, EXPIRETIME)。

真实短压 A/B

以下均为隔离 Redpanda、core/mailbox split Redis、100 客户端、1000 msg/s、10 秒、 phase-stagger、64 shard、inflight=16;两组都精确提交 10000 条,frame/SDK 覆盖 100%, 功能失败为 0。短压只用于定位,不能替代 180 秒发布门禁。

指标 融合前 X8ItRX 融合后 BqdY36 变化
Mailbox EVALSHA 次数 32939 11839 -64.06%
EVALSHA / materialized dispatch 3.1385 1.1281 -64.06%
Mailbox Lua 累计时间 8.883 s 7.623 s -14.19%
Mailbox Redis CPU 10.316 s 8.815 s -14.55%
materialize 均值 15.47 ms 11.83 ms -23.52%
permit 均值 16.38 ms 9.18 ms -43.94%
shard queue 均值 545.04 ms 43.84 ms -91.96%
ACK P99 9.5 ms 9.5 ms 持平
E2E P99 3052.5 ms 732.0 ms -76.02%

工件:

  • 融合前:/tmp/qim-artifacts.qim-it-u1000-1787541564-1840597.X8ItRX
  • 融合后:/tmp/qim-artifacts.qim-it-u1000-1787545352-1947826.BqdY36

该结果强烈支持“典型 Fresh 热路径约三次脚本收敛为约一次”的总体效果,但工件没有按脚本 hit/miss counter,不能声称每一条 dispatch 都命中,也不能从聚合 EVALSHA 精确恢复命中率。 E2E P99 仍高于 300 ms,因此本 Delta 的功能与局部性能目标已达成,项目发布性能 Todo 未完成。