Skip to content

Feature/kvcm online optmizer#1135

Open
YoungRX wants to merge 4 commits into
mainfrom
feature/kvcm_online_optmizer
Open

Feature/kvcm online optmizer#1135
YoungRX wants to merge 4 commits into
mainfrom
feature/kvcm_online_optmizer

Conversation

@YoungRX

@YoungRX YoungRX commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

flexlb 新增 Online Optimizer 客户端,支持 KV Cache 理论命中率统计

  1. 启动时异步注册实例至远程 optimizer,带指数退避重试
  2. 注册前校验远程参数一致性,不一致则先删再注册
  3. 路由成功后 fire-and-forget 上报 block cache keys(traceQuery)
  4. 支持 VIPServer 服务发现与直连两种寻址方式
  5. 集成至优雅上下线生命周期(GracefulOnlineService / GracefulShutdownService)
  6. 幂等保护防止重复初始化导致监听器泄漏

@LLLLKKKK

Copy link
Copy Markdown
Collaborator

AI Code Review - PR #1135

Status: LGTM

Summary: P0/0 · P1/0 · P2/3 · P3/1

lgtm ready to ci

Non-blocking Suggestions

P2

  • findExistingInstance 对非 404 HTTP 错误也视为「实例不存在」,可能触发不必要的重注册 @ rtp_llm/flexlb/flexlb-sync/src/main/java/org/flexlb/service/optimizer/OnlineOptimizerClient.java:183
    • 建议:建议收窄 catch 范围:仅对包含 httpStatusCode=4 的 RuntimeException 返回 null(视为 not-found),其他异常重新抛出触发重试。至少在日志中附加异常类名便于排查。
  • afterStartUp 的 started 标志在参数校验失败时不回滚,阻止后续重试 @ rtp_llm/flexlb/flexlb-sync/src/main/java/org/flexlb/service/optimizer/OnlineOptimizerHooker.java:89
    • 建议:在参数校验失败的各个 return 分支前重置 started.set(false);或将 started 的 CAS 移到成功创建 client 之后。不影响 ServiceDiscovery listener 防泄漏逻辑。
  • traceQuery fire-and-forget 在高 QPS 下缺少背压保护 @ rtp_llm/flexlb/flexlb-sync/src/main/java/org/flexlb/service/optimizer/OnlineOptimizerClient.java:275
    • 建议:建议增加 AtomicInteger 计数器跟踪 pending 请求数,达到阈值时跳过本次 traceQuery;或使用 Sinks.many().unicast() 配合 onBackpressureDrop 做流量整形。

P3

  • GracefulShutdownService.offline() 各步骤间无独立异常隔离 @ rtp_llm/flexlb/flexlb-sync/src/main/java/org/flexlb/service/grace/GracefulShutdownService.java:38
    • 建议:每个步骤包裹 try-catch(Exception),记录错误后继续执行后续步骤,确保资源释放不被上游异常阻断。

Checklist Violations (3 fail / 31 total)

General Principles Checklist

  • [6.1] Architecture — 状态不变量:创建/更新/失败/重试/回滚路径有效 → issue afterStartUp 的 started 标志在参数校验失败时不回滚,阻止后续重试
    afterStartUp 的 started 标志在参数校验失败时不回滚,阻止后续重试。对比 ServiceDiscoveryAddressResolver.start() 正确实现了失败回滚。
  • [6.1] Architecture — 错误语义:fail-fast/retry/fallback/silent 行为显式 → issue findExistingInstance 对非 404 HTTP 错误也视为「实例不存在」,可能触发不必要的重注册
    findExistingInstance 的 catch(Exception) 将所有非 FlexLBException/IllegalStateException 异常静默视为 not-found,模糊了传输错误与 HTTP 404 的语义边界。
  • [6.1] Architecture — 可观测性:日志/指标/超时可操作、非噪声 → checklist-only
    traceQuery 的 subscribe 错误回调和外层 catch 均使用 log.debug 级别,生产环境默认不启用 DEBUG,optimizer 通信故障将完全静默。但作为热路径 fire-and-forget 调用,debug 级别可视为有意设计以避免日志洪泛,故不单独升级为 issue。

Strengths

  • 注册流程设计成熟:异步重试 + 指数退避 + jitter + 最大延迟封顶,不阻塞 Spring 启动流程
  • 完善的幂等性设计:getInstance 检查 + matchesRemote 参数比对(支持顺序无关的列表比较),避免无效重注册
  • 并发安全细节到位:volatile + AtomicBoolean 组合正确,traceQuery 中对 optimizerUri 做局部快照防止 TOCTOU,有注释说明设计意图
  • 测试覆盖全面且高质量:4 个测试类共约 1280 行覆盖正常流程、重试、异常、边界值、malformed 响应、shutdown 后行为等场景

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants