Computer >> Máy Tính >  >> Lập trình >> Redis

Redis @ Edge với Cloudflare worker

Máy tính ở Edge là một trong những khả năng thú vị nhất trong những năm gần đây. CDN cho phép bạn giữ các tệp của mình gần gũi hơn với người dùng của bạn. Điện toán cạnh cho phép bạn chạy các ứng dụng của mình gần hơn với người dùng. Điều này giúp các nhà phát triển xây dựng các ứng dụng hiệu suất, được phân phối trên toàn cầu.

Cloudflare worker là sản phẩm hàng đầu trong lĩnh vực này ngay bây giờ. Nó cung cấp cho bạn một môi trường xử lý không máy chủ mà không cần khởi động lạnh. Bạn tận dụng mạng toàn cầu của Cloudflare để giảm thiểu độ trễ của các ứng dụng của mình. Bạn có thể viết các hàm của mình bằng Javascript, Rust, C và C ++.

Tương tự như các chức năng Serverless (AWS Lambda, v.v.), Cloudflare worker là không trạng thái. Như bạn có thể thấy trong cuộc khảo sát của Cloudflare, các nhà phát triển đang hỏi các cách kết nối cơ sở dữ liệu của họ từ các chức năng của Edge. Thật không may, hầu hết các cơ sở dữ liệu không được thiết kế cho môi trường không có máy chủ, chúng yêu cầu kết nối liên tục. Chúng tôi đã phát triển API REST trên Redis để cho phép các chức năng không biên của máy chủ truy cập Upstash theo cách đơn giản và nhanh nhất có thể.

So sánh với Cloudflare worker KV

Cloudflare có một kho lưu trữ Giá trị chính cơ bản mà bạn có thể sử dụng để lưu trữ trạng thái của các chức năng Edge của mình. Upstash Redis vượt trội so với Cloudflare KV ở một số khía cạnh:

  • Cloudflare KV chỉ cung cấp chức năng lấy / đặt / xóa cơ bản. Upstash cung cấp cho bạn tất cả các cấu trúc dữ liệu của Redis, nơi bạn có thể xây dựng các chức năng phức tạp hơn nhiều (Hàm băm, Danh sách, Bộ sắp xếp, phạm vi, phần bổ sung, phần tăng thêm, v.v.).
  • Cloudflare KV được thiết kế để có thể truy cập từ hệ sinh thái Cloudflare trong khi bạn có thể truy cập và sử dụng Upstash Redis từ mọi nơi vì nó hỗ trợ cả API Redis và REST. Bạn có thể tải dữ liệu của mình từ Edge sang Redis, sau đó xử lý bởi bất kỳ ứng dụng khách Redis nào.
  • Cloudflare KV được tối ưu hóa để đọc các ứng dụng nặng. Việc ghi có thể mất 60 giây để được sao chép sang các vị trí khác. Độ trễ ghi tính bằng mili giây đối với Upstash.

Bây giờ, hãy viết một ví dụ đơn giản để giới thiệu sức mạnh của sự kết hợp Cloudflare + Redis.

Phân tích tại Edge

Phân tích trang web là một nhu cầu rất phổ biến đối với tất cả các chủ sở hữu trang web. Google Analytics rất mạnh mẽ nhưng nhiều nhà phát triển không thích chia sẻ dữ liệu lưu lượng truy cập của họ với Google và đưa cookie vào trình duyệt của người dùng. Khi lưu lượng truy cập trang web của bạn đến qua CDN, bạn có thể dễ dàng theo dõi lưu lượng truy cập của mình tại lớp Edge. Ở đây chúng tôi sẽ triển khai một ví dụ rất đơn giản để giới thiệu việc theo dõi lưu lượng người dùng từ Cloudflare worker. Chúng tôi sẽ chặn lưu lượng truy cập trong Cloudflare worker và lưu các yêu cầu của người dùng vào Upstash Redis. Sau đó, chúng tôi sẽ viết một ứng dụng độc lập cơ bản sẽ phân tích các yêu cầu và cung cấp cho tôi thông tin sau vào một ngày đã chọn:

  • Lượt xem trang
  • Số lượng khách truy cập
  • Các quốc gia hàng đầu có số lượng khách truy cập nhiều nhất
  • Các trang được truy cập nhiều nhất

Thiết lập

Nếu bạn chưa có, hãy tạo cơ sở dữ liệu theo hướng dẫn này. Trong trang cơ sở dữ liệu, nhấp vào nút REST API và sao chép URL REST. Nếu bạn có tài khoản Cloudflare, bạn có thể tạo chức năng Công nhân hoặc bạn cũng có thể sử dụng sân chơi mà không cần tài khoản.

:::note Chọn Cơ sở dữ liệu toàn cầu trong khi tạo cơ sở dữ liệu Upstash. Cơ sở dữ liệu toàn cầu sao chép dữ liệu sang nhiều vùng để giảm độ trễ từ các hàm biên. :::

Mã nhân viên Cloudflare

Chức năng Cloudflare worker chấp nhận request như một tham số. Sử dụng API REST của Upstash, tôi ghi lại yêu cầu vào Danh sách Redis. Tôi sử dụng ngày hiện tại làm chìa khóa cho Danh sách Redis. Vì vậy, chúng tôi ghi lại các yêu cầu mỗi ngày trong các Danh sách riêng biệt.

Upstash REST API yêu cầu điểm cuối và mã thông báo. Sau khi tạo cơ sở dữ liệu, bạn có thể sao chép điểm cuối và mã thông báo từ bảng điều khiển bằng cách nhấp vào REST API cái nút. Cập nhật chức năng Cloudflare worker của bạn bằng mã bên dưới, thay thế điểm cuối và mã thông báo:

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 })
    )
  );
});

Mã công cụ Analytics

Bây giờ, hãy viết một ứng dụng dòng lệnh đơn giản sẽ lấy ngày tháng làm đối số và trả về cho chúng tôi dữ liệu phân tích. Tạo một thư mục và chạy npm init . Sau đó cài đặt ứng dụng khách Redis với npm install ioredis . Sao chép .env.example dưới dạng .env và đặt URL Redis của bạn (ioredis). Cập nhật index.js với bên dưới:

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("");
}

Giờ đây, bạn có thể chạy ứng dụng của mình với node index 2021-6-16 hoặc chỉ node index . Câu hỏi thứ hai sẽ truy vấn cho ngày hôm nay.

Redis @ Edge với Cloudflare worker

Bạn có thể coi ví dụ này như một điểm khởi đầu. Bạn có thể phát triển một ứng dụng web phong phú với các biểu đồ và bảng theo nhu cầu phân tích của mình. Bạn có thể sử dụng các cấu trúc dữ liệu Redis khác để phân tích mạnh mẽ hơn.

Lộ trình Upstash Edge

REST API là bước đầu tiên trong câu chuyện Edge của chúng tôi. Chúng tôi đang lên kế hoạch cho hai sự phát triển quan trọng trong năm nay.

  • Edge Caching:(Cập nhật:Bản này đã được phát hành, hãy tìm hiểu thêm) Ngay bây giờ, tất cả các yêu cầu REST của bạn sẽ đến vùng cơ sở dữ liệu của bạn. Chúng tôi sẽ sớm hỗ trợ Edge Caching, vì vậy, các yêu cầu REST của bạn sẽ được lưu vào bộ nhớ đệm ở tất cả các địa điểm cạnh trên toàn cầu. Điều này sẽ cho phép Upstash Redis cung cấp độ trễ thấp trên toàn thế giới như Cloudflare KV.
  • Cơ sở dữ liệu được sao chép toàn cầu:(Bản cập nhật:Bản này đã được phát hành, tìm hiểu thêm) Bản sao toàn cầu (nhiều vùng) sẽ sao chép dữ liệu của bạn sang nhiều vùng. Vì vậy, tất cả các yêu cầu (cả Redis và REST API) sẽ chuyển đến vị trí gần nhất. Điều này sẽ giúp bạn có độ trễ thấp trên toàn cầu mà ít hy sinh nhất về tính nhất quán.

Tôi đang lên kế hoạch viết một bài blog dành riêng cho lộ trình Edge của chúng tôi. Hãy theo dõi và theo dõi chúng tôi trên twitter.