Target Version
3.0-dev。复核基于 origin/3.0-dev 提交 a75fc8721b99e5c0b4421d0c58b5618bbe71ff31(PR #57 )。write-ahead 与原子 Redis ledger 已落地,本 Issue 更新为完成系统级故障验证及修复验证发现的边界问题。
Evidence
push/source/push_server.h:107-151 的 PushToUser 已在 _local_send 前逐设备调用 persist_unacked_;失败返回依赖不可用。
push/source/push_server.h:180-219 的 PushBatch 与 push/source/push_server.h:286-320 的 MQ 本地路径也在发送前持久化;MQ 路径失败返回 NackRequeue。
跨实例 PushBatch 会检查 RPC 传输状态和 response.header.success 后才 ACK MQ。
common/dao/data_redis.hpp:1815-1840 使用相同 {uid:device} hash tag,并以单个 Lua 同时维护 ZSET、HASH、repair cursor 和 TTL,消除了半写。
tests/reliability/redis_failover_test.go 的 RL-05 已验证 Redis 停止时 Push 重排队、恢复后投递并存在 unacked;尚未覆盖 persist 后/send 前崩溃、send 后/ACK 前崩溃、快速 ACK 与重复消费。
PR feat(cache): harden Redis resilience and multilevel caching #57 的 build/service-artifacts 检查失败,Reliability job 被跳过;上述 RL-05 没有该合入提交的绿色 CI 证据。
Problem or Goal
用可执行故障测试证明 write-ahead delivery invariant 在真实崩溃、快速 ACK、重复消费和 Redis 恢复下成立;若测试暴露状态机缺口,在同一边界内完成最小修复。
Scope
保留并验证 PushToUser、PushBatch、MQ 本地/跨实例路径的 persist-before-send。
覆盖 persist 后/send 前、send 后/ACK 前、ACK 与重投并发、重复 MQ 消费等崩溃点。
验证 WS send 失败保留状态,Redis 故障触发明确失败或 MQ requeue。
验证 ZSET/HASH/repair key/TTL 的原子性、同 slot 与 orphan repair。
与 Make delivery ACK convergence durable and trustworthy #58 的 durable ACK 收敛测试衔接,但不在本 Issue 重做 MySQL 水位线协议。
Non-goals
Acceptance Criteria
Test-first Plan
扩展现有 tests/reliability,先写 TestRL_PUSH_WriteAheadCrashMatrix,在每个注入点轮询 Redis ledger 与客户端去重结果。运行:
make -C tests test-reliability TEST_RUN=TestRL_PUSH_WriteAheadCrashMatrix
预期 RED 必须是某一崩溃点后消息不可重传、出现幽灵项或重复状态冲突;最小 GREEN 仅修复对应状态迁移。随后运行 RL-05、WebSocket Functional、消息 Scenario、#58 回归和 BVT。
Risk and Security
write-ahead 增加 Redis 写延迟与容量压力。测试与实现必须保持 TTL、payload 访问边界和日志脱敏;故障注入只作用于隔离环境。不能为了吞吐绕过登记原子性。
Architecture Impact
No。Push 仍拥有 WebSocket route 与 per-device unacked;本 Issue完成其状态机验证,不新增服务边界。
Core-flow Impact
Yes。验证并可能修正 Push 首发、崩溃恢复、ACK 竞态和 MQ 重投状态迁移。
Required Skill Updates
Target Version
3.0-dev。复核基于
origin/3.0-dev提交a75fc8721b99e5c0b4421d0c58b5618bbe71ff31(PR #57)。write-ahead 与原子 Redis ledger 已落地,本 Issue 更新为完成系统级故障验证及修复验证发现的边界问题。Evidence
push/source/push_server.h:107-151的PushToUser已在_local_send前逐设备调用persist_unacked_;失败返回依赖不可用。push/source/push_server.h:180-219的PushBatch与push/source/push_server.h:286-320的 MQ 本地路径也在发送前持久化;MQ 路径失败返回NackRequeue。response.header.success后才 ACK MQ。common/dao/data_redis.hpp:1815-1840使用相同{uid:device}hash tag,并以单个 Lua 同时维护 ZSET、HASH、repair cursor 和 TTL,消除了半写。tests/reliability/redis_failover_test.go的 RL-05 已验证 Redis 停止时 Push 重排队、恢复后投递并存在 unacked;尚未覆盖 persist 后/send 前崩溃、send 后/ACK 前崩溃、快速 ACK 与重复消费。build/service-artifacts检查失败,Reliability job 被跳过;上述 RL-05 没有该合入提交的绿色 CI 证据。Problem or Goal
用可执行故障测试证明 write-ahead delivery invariant 在真实崩溃、快速 ACK、重复消费和 Redis 恢复下成立;若测试暴露状态机缺口,在同一边界内完成最小修复。
Scope
Non-goals
user_seq去重。user_seq的临时通知。Acceptance Criteria
user_seq的首发路径在 WebSocket send 前登记 unacked。Test-first Plan
扩展现有
tests/reliability,先写TestRL_PUSH_WriteAheadCrashMatrix,在每个注入点轮询 Redis ledger 与客户端去重结果。运行:make -C tests test-reliability TEST_RUN=TestRL_PUSH_WriteAheadCrashMatrix预期 RED 必须是某一崩溃点后消息不可重传、出现幽灵项或重复状态冲突;最小 GREEN 仅修复对应状态迁移。随后运行 RL-05、WebSocket Functional、消息 Scenario、#58 回归和 BVT。
Risk and Security
write-ahead 增加 Redis 写延迟与容量压力。测试与实现必须保持 TTL、payload 访问边界和日志脱敏;故障注入只作用于隔离环境。不能为了吞吐绕过登记原子性。
Architecture Impact
No。Push 仍拥有 WebSocket route 与 per-device unacked;本 Issue完成其状态机验证,不新增服务边界。
Core-flow Impact
Yes。验证并可能修正 Push 首发、崩溃恢复、ACK 竞态和 MQ 重投状态迁移。
Required Skill Updates