Skip to content

Make WebSocket online observation deterministic #83

Description

@ULookup

Target Version

3.0-dev,复现基线为 bbf4bb42b2cd85c07edcb3bf736a83298fa7b62c,其 merge-base 为 a75fc8721b99e5c0b4421d0c58b5618bbe71ff31

Evidence

  • 命令 cd tests && go test -tags=func ./func/... -run '^TestFN_WS_(RevokedTokenRejected|Reconnect)$' -v -count=1 中,TestFN_WS_Reconnecttests/pkg/fixture/ws.go:26 等待 10 秒后报告用户未变为 ONLINE;同次 TestFN_WS_RevokedTokenRejected 通过。
  • Push 的 10008/9001 端口在失败期间持续监听,WebSocket 握手成功。
  • 临时隔离 Redis 中出现对应用户的 im:presence:device:{user_id}:default_device hash;测试进程退出、连接关闭后其状态为 OFFLINE,说明 Push 生命周期写入路径曾执行,但 Presence 查询未在门限内观测到 ONLINE。
  • 单独运行 TestFN_WS_RevokedTokenRejected 的直接有效令牌控制组可保持 WebSocket 连接,排除了所有令牌被 admission 统一拒绝。

Problem or Goal

使 Go Functional 层的 WebSocket 在线就绪观测与 Push/Presence 的实际状态收敛一致,避免有效连接已建立但 waitForWSOnline 持续读取 OFFLINE 的不确定失败。

Scope

  • 调查 Push 写入、Presence 聚合读取、L1 缓存和测试 cleanup 之间的状态/时序。
  • 明确 waitForWSOnline 应观察的权威状态与有界等待契约。
  • 增加可重复的 Go Functional 回归,覆盖首次连接、关闭和不同 device id 重连。
  • 若确认缓存失效缺陷,做最小一致性修复并补充指标。

Non-goals

Acceptance Criteria

  • TestFN_WS_Reconnect 在同一稳定栈上连续运行 20 次无 ONLINE 观测超时。
  • 首次连接与重连均在有界时间内由 Presence 查询观测到 ONLINE,关闭后最终收敛 OFFLINE。
  • 多 device id 不会因陈旧 L1/聚合缓存遮蔽当前 Redis 状态。
  • 诊断日志和指标不包含 token、JTI 或凭据。
  • 测试失败时输出实际聚合状态、设备状态和缓存命中来源,但不输出个人数据。

Test-first Plan

RED:在完整栈运行 cd tests && go test -tags=func ./func/... -run '^TestFN_WS_Reconnect$' -v -count=20,保存至少一次 did not become online within 10s 及对应 Redis 状态证据。GREEN:定位权威状态或缓存失效边界后重跑相同命令,并运行 Presence/WS Functional 子集。

Risk and Security

风险是错误调整缓存或 TTL 导致在线状态抖动、跨实例陈旧或 Redis 压力增加。不得通过无界轮询、移除缓存上限或记录用户/token 标识规避测试失败;需要有界等待和不含敏感数据的聚合指标。

Architecture Impact

No,除非调查证明需要改变 Push/Presence 状态所有权或缓存拓扑;若发生必须先更新 Issue 合同并取得范围批准。

Core-flow Impact

Yes。涉及 WebSocket 生命周期到 Redis Presence 状态及聚合读取的一致性和缓存可见性。

Required Skill Updates

  • .agents/skills/chatnow-orienting/references/core-flows.md
  • 若修改测试门禁:.agents/skills/chatnow-testing/references/framework.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions