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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions