Skip to content

在 Result Cache 中缓存知识库查询错误以解决缓存穿透 - #19

Open
zwk4zhendeC wants to merge 1 commit into
wp-labs:mainfrom
zwk4zhendeC:main
Open

在 Result Cache 中缓存知识库查询错误以解决缓存穿透#19
zwk4zhendeC wants to merge 1 commit into
wp-labs:mainfrom
zwk4zhendeC:main

Conversation

@zwk4zhendeC

@zwk4zhendeC zwk4zhendeC commented May 22, 2026

Copy link
Copy Markdown

摘要

  • 扩展 Result Cache 条目,使其既能保存成功查询结果,也能保存缓存的查询错误。
  • 对缓存查询失败返回内部 Null 行,同时保持 Bypass 查询的错误返回行为不变。
  • 避免将错误转换得到的 Null 行写入 Local Cache,确保重复查询仍经过 Result Cache,并能打印缓存错误日志。

详情

本次变更调整了 wp-knowledge 的 Result Cache 行为,使 CachePolicy::UseGlobal 查询在 provider 报错时也能缓存错误信息。

变更前,Result Cache 只保存成功的 QueryResponse。如果远端 PostgreSQL 或 MySQL 查询持续失败,相同请求仍会每次调用 provider。

变更后,UseGlobal 查询失败时,错误信息会按照与成功结果相同的 key 写入 Result Cache。后续相同查询会命中缓存错误,打印错误信息,并返回 Null,不再调用 provider。错误缓存的 TTL 和容量与成功结果共享,当provider reload 后错误缓存会在过期时间后自然失效。

核心改动

  • 将缓存值从只支持成功响应扩展为枚举:
    • Response(Arc<QueryResponse>)
    • Error(Arc<String>)
  • 在同步和异步 UseGlobal 查询路径中缓存 provider 错误。
  • 将缓存错误转换为内部 Null 响应。
  • 新增内部错误 Null 标记字段:
    • __wp_kdb_error = Null
  • facade 层跳过该内部错误 Null 行的 Local Cache 写入。

行为变化

CachePolicy::UseGlobal

  • 第一次失败时打印 [kdb] query error: ...,将错误写入 Result Cache,并返回 Null
  • 后续相同查询打印 [kdb] cached query error: ...,返回 Null,且不调用 provider。

CachePolicy::Bypass

  • 行为不变。
  • 查询失败仍返回 Err
  • 错误不会被缓存。

TTL、容量和 reload 语义:

  • 错误缓存复用现有 Result Cache TTL。
  • 错误缓存复用现有 Result Cache LRU 容量。
  • provider reload 后由于 generation 变化,错误缓存自然失效。

变更文件

  • src/runtime.rs
    • Result Cache 条目支持成功值和错误值。
    • runtime 为 UseGlobal 查询保存 provider 错误。
    • runtime 为缓存错误返回内部 Null 行。
    • 增加错误缓存行为的单元测试。
  • src/facade.rs
    • facade 避免将错误转换得到的 Null 行写入 Local Cache

验证

已执行:

cargo fmt --all
cargo test runtime::tests
cargo check

结果:

  • runtime::tests 通过。
  • cargo check 通过。

测试覆盖

新增测试:

runtime::tests::global_cache_stores_query_errors_as_null

该测试验证:

  • 第一次 UseGlobal 查询失败时返回 Null 并保存错误。
  • 第二次相同 UseGlobal 查询从 Result Cache 返回 Null,不会再次调用 provider。
  • Bypass 查询仍返回 Err,并会继续调用 provider。

关联Issue:#18

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.

1 participant