Cache

強制請求錯過記憶體但仍儲存響應

  • September 30, 2013

我有一個慢速網路應用程序,我將 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 內)。

引用自:https://serverfault.com/questions/425503