Skip to content

feat: jitter dns cache ttl to avoid expiry bursts - #110

Merged
nange merged 1 commit into
masterfrom
feat/dns-cache-ttl-jitter
Aug 19, 2026
Merged

feat: jitter dns cache ttl to avoid expiry bursts#110
nange merged 1 commit into
masterfrom
feat/dns-cache-ttl-jitter

Conversation

@nange

@nange nange commented Aug 19, 2026

Copy link
Copy Markdown
Owner

背景

客户端 DNS 查询结果缓存后存在一个突出问题:大量域名(尤其是 TTL 被 clamp 到统一下限/上限的条目)的缓存几乎在同一时刻过期,导致短时间内爆发大量 DNS 查询请求。无论从性能(上游 DNS 服务器瞬时压力)还是流量特征(突发的查询模式容易被识别)角度都不友好。

改动

  • client/dns/cache.go:新增 jitterTTL(),写入缓存时的实际存活时间 = 基础 TTL + 随机(0, 基础 TTL),即最终 TTL 落在 [基础TTL, 2×基础TTL) 区间,让过期时刻均匀错开。
  • client/dns/cache_test.go:新增 TestJitterTTL_NeverExpire(服务器域名永不过期语义不变)与 TestJitterTTL_Range(1000 次采样结果均落在 [base, 2×base) 且取值分散)。

设计要点

  1. 抖动施加在 clamp 之后:若先加随机再 clamp,低于 minCacheTTL 的条目会被重新统一 clamp 成同一个 30 分钟,抖动完全失效。
  2. dnsCacheTTL 保持纯函数,clamp 逻辑与既有测试不变。
  3. 服务器自身域名仍永不过期(TTL=0 原样返回),避免 TUN 启动期 DNS 死锁。
  4. 使用 math/rand/v2 顶层 rand.IntN,并发安全,无需额外加锁。
  5. direct / proxied 两个缓存各自独立取随机数,同域名两条目过期时刻也不同,分散效果更好。

验证

  • go test -v ./client/dns/... 全部通过(14 个测试)
  • make lint 0 issues

@nange nange changed the title feat: DNS 缓存 TTL 增加随机抖动,错开批量过期 feat: jitter dns cache ttl to avoid expiry bursts Aug 19, 2026
@nange
nange merged commit 4ae6565 into master Aug 19, 2026
6 checks passed
@nange
nange deleted the feat/dns-cache-ttl-jitter branch August 19, 2026 12:37
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