2015-10-06 5 views
3

Я смущен о том, где установить время отсрочки в лаке 4. Я видел пример библиотеки VCL установки времени отсрочки в vcl_recvлак время 4 благодати в зависимости от здоровья бэкэнда

sub vcl_recv { 
    ... 
    set req.http.grace = 60m; 
    ... 
} 

других установить его в vcl_hit

sub vcl_hit { 
    ... 
    set obj.grace = 60m; 
    ... 
} 

и в документации (https://www.varnish-cache.org/docs/4.0/users-guide/vcl-grace.html) они установлены в vcl_backend_response

sub vcl_backend_response { 
    ... 
    set beresp.grace = 60m; 
    ... 
} 

Я также видел примеры, когда льготный период был установлен как в vcl_recv и vcl_backend_response.

Может кто-нибудь объяснить, почему нужно было установить его в одном конкретном месте?

На практике я хочу установить время изящества в зависимости от того, считается ли бэкэнд здоровым или нет; Интуитивно я бы установить его перед лаковых контактов бэкенда, так что я бы установить время отсрочки в vcl_recv и решить, следует ли сервер из кэша в vcl_hit так: Является ли

sub vcl_recv { 
    ... 
    if (std.healthy(req.backend_hint)) { 
     set req.http.grace = 2m; 
    } else { 
     set req.http.grace = 60m; 
    } 
    ... 
} 

sub vcl_hit { 
    if (obj.ttl >= 0s) { 
     # A standard hit, deliver from cache 
     return (deliver); 
    } 
    elsif (obj.ttl + obj.grace > 0s) { 
     # page expired, serve from cache in the meantime 
     return (deliver); 
    } else { 
     return (fetch); 
    } 
} 

этого правильный подход?

ответ

4

Это результат моих исследований ГНФАР:

  1. установка req.http.grace в vcl_recv не помогает, так как это только определяет новую запись заголовка, но в противном случае лак будет игнорировать его
  2. установка obj.grace в vcl_hit не работает, как OBJ читается только в лаке 4
  3. единственное место время благодать может быть установлена ​​так, что лак признает это в подпрограмме vcl_backend_response в beresp.grace
  4. потому, что льготный период может быть установлен только в vcl_backend_response устанавливая различные времена грации в зависимости от здоровья бэкенда не представляется возможным там, как эта функция только когда лак извлекает данные из бэкэнда после промаха в кеше, что слишком поздно для того, что я хочу. Мне нужно установить время извлечения до того, как обратится бэкэнд.

Мое решение за то, что в разное время грация в зависимости от здоровья бэкэнда это:

  1. Я устанавливаю время отсрочки до максимума 2 благодатных времен: «нормальное время благодати» и " льготное время, когда бэкэнд болен »
  2. , следует ли обслуживать из кеша или обращаться к бэкенду, определяется в vcl_hit; вот где я могу подражать 2-й раз льготного

Вот как мой vcl_hit выглядит

sub vcl_hit { 
     if (obj.ttl >= 0s) { 
       # A standard hit, deliver from cache 
       return (deliver); 
     } 
     elsif (std.healthy(req.backend_hint)) { 
       if (obj.ttl + 30m > 0s) { 
         # page expired within a limited grace time and backend 
         # is healthy: deliver from cache while cache is updated 
         # asynchronous 
         return (deliver); 
       } else { 
         # page expired too long ago - fetch from backend 
         return (fetch); 
       } 
     } 
     else { 
       if (obj.ttl + obj.grace > 0s) { 
         # backend is not healthy - provide the page from cache 
         # during full grace time set in vcl_backend_response 
         return (deliver); 
       } else { 
         # page expired for the full grace time and backend is 
         # considered unhealthy - try to contact the backend 
         # anyway 
         return (fetch); 
       } 
     } 
} 

Здесь я «определил» 2-й раз льготных 30 минут с помощью условного

  if (obj.ttl + 30m > 0s) { 

В vcl_backend_response Я просто установить максимальное время отсрочки 6 часов:

sub vcl_backend_response { 
     # define full grace time here 
     set beresp.grace = 6h; 
     ... 
}