Как использовать кэш Cloudflare Worker в качестве быстрого KV?

Вопрос или проблема

Я не могу заставить кэш Cloudflare работать, как описано в документации Cloudflare https://developers.cloudflare.com/workers/runtime-apis/cache/

Я пытаюсь использовать кэш Cloudflare worker в качестве кэшируемого слоя перед своей базой данных.

const CACHE_URL_PREFIX = 'https://api.example.com/';

function getCache() {
  return caches.default;
}

function generateHash(str: string) {
  let hash = 0, i, chr;
  for (i = 0; i < str.length; i++) {
    chr = str.charCodeAt(i);
    hash = ((hash << 5) - hash) + chr;
    hash |= 0;
  }
  return hash.toString(36);
}

function toUniqueUrlPath(str: string) {
  let normalizedStr = str.trim();

  normalizedStr = normalizedStr.toLowerCase();

  normalizedStr = normalizedStr.replace(/[^a-z0-9 -]/g, '-');
  normalizedStr = normalizedStr.replace(/\s+/g, '-'); 

  const uniqueHash = generateHash(str);

  return `${normalizedStr}-${uniqueHash}`;
}

export function getCacheKey(key: string) {
  const normalizedKey = toUniqueUrlPath(key);

  const url = (CACHE_URL_PREFIX + normalizedKey)
    .replace(/\/+/g, "https://stackoverflow.com/");

  return new Request(url);
}

export async function getCacheValue<T>(key: string) {
  const cache = await getCache();
  const cacheKey = getCacheKey(key);

  const cachedResponse = await cache.match(cacheKey);

  if (cachedResponse) {
    return await cachedResponse.json() as T;
  }

  return undefined;
}

export async function setCacheValue<T>(key: string, value: T, ttl: number) {
  const cache = await getCache();
  const cacheKey = getCacheKey(key);

  const response = new Response(JSON.stringify(value), {
    headers: {
      'Content-Type': 'application/json',
      'Cache-Control': `public, max-age=${ttl}`
    }
  });

  await cache.put(cacheKey, response);

  const valueFromCache = await getCacheValue<T>(key); 

  if (!valueFromCache) {
    console.error('Не удалось установить значение кэша', {
      key,
      value,
      ttl,
      url: cacheKey.url,
    });
  }
}

Ошибка в консоли “Не удалось установить значение кэша” продолжает появляться, и при последующих запросах getCacheValue ничего не возвращает. Я пытался отладить это последние 3 часа.

Есть ли что-то неправильное в моей реализации?

Обновление. У меня было какое-то правило кэширования в Website / caching / caching-rules, которое применялось к рабочему кэшу. Удалил правило, теперь все работает нормально.

Ответ или решение

Как использовать кеш Cloudflare Workers в качестве быстрого KV

Введение

В последние годы облачные технологии становятся все более важными для разработки веб-приложений. Одним из заметных решений в этой области является использование функций Cloudflare Workers для кэширования данных. Cloudflare предоставляет мощный API для управления кэшом, который может значительно ускорить доступ к данным путем их временного хранения, особенно встраиваясь в архитектуру «сначала кэш».

Проблема

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

Основные шаги для эффективного использования кэша Cloudflare Workers

  1. Настройка окружения Workers:
    Убедитесь, что ваша рабочая среда настроена корректно, и у вас есть доступ к необходимым API. Если у вас есть дополнительные правила кэширования, убедитесь, что они не конфликтуют с вашей логикой кэширования в Workers.

  2. Использование функций кэширования:
    Методы getCacheValue и setCacheValue в вашем примере кода уже являются отличными первыми шагами для кэширования запросов. Позаботьтесь о правильной генерации ключей кэша через функцию getCacheKey.

  3. Идентификация ключа кэша:
    Убедитесь, что ваша функция toUniqueUrlPath генерирует уникальные ключи из строк. Использование хэширования для создания уникального идентификатора позволяет избежать коллизий.

    export function getCacheKey(key: string) {
       const normalizedKey = toUniqueUrlPath(key);
       const url = (CACHE_URL_PREFIX + normalizedKey)
           .replace(/\/+/g, "/"); // Правильная замена адреса
       return new Request(url);
    }
  4. Управление значениями кэша:
    Ваш метод setCacheValue создает новый объект Response, который правильно настроен для кэширования. Также проверьте корректность заголовков и их соответствие. Не забудьте, что Cache-Control имеет значение для кэширования.

  5. Отладка и мониторинг:
    Для отладки вы можете добавлять дополнительные логи, чтобы отслеживать, когда именно происходит кэширование или его сбой. Эффективное логирование позволяет быстро найти потенциальные стрелки.

    if (!valueFromCache) {
       console.error('Не удалось установить значение в кэше', {
           key,
           value,
           ttl,
           url: cacheKey.url,
       });
    }

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...