2015-10-04 5 views
2

Я использую stale-if-error для доставки несвежего контента в то время как сервер помечается нездоровым смотрют на grace и keep параметров объекта в vcl_hit.Deliver несвежего содержимого после ошибки выборки в Varnish 4 перед «зондом» обозначает сервер unhealth

Вопрос: Можно ли доставить объект кеша после ввода подпрограммы vcl vcl_backend_error (новая ошибка запроса). Фактически, я доставляю кешированный объект по адресу vcl_hit, но, глядя на следующую диаграмму, я не вижу, как можно получить доступ к кешированному объекту этого запроса.

https://www.varnish-software.com/book/4.0/chapters/VCL_Basics.html

Источник: https://www.varnish-software.com/book/4.0/chapters/VCL_Basics.html

+0

Я не совсем понимаю ваш вопрос. Насколько я понимаю в Varnish 4, когда новый запрос прибывает после времени жизни кэшированного объекта, но в течение льготного времени Varnish доставит устаревший объект и создаст асинхронный запрос на бэкэнд. Если этот запрос не выполнен, устаревший объект все равно будет доставлен до конца времени извлечения. – Ronald

ответ

2

При использовании встроенного в VCL (см код, приведенную ниже):

# Built-in 'vcl_hit'. 
sub vcl_hit { 
    if (obj.ttl >= 0s) { 
     return (deliver); 
    } 

    if (obj.ttl + obj.grace > 0s) { 
     return (deliver); 
    } 

    return (fetch); 
} 
  • Если vcl_backend_error достигается фоновым/асинхронный бэкендов, вызванных return (deliver) во время vcl_hit вам не нужно беспокоиться. Это просто фоновый поток для обновления застопоренного объекта. Задержанный контент уже доставлен клиенту.

  • Если vcl_backend_error достигается за счет синхронного бэкэнда, вызванного return (fetch) во время vcl_hit, вам также не нужно беспокоиться. Ошибка будет доставлена ​​клиенту, но у вас нет выбора. Замкнутый объект недоступен в лакокрасочном хранилище.

Однако, если вы настроили vcl_hit ограничить благодать, когда бэкенд здоров (см VCL примера код ниже), return (fetch) выполняется во время vcl_hit будет обрабатываться как запрос синхронного бэкэнда. Клиент будет ожидать ответ на бэкэнд. Если запрос бэкэнд достигает vcl_backend_error, и ошибка будет доставлена ​​на клиентскую сторону. Замкнутый объект доступен в хранилище Varnish (остановился более 60 секунд назад в этом примере), но он не будет использоваться.

# Customised 'vcl_hit'. 
sub vcl_hit { 
    if (obj.ttl >= 0s) { 
     return (deliver); 
    } 

    if (std.healthy(req.backend_hint)) { 
     if (obj.ttl + 60s > 0s) { 
      return (deliver); 
     } 
    } else { 
     if (obj.ttl + obj.grace > 0s) { 
      return (deliver); 
     } 
    } 

    return (fetch); 
} 

Если вы хотите поставить приостановленные объекты, когда синхронный бэкенд выборки не удается, в этом случае вам нужна дополнительная логика VCL. Идея приведена в коде ниже:

backend fail_be { 
    .host = "127.0.0.1"; 
    .port = "9000"; 
    .probe = { 
     .url = "/give-me-a-non-200-please"; 
     .interval = 24h; 
     .timeout = 1s; 
     .window = 1; 
     .threshold = 1; 
    } 
} 

sub vcl_recv { 
    # Force the non-healthy backend in case of restart because of a previous 
    # failed backend fetch. This will force serving stalled content using 
    # full grace during 'vcl_hit' (if possible). 
    if (req.restarts == 0) { 
     unset req.http.X-Varnish-Restarted-5xx; 
    } else { 
     if (req.http.X-Varnish-Restarted-5xx) { 
      set req.backend_hint = fail_be; 
     } 
    } 

    # ... 
} 

sub vcl_synth { 
    # 503 generated for synchronous client requests when abandoning the 
    # backend request (see 'vcl_backend_fetch') and not executing a POST. 
    if (resp.status == 503 && 
     req.method != "POST" && 
     !req.http.X-Varnish-Restarted-5xx) { 
     set req.http.X-Varnish-Restarted-5xx = "1"; 
     return (restart); 
    } 

    # ... 
} 

sub vcl_backend_fetch { 
    if (bereq.retries == 0) { 
     unset bereq.http.X-Varnish-Backend-5xx; 
    } else { 
     if (bereq.http.X-Varnish-Backend-5xx) { 
      # Jump to 'vcl_synth' with a 503 status code. 
      return (abandon); 
     } 
    } 

    # ... 
} 

sub vcl_backend_response { 
    if (beresp.status >= 500 && beresp.status < 600) { 
     set bereq.http.X-Varnish-Backend-5xx = "1"; 
     return (retry); 
    } 

    # ... 
} 

sub vcl_backend_error { 
    set bereq.http.X-Varnish-Backend-5xx = "1"; 
    return (retry); 
} 
+0

Это слишком много логики, но ваш ответ хорош. Благодарю. Я подожду еще несколько ответов, и если что-то будет проще, я проверю ваше. Я заполняю «грациозность» с backend-ответом stale-while-revalidate и «keep» with stale-if-error, и я пытался использовать stale-if-error, если бэкэнд возвращает ошибку в синхронном запросе, потому что кеш объект существует (потому что значение keep). – Wiliam

+2

О простоте, если вы предпочитаете, логику VCL можно немного упростить: (1) всегда поддерживаемый бэкэнд ('fail_be'), чтобы логика была более читаемой, но не требуется (вы можете удалить ее и переместите 'req.restarts> 0 && req.http.X-Varnish-Restarted-5xx' в' vcl_hit'); и (2) логика в подпрограммах 'vcl_backend _. *' может быть очень упрощена при использовании Varnish Cache 4.1 (т.удалить 'vcl_backend_fetch' и просто' return (отказаться) 'в' vcl_backend_response' и 'vcl_backend_error' вместо' return (retry) '). –

 Смежные вопросы

  • Нет связанных вопросов^_^