В Kinsta мы одержимы скоростью: наши услуги хостинга приложений, хостинга баз данных и управляемого хостинга WordPress работают на самой быстрой сети премиум-уровня Google Cloud Platform и машинах C2, и мы полагаемся на Cloudflare, чтобы держать педаль нажатой для достижения максимальной скорости. десятки тысяч клиентов, которые хотят доставлять свой контент по всему миру быстро и безопасно.

Делая это, мы узнали кое-что об использовании Cloudflare Workers и Workers KV для обеспечения оптимизированных правил кэширования для статического и динамического контента.

В начале 2023 года мы удвоили усилия по обработке кеша Cloudflare, сделав кеши более чувствительными к изменениям конфигурации на стороне клиента, а также перенеся тяжелую работу по широковещательной трансляции обновлений функций с наших администраторов на серверной части на Cloudflare Workers. Ключевым результатом стало резкое увеличение доли успешно кэшированных данных клиентов, увеличившись на 56,3% в период с октября 2022 года по март 2023 года.

В январе 2023 года оптимизации с помощью Cloudflare Workers стало уделяться больше внимания.

Cloudflare Workers и Workers KV позволяют нам программно настраивать каждый запрос и ответ с минимальными усилиями и меньшей задержкой. Нам больше не нужно развертывать изменения в сотнях тысяч контейнеров, когда мы хотим реализовать новые функции; мы можем воспроизвести или реализовать эту функцию с помощью Workers и развернуть ее повсюду с помощью нескольких команд и щелчков мышью, что сэкономит нам дни работы и обслуживания.

Маршрутизация запросов с рабочими KV и рабочими

Каждый домен, размещенный на Kinsta, является ключом, и его значение содержит как минимум основные настройки, такие как IP-адрес и порт источника, а также уникальный случайный идентификатор. Благодаря тому, что эти данные легко доступны в Workers KV, мы можем использовать Workers для анализа, манипулирования и маршрутизации запросов к ожидаемому серверу. Мы также используем Workers KV для хранения параметров клиентской оптимизации, таких как полировка, изменение размера изображения и автоматическое минимизация.

Для маршрутизации запросов на пользовательские IP-адреса и порты мы используемsolveOverride, свойство Request, специфичное для Cloudflare. Вот пример:

// Assign KV values to variables
const { customBackend } = kvdata.kinstaConf;

// Override the backend
cf.resolveOverride = customBackend;

Однако, хотя Workers KV хорошо справлялся с маршрутизацией запросов, вскоре мы заметили противоречивые ответы в нашем кеше. Иногда клиент активировал польский язык, и из-за одноминутного кэша Workers KV новые запросы поступали до того, как Workers KV полностью распространили изменение, в результате чего мы кэшировали неоптимизированные ресурсы. Когда это произошло, клиенту пришлось снова очистить свой кеш вручную. Не идеальный сценарий. Клиенты были разочарованы, и мы тратили впустую операции API и пропускную способность GCP, постоянно очищая кеши.

Ключ кэша — это ключ

Поскольку мы всегда читаем данные Workers KV домена, мы поняли, что можем маршрутизировать запросы и настраивать ключ кэша, добавляя такие вещи, как идентификатор домена и функции, которые могут повлиять на актив, например польский язык. Сегодня наш ключ кэша сильно настроен, чтобы быстро отражать каждое изменение клиента в нашей панели или API. Изменив ключ кэша с использованием данных Workers KV, никому больше не придется беспокоиться об очистке кэша. Как только Workers KV распространяет изменения, ключ кэша также меняется, и мы запрашиваем и кэшируем новый актив.

Самый простой способ настроить ключ кэша — добавить query params к этому. Например:

let cacheKey = `${request.url}?custom-cache-param-polish=lossy`

Конечно, вам нужно проверить URL-адрес на наличие существующих параметров, чтобы определить, какой коннектор использовать — ? или & — и убедитесь, что вы используете уникальный идентификатор.

Затем вы можете использовать этот новый ключ кэша для сохранения ответа с помощью Cache API или Fetch — или того и другого.

Рабочие КВ Кэш

Операции Workers KV доступны по цене, но их число может возрасти, если вы ежедневно запускаете миллиарды операций чтения.

Благодаря настройке ключа кэша мы поняли, что можем кэшировать данные Workers KV с помощью Cache API, экономя на операциях чтения и, возможно, снижая задержку, избегая нескольких запросов Workers KV GET на одного посетителя. Поскольку кешированный ответ теперь основан на URL-адресе запроса в сочетании с данными KV, нам больше не нужно беспокоиться о кэшировании устаревшего контента.

Диаграмма, показывающая последовательность операций при кэшировании данных Workers KV.
Включен технологический процесс с кэшированием данных Workers KV.
Диаграмма, показывающая ответы TTFB для различных сценариев кэширования.
Среднее время до первого байта в различных сценариях кэширования.

Однако, в отличие от многих приложений, мы не можем кэшировать Workers KV в течение длительного периода времени. Клиенты Kinsta постоянно пробуют новые функции, меняют настройки полировки и автоматического минимизации, иногда исключая страницы или расширения из кэширования, и они хотят как можно скорее увидеть свои изменения в работе.

Именно тогда мы решили микрокэшировать наши данные Workers KV — кэшируя динамический или постоянно меняющийся контент на очень короткий период времени, обычно менее 60 секунд.

Реализовать собственную логику кэширования Workers KV довольно просто. Например:

const handleKVCache = async (event, myCustomDomain) => {
  // Try to get KV from cache first
  const cache = caches.default;
  let site_data = await cache.match( `https://${myCustomDomain}/some-string-ID-kv-data/` );

  // Valid KV cache match
  if (site_data && site_data.status === 200) {
    // ... modify your cached data if necessary, then return it
    return site_data;
  }

  // Invalid cache (expired, miss, etc), get data from KV namespace
  site_data = await KV_NAMESPACE.get(myCustomDomain.toLowerCase());
  
  // Cache valid KV responses with Cache API
  if (site_data) {
    let kvResponse = new Response(JSON.stringify(site_data), {status: 200});
    kvResponse.headers.set("Cache-Control", "public, s-maxage=30");
    event.waitUntil(cache.put(`https://${myCustomDomain}/some-string-ID-kv-data/`, kvResponse));
  }
  
  return site_data;
};

(При желании вы можете использовать BetterKV от FlareUtils.)

В Kinsta мы внедрили 30-секундный TTL кэша для данных Workers KV, сократив операции чтения примерно на 80%.

Диаграмма, показывающая изменение операций чтения с течением времени.
Уменьшите количество операций чтения после реализации TTL 30 секунд для кэша данных Workers KV.

Узнать больше

Хотите узнать больше о Рабочих и Рабочих КВ? Ознакомьтесь с документацией для разработчиков Cloudflare Workers KV или начните с посещения специальной домашней страницы Cloudflare Workers KV.

Эта статья была первоначально опубликована на сайте Cloudflare.