Cache
強制請求錯過記憶體但仍儲存響應
我有一個慢速網路應用程序,我將 Varnish 放在前面。所有頁面都是靜態的(它們不會因不同的使用者而變化),但它們需要每 5 分鐘更新一次,以便包含最近的數據。
我有一個簡單的腳本 (
wget --mirror
),它每 15 分鐘抓取一次整個網站。每次爬行大約需要 5 分鐘。爬取的目的是更新 Varnish 記憶體中的每個頁面,這樣使用者就不必等待頁面生成(因為所有頁面都是最近生成的,這要歸功於蜘蛛)。時間線如下所示:
- **00:00:00:**記憶體刷新
- 00:00:00: Spider 開始爬行以使用新頁面更新記憶體
- **00:05:00:**蜘蛛爬完,所有頁面更新到00:15:00
在 0:00:00 和 0:05:00 之間出現的請求可能會訪問尚未更新的頁面,並且將被迫等待幾秒鐘以獲得響應。這是不可接受的。
我想做的是,也許使用一些 VCL 魔法,總是將來自蜘蛛的請求轉發到後端,但仍將響應儲存在記憶體中。這樣,使用者將永遠不必等待頁面生成,因為沒有 5 分鐘的視窗可以讓部分記憶體為空(可能在伺服器啟動時除外)。
我怎樣才能做到這一點?
req.hash_always_miss
應該做的伎倆。不要在蜘蛛執行開始時執行完整的記憶體刷新。相反,只需將蜘蛛設置為工作 - 在您的 中
vcl_recv
,將蜘蛛的請求設置為始終錯過記憶體查找;他們將從後端獲取新副本。acl spider { "127.0.0.1"; /* or whereever the spider comes from */ } sub vcl_recv { if (client.ip ~ spider) { set req.hash_always_miss = true; } /* ... and continue as normal with the rest of the config */ }
當這種情況發生時,直到新的響應在記憶體中,客戶端將繼續無縫地將舊記憶體提供給他們(只要它仍在其 TTL 內)。