2017-03-02 49 views
0

我必須在非常緩慢的API之前放置緩存服務。 api響應時間大約爲40秒,這對我的用戶來說太長了。我想使用像Varnish這樣的東西緩存響應。有HTTP緩存代理與異步更新?

這裏是我的問題:

當緩存服務被擊中的第一次,這將需要大約40秒鐘就可以從上游API的響應。所有連續的請求將直接從緩存中提供。當緩存TTL過期時,緩存服務必須再次輸入緩慢的API並等待40秒,這是不可接受的。有沒有辦法通過做某種異步後臺緩存更新來避免它?如果是這樣,可以清漆做到這一點?

爲簡單起見,我們假設所有客戶端請求都是相同的。

如果高速緩存服務的命中次數達到每秒數百次,情況實際上會嚴重得多。長達40秒的等待刷新緩存將排隊數以千計的客戶端請求,這可能會導致不同類型的問題,包括丟棄連接。我認爲Varnish足夠智能,它只會觸發一次上游API調用,並排隊其他請求,直到獲得響應。

清漆或其他物品是否保存最近一次的正確複印?如果我的緩慢API已經停止並且根本沒有響應,那麼即使緩存過期,是否可以從緩存中爲LKGC提供服務?

什麼是最好的軟件來實現這一切?

回答

1

清漆絕對支持這通過寬限期模式。您將需要一些VCL code magic to enable grace mode。這是它是什麼:

  • 最初的請求會很慢。它將被緩存一些TTL。
  • 當爲初始請求定義寬限時,Varnish將緩存的對象保留在其TTL之外。那段時間被稱爲「寬限期」。
  • 如果對於已過期但仍在其寬限期內的對象發出後續請求,Varnish將在執行異步後端請求時返回過時的緩存對象

因此,只有最初的請求會很慢。客戶將得到更新請求,不會有任何延誤。

基本上,您希望將「健康的後端寬限期」設置爲您的後端將生成響應所需的最長時間。示例:

sub vcl_hit { 
    if (obj.ttl >= 0s) { 
     # normal hit 
     return (deliver); 
    } 
    # We have no fresh fish. Lets look at the stale ones. 
    if (std.healthy(req.backend_hint)) { 
     # Backend is healthy. Limit age to 45s. 
     if (obj.ttl + 45s > 0s) { 
      set req.http.grace = "normal(limited)"; 
      return (deliver); 
     } else { 
      # No candidate for grace. Fetch a fresh object. 
      return(fetch); 
     } 
    } else { 
     # backend is sick - use full grace 
     if (obj.ttl + obj.grace > 0s) { 
      set req.http.grace = "full"; 
      return (deliver); 
     } else { 
      # no graced object. 
      return (fetch); 
     } 
    } 
} 

在此示例中,我將其設置爲45秒。這確保覆蓋可能需要40秒的緩慢API請求。