Skip to content

bug(plugin-auth): [auth] no cache service registered 在 CacheServicePlugin 注册前 21ms 就喊了 —— 误报,且把人引向「你需要 Redis」 #4772

Description

@os-zhuang

TL;DR

pnpm dev(showcase)每次启动都报一条"没有 cache 服务,限流退化成进程内内存计数器,多节点部署需要 Redis"。但 CacheServicePlugin 就在 21 毫秒后注册好了,而且它本来就在已加载插件列表里。

#4771 是同一类问题(校验/告警跑在提供方注册之前),但在另一个子系统,修法也不同,所以单开。

现场

WARN [auth] no cache service registered — rate-limit counters use a per-process in-memory
     store; a multi-node deployment needs a shared cache (Redis) to enforce limits
     globally (ADR-0069 D2)

启动摘要里的已加载插件:

Plugins: 47 loaded
         ObjectQL, SqlDriver, ..., QueueServicePlugin, CacheServicePlugin, SettingsServicePlugin, ...

证据

--log-level info 的时间戳:

事件 时刻
WARN [auth] no cache service registered 04:28:04.527
INFO Service 'cache' registered {"service":"cache"} 04:28:04.548
INFO CacheServicePlugin: registered memory cache adapter 04:28:04.548

21ms

为什么值得修

告警本身的建议("多节点需要 Redis")在这个语境下是错的指路:这个部署确实配了 cache 插件,缺的不是 Redis,是"auth 在 cache 注册完之前就问了"。照着这条日志去接 Redis,接完还是会看到同一条 warn。

#4771:真正没配 cache 服务的部署会得到一模一样的一条 warn,两种情况无法区分。

修法(择一)

  1. 把这次探测推迟到 kernel:ready,那时服务注册表才是完整的 —— 与 bug(service-automation): flow 节点类型校验跑在插件贡献的执行器注册之前 —— 每个 ADR-0019 approval flow 都被误报「will fail at execution time」 #4771 同一思路。
  2. auth 改成惰性解析 cache:不要在 start() 时一次性拍板并缓存"没有 cache",而是在真正用限流计数器时再取一次服务。这样也顺带修掉真正的功能退化 —— 目前即使 cache 后来注册上了,auth 这一侧是不是还捏着启动时那个进程内存储?这一点我没验证,但如果是,那就不只是日志误报,而是限流真的没用上共享 cache。值得在修的时候一并确认。

复现

rm -rf examples/app-showcase/.objectstack && pnpm dev

看时序:objectstack dev --seed-admin --log-level info,对比上表两个时间戳。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions