Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

Cloudflare 작업자가 있는 Redis @ Edge

엣지에서의 컴퓨팅은 최근 몇 년간 가장 흥미로운 기능 중 하나입니다. CDN을 사용하면 파일을 사용자와 더 가깝게 유지할 수 있습니다. 에지 컴퓨팅을 사용하면 사용자와 더 가까운 곳에서 애플리케이션을 실행할 수 있습니다. 이는 개발자가 전 세계적으로 분산된 고성능 애플리케이션을 구축하는 데 도움이 됩니다.

Cloudflare 작업자는 현재 이 분야의 선두 제품입니다. 콜드 스타트가 없는 서버리스 처리 환경을 제공합니다. Cloudflare의 글로벌 네트워크를 활용하여 애플리케이션의 지연 시간을 최소화합니다. Javascript, Rust, C 및 C++로 함수를 작성할 수 있습니다.

서버리스 함수(AWS Lambda 등)와 유사하게 Cloudflare 작업자는 상태 비저장입니다. Cloudflare의 설문 조사에서 볼 수 있듯이 개발자는 Edge 기능에서 데이터베이스를 연결하는 방법을 묻고 있습니다. 불행히도 대부분의 데이터베이스는 서버리스 환경을 위해 설계되지 않았으며 지속적인 연결이 필요합니다. Redis를 통해 REST API를 개발하여 서버리스 에지 기능이 가능한 가장 간단하고 빠른 방법으로 Upstash에 액세스할 수 있도록 했습니다.

Cloudflare 작업자 KV와 비교

Cloudflare에는 Edge 기능의 상태를 저장하는 데 사용할 수 있는 기본 키 값 저장소가 있습니다. Upstash Redis는 여러 측면에서 Cloudflare KV에 비해 탁월합니다.

  • Cloudflare KV는 기본 가져오기/설정/삭제 기능만 제공합니다. Upstash는 훨씬 더 정교한 기능(해시, 목록, SortedSets, 범위, 추가, 증분 등)을 구축할 수 있는 모든 Redis 데이터 구조를 제공합니다.
  • Cloudflare KV는 Cloudflare 에코시스템에서 액세스할 수 있도록 설계되었으며 Redis와 REST API를 모두 지원하므로 어디서나 Upstash Redis에 액세스하고 사용할 수 있습니다. Edge에서 Redis로 데이터를 오프로드한 다음 모든 Redis 클라이언트에서 처리할 수 있습니다.
  • Cloudflare KV는 읽기가 많은 애플리케이션에 최적화되어 있습니다. 쓰기가 다른 위치에 복제되는 데 60초가 걸릴 수 있습니다. 쓰기 대기 시간은 Upstash의 경우 밀리초 단위입니다.

이제 Cloudflare+Redis 조합의 힘을 보여주는 간단한 예를 작성해 보겠습니다.

Edge의 분석

웹 분석은 모든 웹 사이트 소유자에게 매우 일반적인 요구 사항입니다. Google Analytics는 강력하지만 많은 개발자가 트래픽 데이터를 Google과 공유하고 사용자의 브라우저에 쿠키를 삽입하는 것을 좋아하지 않습니다. 웹사이트 트래픽이 CDN을 통해 들어오기 때문에 Edge 레이어에서 트래픽을 쉽게 추적할 수 있습니다. 여기에서는 Cloudflare 작업자의 사용자 트래픽 추적을 보여주는 매우 간단한 예를 구현합니다. Cloudflare 작업자의 트래픽을 가로채고 사용자 요청을 Upstash Redis에 저장합니다. 그런 다음 요청을 분석하고 선택한 날짜에 다음 정보를 제공하는 기본 독립형 애플리케이션을 작성합니다.

  • 페이지 조회수
  • 순 방문자 수
  • 방문객 수가 가장 많은 상위 국가
  • 가장 많이 방문한 페이지

설정

데이터베이스가 없으면 이 가이드에 따라 데이터베이스를 만드십시오. 데이터베이스 페이지에서 REST API 버튼을 클릭하고 REST URL을 복사합니다. Cloudflare 계정이 있으면 작업자 기능을 만들거나 계정 없이 플레이그라운드를 사용할 수도 있습니다.

:::note글로벌 데이터베이스 선택 Upstash 데이터베이스를 만드는 동안. 글로벌 데이터베이스는 데이터를 여러 지역에 복제하여 에지 기능의 지연 시간을 줄입니다.:::

Cloudflare 작업자 코드

Cloudflare 작업자 함수는 request을 수락합니다. 매개변수로. Upstash의 REST API를 사용하여 Redis 목록에 요청을 기록합니다. 현재 날짜를 Redis 목록의 키로 사용합니다. 그래서 우리는 일일 요청을 별도의 목록에 기록합니다.

Upstash REST API에는 엔드포인트와 토큰이 필요합니다. 데이터베이스를 생성한 후 REST API를 클릭하여 콘솔에서 엔드포인트와 토큰을 복사할 수 있습니다. 단추. 엔드포인트와 토큰을 교체하여 Cloudflare 작업자 기능을 아래 코드로 업데이트합니다.

const endpoint = "REPLACE_UPSTASH_REST_ENDPOINT";
const token = "REPLACE_UPSTASH_REST_TOKEN";

async function recordRequest(request) {
  let d = new Date();
  let datestr = d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
  let data = [["url", request.url], ...request.headers];
  let url = endpoint + "/lpush/" + datestr;
  const init = {
    body: JSON.stringify(data),
    method: "POST",
    headers: {
      Authorization: "Bearer " + token,
    },
  };
  return await fetch(url, init);
}

async function handleRequest(request) {
  recordRequest(request);
  return new Response("My Awesome Website");
}

addEventListener("fetch", (event) => {
  event.respondWith(
    handleRequest(event.request).catch(
      (err) => new Response(err.stack, { status: 500 })
    )
  );
});

분석 도구 코드

이제 날짜를 인수로 사용하여 분석 데이터를 반환하는 간단한 명령줄 응용 프로그램을 작성해 보겠습니다. 폴더를 만들고 npm init 실행 . 그런 다음 npm install ioredis를 사용하여 Redis 클라이언트를 설치합니다. . .env.example 복사 .env로 파일을 만들고 Redis URL(ioredis)을 설정합니다. 다음과 같이 index.js를 업데이트하십시오.

const Redis = require("ioredis");
require("dotenv").config();
console.log("EDGE analytics with CloudFlare Workers and Upstash Redis.");
let redis = new Redis(process.env.REDIS_URL);
let dateArg = process.argv[2];
let datestr;
if (dateArg) {
  datestr = dateArg;
} else {
  let d = new Date();
  datestr = d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate();
}

redis.lrange(datestr, "0", "-1", function (err, result) {
  let pageview = 0;
  let users = new Set();
  let countries = new Map();
  let paths = new Map();
  if (err) {
    console.log("Could not connect to Redis.");
    console.error(err);
  } else {
    console.log(
      "Upstash Redis Connection Successful. Analyzing the access logs..."
    );
    if (!result || result.length === 0) {
      console.log("Could not find any access logs for the date:" + datestr);
    } else {
      for (const elem of result) {
        let entries = JSON.parse(elem);
        for (let entry of entries) {
          if (entry[0] === "accept") {
            if (entry[1].startsWith("text")) pageview++;
          }
          if (entry[0] === "cf-ipcountry") {
            let temp = countries.get(entry[1]);
            if (!temp) {
              temp = 0;
            }
            countries.set(entry[1], temp + 1);
          }
          if (entry[0] === "url") {
            let temp = paths.get(entry[1]);
            if (!temp) {
              temp = 0;
            }
            paths.set(entry[1], temp + 1);
          }
          if (entry[0] === "x-real-ip") {
            users.add(entry[1]);
          }
        }
      }
      countries = new Map([...countries.entries()].sort((a, b) => b[1] - a[1]));
      paths = new Map([...paths.entries()].sort((a, b) => b[1] - a[1]));
      console.log("\nDATE: " + datestr);
      console.log("\nPAGE VIEWS: " + pageview);
      console.log("\nUNIQUE VISITORS: " + users.size);
      logMap("TOP COUNTRIES", countries);
      logMap("TOP PAGES", paths);
    }
  }
});

function logMap(title, data) {
  console.log("\n" + title);
  console.log("----------------");
  console.log(mapEntriesToString(data));
}

function mapEntriesToString(entries) {
  return Array.from(entries, ([k, v]) => `${k} : ${v}\n`).join("");
}

이제 node index 2021-6-16으로 애플리케이션을 실행할 수 있습니다. 또는 node index . 후자는 오늘을 쿼리합니다.

Cloudflare 작업자가 있는 Redis @ Edge

이 예를 시작점으로 생각할 수 있습니다. 분석 요구 사항에 따라 차트와 표를 사용하여 풍부한 웹 애플리케이션을 개발할 수 있습니다. 보다 강력한 분석을 위해 다른 Redis 데이터 구조를 사용할 수 있습니다.

Upstash Edge 로드맵

REST API는 Edge 스토리의 첫 번째 단계입니다. 우리는 올해 두 가지 중요한 발전을 계획하고 있습니다.

  • Edge Caching:(업데이트:릴리스됨, 자세히 알아보기) 현재 모든 REST 요청이 데이터베이스 영역으로 옵니다. 곧 Edge Caching을 지원할 예정이므로 REST 요청은 전 세계의 모든 Edge 위치에서 캐시됩니다. 이를 통해 Upstash Redis는 Cloudflare KV와 같이 전 세계적으로 짧은 지연 시간을 제공할 수 있습니다.
  • 전역 복제 데이터베이스:(업데이트:릴리스됨, 자세히 알아보기) 전역(다중 지역) 복제는 데이터를 여러 지역으로 복제합니다. 따라서 모든 요청(Redis 및 REST API 모두)은 가장 가까운 위치로 이동합니다. 이렇게 하면 일관성에 대한 희생을 최소화하면서 전 세계적으로 짧은 대기 시간을 얻을 수 있습니다.

Edge 로드맵 전용 블로그 게시물을 작성할 계획입니다. 트위터를 계속 지켜봐 주시고 팔로우하세요.