Инвалидация кешей в Yandex DataLens
DataLens кеширует результаты запросов к источникам данных, чтобы ускорить отображение чартов и дашбордов. По умолчанию кеш обновляется только после истечения TTL (времени жизни кеша в секундах). Если данные обновляются регулярно, но нечасто, и нужно видеть свежие данные, то проблема в том, что обновление зависит от TTL.
Инвалидация кешей помогает решить эту проблему. Система периодически отправляет «инвалидационный запрос» к источнику данных и проверяет, изменились ли данные. Если результат запроса изменился, кеш обновляется сразу, не дожидаясь истечения TTL.
Этапы инвалидации
Инвалидационный запрос должен быть построен так, чтобы выполняться достаточно быстро для текущей базы данных.
Система выполняет инвалидационный запрос с заданной периодичностью (троттлинг), а основной запрос — только когда данные действительно изменились или истекло время жизни кеша:
- Пользователь настраивает инвалидационный запрос в датасете (SQL или формулу с фильтрами). Такой запрос один на весь датасет. Его можно настроить только для датасета, который был сохранен хотя бы раз.
- При каждом запросе данных система сначала проверяет инвалидационный кеш.
- Если кеш инвалидации устарел (истек интервал троттлинга) — выполняется инвалидационный запрос к БД.
- Результат запроса — короткая строка, например
"2024-01-15T10:30:00". - Этот результат добавляется к ключу основного кеша данных.
- Когда результат меняется или истекает время жизни кеша, меняется ключ кеша, и данные загружаются заново.
Типичные сценарии использования
- Таблица с колонкой «updated_at» — инвалидационный запрос
SELECT MAX(updated_at)::text FROM ordersотслеживает последнее обновление. - Таблица с автоинкрементным ID — запрос
SELECT MAX(id)::text FROM eventsотслеживает появление новых записей. - Таблица с версионированием — запрос
SELECT version::text FROM metadata WHERE table_name = 'orders'отслеживает версию данных.
Троттлинг и координация
Троттлинг — величина, которая обеспечивает выполнение инвалидационного запроса не чаще чем раз в N секунд. Например, при значении 60 — не чаще раза в минуту, даже если за это время приходит 1 000 запросов данных. Пока интервал не истек, повторные запросы используют закешированный результат инвалидационного запроса.
Режимы инвалидации
Доступны следующие режимы:
-
Режим Нет — инвалидация не выполняется. Кеш обновляется только по истечении TTL. Это поведение по умолчанию.
-
Режим SQL — пользователь задает произвольный SQL-запрос, который выполняется напрямую к источнику данных.
Требования:
- Подключение должно поддерживать подзапрос.
- SQL-запрос не должен быть пустым.
- Результат должен соответствовать требованиям.
-
Режим По формуле — пользователь задает формулу DataLens (аналогично вычисляемому полю) и опциональные фильтры. Формула компилируется и выполняется через стандартный пайплайн запросов DataLens.
Требования:
- Формула не должна быть пустой.
- Формула должна возвращать строковый тип.
- Результат должен соответствовать требованиям.
Режим
По формулеудобен тем, что использует стандартные механизмы DataLens (формулы, фильтры) и не требует знания SQL-диалекта конкретной БД.
Требования к результату инвалидационного запроса
Инвалидационный запрос (SQL или формула) должен возвращать результат, который соответствует следующим требованиям:
- Запрос должен вернуть ровно одну строку и один столбец.
- Значение должно быть строкой.
- Длина строки не должна превышать
100символов.
Настройка проверки кеша
Чтобы настроить проверку кеша в датасете:
-
В настройках подключения, на основе которого построен датасет, в разделе Настройки кеширования включите опцию Разрешить проверку кеша в датасетах и задайте период обновления кеша — не чаще, чем раз в
Nс. Возможные значения: от30до86 400секунд.Примечание
Для режима инвалидации
SQLвключите опцию Уровень доступа SQL-запросов. -
Откройте датасет, для которого необходимо настроить проверку кеша.
-
Перейдите на вкладку Проверка кэша.
-
Выберите режим инвалидации и настройте параметры проверки:
НетПо формулеSQLИнвалидация не выполняется. Кеш обновляется только по истечении TTL. Это поведение по умолчанию.
-
Напротив поля Формула нажмите
Добавить и задайте формулу DataLens, учитывая требования:- Формула не должна быть пустой.
- Формула должна возвращать строковый тип.
- Результат должен соответствовать требованиям.
-
(опционально) Внизу слева нажмите Проверить результат. Вы можете проверить результат позже.
-
Нажмите кнопку Сохранить.
-
(опционально) Напротив поля Фильтрация нажмите
Добавить и задайте условия фильтрации.
-
Напротив поля SQL-запрос нажмите
Добавить и введите текст запроса, учитывая требования:- Подключение должно поддерживать подзапрос.
- SQL-запрос не должен быть пустым.
- Результат должен соответствовать требованиям.
-
(опционально) Внизу слева нажмите Проверить результат. Вы можете проверить результат позже.
-
Нажмите кнопку Сохранить.
-
-
Нажмите кнопку Проверить результат (недоступно для режима Нет) и убедитесь, что результат проверки соответствует требованиям.
-
В правом верхнем углу редактирования датасета нажмите кнопку Сохранить.
Тестирование инвалидации
Тестирование инвалидационного запроса происходит без влияния на основной кеш и без учета троттлинга. Оно предназначено для отладки — позволяет убедиться, что инвалидационный запрос работает корректно и возвращает ожидаемый результат.
Доступно только для пользователей с правом редактирования на датасет (для защиты от утечки данных через RLS).
Чтобы выполнить тест инвалидации:
- Откройте датасет, для которого необходимо выполнить тест.
- Перейдите на вкладку Проверка кэша.
- Нажмите кнопку Проверить результат и убедитесь, что результат проверки соответствует требованиям.
Последний результат инвалидации
При просмотре последнего результата проверки не выполняется запросов к БД. Можно увидеть, что вернул последний инвалидационный запрос и когда он был выполнен.
Доступно только для пользователей с правом редактирования на датасет.
Результатом может быть полученная строка или ошибка исполнения. Ошибка также может сигнализировать об отсутствии результата, если интервал троттлинга истек и запрос еще не выполнялся.
Чтобы посмотреть последний результат проверки:
- Откройте датасет, для которого необходимо выполнить тест.
- Перейдите на вкладку Проверка кэша. Напротив поля Последний результат отображается дата и время проведения последней проверки. Если последняя проверка завершилась с ошибкой, напротив поля Последний результат отображается
Завершился с ошибкой. - Нажмите кнопку Открыть, чтобы посмотреть результат проверки или кнопку Показать ошибку, чтобы посмотреть возникшую при проверке ошибку.
Обработка ошибок
Система инвалидации спроектирована по принципу graceful degradation — ошибки инвалидации никогда не блокируют основной запрос данных.
Если инвалидация настроена неправильно, чарты и дашборды продолжат работать — кеш будет обновляться по TTL, как если бы инвалидация была отключена. Об ошибке будет сигнализировать уведомление на чартах и датасете, а посмотреть саму ошибку можно в поле Последний результат в датасете.
Ограничения
- Таймаут инвалидационного запроса —
20секунд. - Максимальная длина результата запроса —
100символов. - Количество строк в результате — ровно
1. - Количество столбцов в результате — ровно
1. - Тип результата — строка.