Ускорьте свой Cloudflare Workers API с помощью KV — кэшируйте вычисленные результаты!

Часть 1: Миграция приложения Node.js на Cloudflare Workers из Heroku
Часть 2: База данных в памяти для Cloudflare Workers с Upstash
Часть 3: Использование данных Cloudflare KV хранить в Cloudflare Workers
Часть 4. Отладка и управление журналами для Cloudflare Workers (в процессе)

Medium Rare — это приложение, которое мы берем здесь в качестве примера. MR — это веб-приложение, которое индексирует и распространяет статьи на китайском языке на платформе Medium.

Предисловие

По сути, эта статья является версией Cloudflare Workers KV части 2 Кэширование с помощью Upstash.

В части 1 мы обсудили миграцию приложения Node.js на Cloudflare Workers. Мы узнали, что CF Workers могут подключаться к базе данных через HTTP. Во второй части мы используем тот же HTTP-подход для подключения к Upstash Redis, чтобы ускорить наши API. В то время как Upstash — отличный выбор, если вы используете Redis, CF Workers KV, возможно, является более родным и гладким вариантом для CF Workers. Давайте рассмотрим, как подключить наше приложение к KV.

Цели

В этой главе мы рассмотрим шаги по добавлению возможности кэширования в API, который запрашивает статьи из MongoDB. До кэширования API статей занимает около 4–8 секунд. А после добавления кеширования в нашем случае урезается до менее 0,1 с!

Без лишних слов, вот шаги:

Шаги

1. (Вариант A) Настройте пространство имен KV с помощью панели инструментов Cloudflare
1. (Вариант B) Настройте пространство имен KV с помощью команды wrangler
2. Привяжите KV к своему приложению Cloudflare Workers
3. Измените API для использования KV

1. (Вариант A) Настройте пространство имен KV с помощью панели управления Cloudflare

После входа в панель инструментов Cloudflare нажмите KV слева. Затем нажмите Создать пространство имен. Затем Cloudflare предложит вам ввести свое Имя пространства имен.

Имя пространства имен может быть любым, что имеет для вас значение, и оно не используется для привязки KV к вашему приложению Cloudflare Workers. Здесь я набираю Medium Rare KV в качестве примера.

Вместо этого, после того как вы нажмете Добавить, вновь созданный идентификатор пространства имен будет использоваться для привязки к вашему приложению Cloudflare Workers.

Важные примечания. Повторите шаг 1 еще раз, чтобы создать предварительную версию пространства имен KV. Это используется для местного развития!

Теперь нажмите значок копирования, чтобы получить ID. Затем перейдите к шагу 2.

1. (Вариант Б) Настройте пространство имен KV с помощью команды wrangler

Вы также можете настроить пространство имен KV через терминал и команду wrangler wrangler kv:namespace create <YOUR_NAMESPACE>. Опять же, Имя пространства имен не используется для привязки KV к вашему приложению Cloudflare Workers. Не стесняйтесь использовать любое запоминающееся имя!

Затем нажмите wrangler kv:namespace create Medium_Rare_KV --preview, чтобы создать пространство имен preview KV. Это используется для местного развития!

2. Привяжите KV к своему приложению Cloudflare Workers

Чтобы использовать KV, вам нужно сначала связать его, добавив следующий раздел в wrangler.toml с ID из шага 1.

[[kv_namespaces]]
binding = "KV"
id = "d27aaaecfdxxxxxxxxxxxxxxxxxxx"
preview_id = "e35c7d34707xxxxxxxxxxxxxxxxxxx"

3. Измените API статей, чтобы использовать KV

Теперь мы готовы изменить код! В части 1 наш API статей запрашивает статьи непосредственно в MongoDB. Давайте изменим его, чтобы сначала проверить, есть ли кеш. Если есть кеш, просто вернуть кеш. Если нет, выполните ту же логику для запроса MongoDB.

// Using hono.js
export const getArticles = async (context) => {
  // 1. Some magical step to formulate the query
  const query = formulateQuery(context.req);

  // 2. Generate a cacheKey string with the query object
  const cacheKey = objToCacheKey(query);
  
  // 3. Try to get from the cache. If there is an existing cache, return it
  const cachedArticles = await context.env.KV.get(
    cacheKey,
    { type: 'json' }
  );
  if (cachedArticles) {
    return context.json({ articles: cachedArticles });
  }
  
  // 4. If not, query the database
  const articles = await db.collection('articles').find(query).toArray();
  
  // 5. Save it to the cache, WITHOUT blocking the API response
  context.executionCtx.waitUntil(
    context.env.KV.put(cacheKey, JSON.stringify(articles), 60 * 30)
  );
  
  // 6. Return the articles
  return context.json({ articles });
}

Мы используем context.executionCtx.waitUntil на шаге 5, чтобы нам не нужно было await сохранять кэш для завершения. Если мы пропустим await без использования waitUntil, есть вероятность, что CF Workers завершит логику сохранения кеша сразу после того, как мы вернем articles JSON.

Обратите внимание, что context.executionCtx.waitUntil — это своего рода честь. Вы можете найти родной документ CF Workers waitUntil здесь, и вот как это работает!

// Using the native CF Workers ES module
export default {
  async fetch(request, env, ctx) {
    // 1. Some magical step to formulate the query
    const query = formulateQuery(request);

    // 2. Generate a cacheKey string with the query object
    const cacheKey = objToCacheKey(query);
  
    // 3. Try to get from the cache. If there is an existing cache, return it
    const cachedArticles = await env.KV.get(
      cacheKey,
      { type: 'json' }
    );
    if (cachedArticles) {
      return new Response(
        JSON.stringify({ articles: cachedArticles }),
        {
          headers: {
            "content-type": "application/json;charset=UTF-8",
          },
        }
      );
    }
  
    // 4. If not, query the database
    const articles = await db.collection('articles').find(query).toArray();
    
    // 5. Save it to the cache, WITHOUT blocking the API response
    ctx.waitUntil(
      env.KV.put(cacheKey, JSON.stringify(articles), 60 * 30)
    );
    
    // 6. Return the articles
    return new Response(
      JSON.stringify({ articles }),
      {
        headers: {
          "content-type": "application/json;charset=UTF-8",
        },
      }
    );
  },
};

Празднуйте!

Вот время отклика до того, как мы добавим слой кеша. Это занимает около 7,8 с.

Вот время отклика после этого, которое занимает менее 0,1 с! (Примечание: я пытаюсь развернуть и вызвать облачную среду выполнения Cloudflare Workers, и результат аналогичен)

Эпилог

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

Есть еще случаи использования, когда вы предпочитаете Redis-подобный кеш, например. Апсташ. Например, операция чтения и записи KV допускает только одиночный ключ и не может выполнять MGET или MSET, как Redis. Вы можете запустить несколько KV.get или KV.put параллельно, но квоты будут сжигаться быстрее.

Обратите внимание, что Cloudflare предоставила функции KV через API, например. API для записи нескольких пар ключ-значение. Это не быстро (занимает ~ 0,5 с), но может быть удобно, когда вам нужно запустить некоторые операции извне, например. CICD.

Хотите подключиться?

Посетите меня в LinkedIn | Гитхаб | Твиттер

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .