Flickr 作為 Web 2.0 代表,其優化實踐極具參考價值。本文梳理其在文件策略、壓縮、緩存、構建部署四個維度的核心技巧。
困境:
Flickr 折衷方案:
| 維度 | mod_gzip | mod_deflate (Apache 2.x+) |
|---|---|---|
| 壓縮位置 | 磁盤臨時文件 | 內存中直接壓縮 |
| CPU 消耗 | 雙端(服務端+客戶端) | 服務端壓縮,客戶端解壓 |
| 磁盤 I/O | 高(寫臨時文件) | 極低 |
| 靜態文件預壓縮 | 支持(新版本) | 需配合預壓縮策略 |
Flickr 策略:
核心機制:
Last-Modified + If-Modified-Since:基於修改時間ETag + If-None-Match:基於內容指紋(更精確)負載均衡下的 ETag 陷阱與解法:
FileETag MTime Size(去除 inode),僅用修改時間+大小If-Modified-Since 準確性,需權衡緩存層級設計:
| 層級 | 對象 | 策略 | TTL |
|---|---|---|---|
| 瀏覽器 | 靜態資源 | Cache-Control: max-age=31536000, immutable | 1年 |
| CDN/反向代理 | 靜態+動態 | Vary: Accept-Encoding + ETag | 按業務 |
| 應用層 | 數據庫查詢、計算結果 | Redis/Memcached + 標籤失效 | 分鐘-小時 |
# 示例:基於 Cookie 灰度
RewriteCond %{HTTP_COOKIE} new_version=1
RewriteRule ^(.*)$ /v2/$1 [L]
# 默認舊版本
RewriteRule ^(.*)$ /v1/$1 [L]
| Flickr 時代 | 現代對應 |
|---|---|
| 文件合併折衷 | HTTP/2 多路復用 + ES Module + Tree Shaking |
| mod_deflate | Brotli (br) 壓縮 + HTTP/2/3 |
| ETag inode 問題 | 容器化部署統一構建產物 + 內容哈希命名 |
| mod_rewrite 版本切換 | K8s 滾動更新/藍綠部署/金絲雀發布 |
| JS 混淆壓縮 | Terser + Source Map + 模塊聯邦 |
Flickr 的優化哲學——在約束中尋找平衡,用工程化手段解決架構問題——至今仍具指導意義。