Вопрос или проблема
Я не могу заставить кэш 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
-
Настройка окружения Workers:
Убедитесь, что ваша рабочая среда настроена корректно, и у вас есть доступ к необходимым API. Если у вас есть дополнительные правила кэширования, убедитесь, что они не конфликтуют с вашей логикой кэширования в Workers. -
Использование функций кэширования:
МетодыgetCacheValue
иsetCacheValue
в вашем примере кода уже являются отличными первыми шагами для кэширования запросов. Позаботьтесь о правильной генерации ключей кэша через функциюgetCacheKey
. -
Идентификация ключа кэша:
Убедитесь, что ваша функцияtoUniqueUrlPath
генерирует уникальные ключи из строк. Использование хэширования для создания уникального идентификатора позволяет избежать коллизий.export function getCacheKey(key: string) { const normalizedKey = toUniqueUrlPath(key); const url = (CACHE_URL_PREFIX + normalizedKey) .replace(/\/+/g, "/"); // Правильная замена адреса return new Request(url); }
-
Управление значениями кэша:
Ваш методsetCacheValue
создает новый объектResponse
, который правильно настроен для кэширования. Также проверьте корректность заголовков и их соответствие. Не забудьте, чтоCache-Control
имеет значение для кэширования. -
Отладка и мониторинг:
Для отладки вы можете добавлять дополнительные логи, чтобы отслеживать, когда именно происходит кэширование или его сбой. Эффективное логирование позволяет быстро найти потенциальные стрелки.if (!valueFromCache) { console.error('Не удалось установить значение в кэше', { key, value, ttl, url: cacheKey.url, }); }
Заключение
Использование кэша Cloudflare Workers для временного хранения данных вашего приложения может существенно повысить производительность и скорость ответа вашей системы. Убедитесь, что правила кэширования и обработка данных согласованы, чтобы избежать неожиданных ошибок.
Если вы столкнетесь с дальнейшими проблемами, подробный анализ конфигураций и логов поможет вам быстрее выявить корень проблемы. Оптимизация кэширования в Cloudflare является мощным инструментом, который может значительно улучшить как пользовательский опыт, так и общую эффективность вашего приложения.