Увеличьте время отсрочки лакировки, пока бэкэнд болен

Мы используем Varnish Cache в качестве внешнего интерфейса для многих наших клиентов, и мы благосклонно серверируем устаревший контент, пока какой-либо сервер не работает.

Теперь у нас есть неисправный бэкенд, и мы хотим увеличить льготный период (пока он болен), возможен ли такой сценарий? Пробовал копаться в документах и ​​ничего не нашел.

Лак 4


person Mohamed Magdy    schedule 26.07.2016    source источник


Ответы (1)


Обслуживание устаревшего контента в Varnish Cache 4.x, когда серверная часть не работает, является обычным кешем. Вам просто нужно реализовать свою собственную подпрограмму vcl_hit. Идея состоит в том, чтобы кэшировать содержимое с использованием высокого значения отсрочки (например, 24 часа), но ограничить отсрочку небольшим временным окном (например, 10 секунд), когда ваш бэкенд исправен:

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 10s.
        if (obj.ttl + 10s > 0s) {
            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) {
            return (deliver);
        } else {
            # No graced object.
            return (fetch);
        }
    }
}

Для получения дополнительной информации проверьте:

person Carlos Abalde    schedule 28.07.2016
comment
Спасибо, но я все еще не понял. Сценарий таков, что у меня есть vcl_hit, как вы сказали, и я установил отсрочку на 5 часов, бэкэнд был болен. Я хочу увеличить эти 5 часов, скажем, до 10 часов или около того, пока он все еще болен, это возможный сценарий? - person Mohamed Magdy; 28.07.2016
comment
Насколько я знаю, если вы сохранили контент в Varnish Cache с использованием льготного значения X часов, этот контент будет удален из хранилища X часов после вставки в хранилище, и вы ничего не можете сделать в VCL, чтобы избежать это (у вас есть beresp.keep, но я думаю, что оно здесь не пригодится). Поэтому единственным решением будет хранение объектов с использованием значения отсрочки, превышающего максимальное ожидаемое время простоя серверной части. - person Carlos Abalde; 28.07.2016