2011-03-03 70 views
1

我正在尋找一種解決方案來保證客戶端使用清漆的響應時間,而不會限制後端響應時間。限制清漆客戶端等待時間,而不是後端時間

我有大約100個不同的資源(http://host/resource.js?id = 1等),平均每秒鐘在後端計算一次。這些資源通過清漆進行緩存,因此每個資源都可以同時服務於多個客戶端。資源被包含爲同步(頁面阻止)javascript,因此響應應該快速服務(例如3秒)。因爲我想保證客戶端的響應時間,所以我想不出比在這3秒內配置後端超時更好的解決方案。一個例子vcl看起來像:

backend mybackend { 
    .host = "127.0.0.1"; 
    .port = "8080"; 
    .connect_timeout = 100ms; 
    .first_byte_timeout = 3s; 
    .between_bytes_timeout = 3s; 
    .probe = { 
    .url = "/resource?id=1"; 
    .timeout = 3s; 
    .window = 4; 
    .threshold = 4; 
    .interval = 15s; 
    } 
} 

sub vcl_recv { 
    set req.backend = mybackend; 
    set req.grace = 5d; 
    return (lookup); 
} 

sub vcl_fetch { 
    set obj.ttl = 2m; 
    set obj.grace = 5d; 
    return (deliver); 
} 

我的問題是以下。在停止後端5分鐘並重新啓動後(在寬限期內清漆會提供陳舊的數據)之後,會在後端同時提取許多不同的資源(超出TTL但在寬限範圍內)。這會嚴重影響數據庫,並且在3秒內沒有任何資源被傳遞,也沒有任何資源被緩存。

如何避免此問題?我想保證客戶端的響應時間,但不限制後端的響應時間。失敗(虛擬javascript)暫時可以接受。隨着時間的推移,有什麼方法可以傳播請求嗎? (陳舊數據比錯誤更受歡迎)。

感謝, 艾弗

+0

我會在標籤中加入編程語言,我不認爲'varnish'標籤如此受歡迎,以至於有人會注意到這個問題(我很幸運,);)。 – 2011-03-03 23:11:48

+0

謝謝,我已經添加了java,雖然這個問題真的是關於清漆/ vcl – ivy 2011-03-03 23:17:41

回答

0

一個最簡單的解決方案將是,不要讓你的後端可公開獲得的,直到你緩存你的一些資源(服務器重啓設置一些超時後,如10分鐘)。

+0

感謝您的答覆。那麼,我可以通過拒絕一段時間的公開請求來實現這一點,同時允許本地請求通過並獲得緩存?有沒有辦法檢查back-end.uptime? 現在,我已經實現了一個解決方案,其中請求與響應生成(隊列/緩存)分離。我曾希望清漆可以爲我做這個... – ivy 2011-03-14 10:40:32

相關問題