Edge Computing là khả năng thú vị nhất gần đây. CDN giữ files gần user hơn. Edge computing cho phép chạy ứng dụng gần user hơn. Giúp developer xây dựng ứng dụng phân bố toàn cầu, hiệu năng cao.
Cloudflare Workers là sản phẩm dẫn đầu lĩnh vực này. Cung cấp serverless processing environment không cold starts. Tận dụng global network Cloudflare giảm thiểu latency ứng dụng. Viết functions bằng JavaScript, Rust, C, C++.
Tương tự Serverless functions (AWS Lambda, v.v.), Cloudflare Workers stateless. Như survey của Cloudflare, developers tìm cách connect databases từ Edge functions. Rất tiếc, hầu hết databases không thiết kế cho serverless, yêu cầu persistent connections. Chúng tôi phát triển REST API over Redis để cho phép serverless edge functions truy cập Upstash đơn giản, nhanh nhất có thể.
So sánh với Cloudflare Workers KV
Cloudflare có basic Key Value store để lưu state Edge functions. Upstash Redis vượt trội hơn Cloudflare KV ở عدة khía cạnh:
- Cloudflare KV chỉ cung cấp get/set/delete cơ bản. Upstash cho tất cả Redis data structures: Hashes, Lists, SortedSets, ranges, appends, increments, v.v. để build functionality phức tạp hơn.
- Cloudflare KV chỉ accessible từ Cloudflare ecosystem. Upstash Redis truy cập từ bất cứ đâu vì hỗ trợ cả Redis và REST API. Offload data từ Edge xuống Redis rồi process bằng bất kỳ Redis client nào.
- Cloudflare KV tối ưu cho read-heavy apps. Writes mất tới 60s replicate sang locations khác. Write latencies chỉ milliseconds cho Upstash.
Analytics tại Edge
Web analytics nhu cầu phổ biến cho mọi website owner. Google Analytics mạnh nhưng nhiều developer không thích share traffic data với Google và inject cookies. Vì traffic qua CDN, dễ dàng track tại Edge layer. Ví dụ đơn giản: intercept traffic trong Cloudflare Workers, lưu user requests vào Upstash Redis. Sau đó viết standalone app phân tích requests cho thông tin ngày được chọn:
- Page views
- Unique visitors
- Top countries theo số lượng visitors
- Most visited pages
Thiết lập
Chưa có database? Tạo theo guide này. Ở trang database, click nút REST API copy REST URL. Có Cloudflare account? Tạo Workers function hoặc dùng playground không cần account.
:::note Chọn Global Database khi tạo Upstash database. Global database replicate data sang nhiều region giảm latency từ edge functions. :::
Cloudflare Workers Code
Cloudflare Workers function nhận request param. Dùng Upstash REST API, ghi request vào Redis List. Dùng current date làm key cho Redis List. Ghi requests mỗi ngày vào Lists riêng biệt.
Upstash REST API cần endpoint và token. Sau tạo database, copy endpoint và token từ console click nút REST API. Cập nhật Cloudflare Workers function:
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 })
)
);
});
Analytics Tool Code
Viết command line app nhận date argument, trả về analytics data. Tạo folder, chạy npm init. Cài Redis client npm install ioredis. Copy .env.example thành .env set Redis URL (ioredis). Cập nhật 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("");
}
Chạy app với node index 2021-6-16 hoặc node index (query today).

Ví dụ này là điểm khởi đầu. Bạn có thể phát triển rich web app với charts, tables theo nhu cầu analytics. Dùng các Redis data structures khác cho phân tích mạnh hơn.
Upstash Edge Roadmap
REST API là bước đầu trong Edge story. Chúng tôi plan 2 phát triển quan trọng năm nay.
- Edge Caching: (Đã release, tìm hiểu thêm) Hiện tại tất cả REST requests về database region. Sớm hỗ trợ Edge Caching, REST requests cached tại tất cả edge locations toàn cầu. Upstash Redis cung cấp low latency toàn cầu như Cloudflare KV.
- Global Replicated Databases: (Đã release, tìm hiểu thêm) Global (multi-region) replication sẽ replicate data sang nhiều regions. Tất cả requests (Redis và REST API) đi đến location gần nhất. Low latency toàn cầu với ít hy sinh consistency nhất.
Sắp viết blog post dedicated cho Edge roadmap. Theo dõi trên Twitter.