fix(ssr-cache): log generation bump and effective SSR_CACHE_SECS

Dioxus 0.7 的增量渲染器把 IncrementalRenderer 封装在 FullstackState 内部
(pub(crate)),应用侧无法拿到句柄调用 invalidate(),世代号机制只是"未来就绪"
状态。实际失效仍依赖 SSR_CACHE_SECS 兜底 TTL,但此前写入路径完全静默,部署者
无法从日志判断"文章已写入、只是 SSR 缓存未失效",易误判成 DB/发布问题。

- bump_global_generation() 增加 info 日志(带 new_generation),诚实说明 Dioxus
  0.7 不读取此值、需等 TTL 过期。
- main.rs 启动时打印生效的 SSR_CACHE_SECS(滞后上界),提示可调小缩短滞后。
This commit is contained in:
xfy 2026-06-29 15:42:40 +08:00
parent 45811df96e
commit 962bef2276
2 changed files with 26 additions and 11 deletions

View File

@ -325,16 +325,20 @@ fn main() {
// 配置增量渲染缓存,默认缓存 3600 秒,可通过 SSR_CACHE_SECS 覆盖。
// 注意src/ssr_cache.rs 中的世代号是未来就绪基础设施,当前并不会使
// Dioxus 0.7 的 SSR 缓存实际失效Dioxus 未暴露相应 API。在 API 可用
// 之前SSR_CACHE_SECS 仍是唯一有效的兜底 TTL。
let config = ServeConfig::builder().incremental(
dioxus::server::IncrementalRendererConfig::default().invalidate_after(
std::time::Duration::from_secs(
std::env::var("SSR_CACHE_SECS")
// 之前SSR_CACHE_SECS 仍是唯一有效的兜底 TTL——它就是内容写入后
// SSR 页面可见滞后的上界。
let ssr_cache_secs = std::env::var("SSR_CACHE_SECS")
.ok()
.and_then(|s| s.parse().ok())
.unwrap_or(3600),
),
),
.unwrap_or(3600);
tracing::info!(
ssr_cache_secs,
"增量渲染缓存生效(写入后内容可见滞后的上界);\
SSR "
);
let config = ServeConfig::builder().incremental(
dioxus::server::IncrementalRendererConfig::default()
.invalidate_after(std::time::Duration::from_secs(ssr_cache_secs)),
);
// SSR 世代号中间件:把当前全局世代号注入请求扩展,并对 GET 请求的

View File

@ -41,10 +41,21 @@ static GLOBAL_GENERATION: LazyLock<AtomicU64> = LazyLock::new(AtomicU64::default
pub struct SsrGeneration(pub u64);
/// 原子递增并返回新的全局世代号。
///
/// 任何文章写入操作都会调用本函数,标记 SSR 渲染结果已过期。当前 Dioxus 0.7
/// 不读取此世代号(详见模块文档),实际失效仍依赖 `SSR_CACHE_SECS` 兜底 TTL。
/// 此处打一条 info 日志,既证明写入路径已执行,也提醒部署者此处存在滞后——
/// 避免"我改了文章怎么没变"被误判成 DB/发布链路问题。
pub fn bump_global_generation() -> u64 {
GLOBAL_GENERATION
let new = GLOBAL_GENERATION
.fetch_add(1, Ordering::SeqCst)
.wrapping_add(1)
.wrapping_add(1);
tracing::info!(
new_generation = new,
"SSR 世代号已递增写入路径触发。注意Dioxus 0.7 不读取此值,\
SSR SSR_CACHE_SECS "
);
new
}
/// 返回当前全局世代号。