การประมวลผลที่ Edge เป็นความสามารถที่น่าตื่นเต้นที่สุดในหลายปีที่ผ่านมา CDN ให้คุณเก็บไฟล์ใกล้ผู้ใช้ Edge Computing ให้คุณรันแอปพลิเคชันใกล้ผู้ใช้ ช่วยให้นักพัฒนาสร้างแอปพลิเคชันกระจายทั่วโลกที่มีประสิทธิภาพ
Cloudflare Workers เป็นผลิตภัณฑ์นำร่องในพื้นที่นี้ มันให้สภาพแวดล้อม Serverless Processing โดยไม่มี Cold Starts คุณใช้ Global Network ของ Cloudflare เพื่อลด Latency ของแอปพลิเคชัน คุณเขียนฟังก์ชันได้ด้วย JavaScript, Rust, C และ C++
คล้ายกับ Serverless Functions (AWS Lambda ฯลฯ) Cloudflare Workers เป็น Stateless ตามที่เห็นใน แบบสำรวจของ Cloudflare นักพัฒนาขอวิธีเชื่อมต่อฐานข้อมูลจาก Edge Functions น่าเสียดายที่ฐานข้อมูลส่วนใหญ่ไม่ได้ออกแบบสำหรับสภาพแวดล้อม Serverless ต้องการ Persistent Connections เราพัฒนา REST API บน Redis เพื่อให้ Serverless Edge Functions เข้าถึง Upstash ได้ง่ายและเร็วที่สุด
เปรียบเทียบกับ Cloudflare Workers KV
Cloudflare มี Key Value Store พื้นฐานสำหรับเก็บ State ของ Edge Functions Upstash Redis โดดเด่นกว่า Cloudflare KV ในหลายด้าน:
- Cloudflare KV ให้แค่ Get/Set/Delete พื้นฐาน Upstash ให้โครงสร้างข้อมูล Redis ทั้งหมด สร้างฟังก์ชันซับซ้อนได้ (Hashes, Lists, SortedSets, Ranges, Appends, Increments ฯลฯ)
- Cloudflare KV ออกแบบให้เข้าถึงจาก Ecosystem ของ Cloudflare เท่านั้น ในขณะที่ Upstash Redis เข้าถึงและใช้งานได้จากที่ไหนก็ตาม รองรับทั้ง Redis และ REST API คุณสามารถ Offload ข้อมูลจาก Edge ไป Redis แล้วประมวลผลด้วย Redis Client ใดๆ
- Cloudflare KV ปรับให้เหมาะกับ Read-heavy Applications การเขียนอาจใช้เวลา 60 วินาทีในการจำลองไปยังสถานที่อื่น Write Latencies อยู่ที่มิลลิวินาทีสำหรับ Upstash
มาเขียนตัวอย่างง่ายๆ เพื่อแสดงพลังของ Cloudflare + Redis กัน
Analytics ที่ Edge
Web Analytics เป็นความต้องการทั่วไปของเจ้าของเว็บไซต์ Google Analytics ทรงพลังแต่นักพัฒนาหลายคนไม่ชอบแชร์ Traffic Data กับ Google และ Inject Cookies ให้เบราว์เซอร์ผู้ใช้ เนื่องจาก Traffic ของเว็บไซต์ผ่าน CDN คุณจึงสามารถติดตาม Traffic ที่ Edge Layer ได้ง่าย ที่นี่เราจะ Implement ตัวอย่างง่ายๆ เพื่อแสดงการติดตาม User Traffic จาก Cloudflare Workers เราจะ Intercept Traffic ใน Cloudflare Workers และบันทึก User Requests ไป Upstash Redis จากนั้นเขียนแอปพลิเคชัน Standalone แบบง่ายๆ ที่จะวิเคราะห์ Requests และให้ข้อมูลต่อไปนี้ในวันที่เลือก:
- Page Views
- Unique Visitors
- Top Countries ที่มี Visitors มากที่สุด
- Most Visited Pages
การตั้งค่า
หากยังไม่มี สร้างฐานข้อมูลตาม คู่มือนี้ ในหน้าฐานข้อมูล คลิกปุ่ม REST API และคัดลอก REST URL หากมี Cloudflare Account คุณสามารถสร้าง Workers Function หรือใช้ Playground โดยไม่ต้องมีบัญชี
:::note เลือก Global Database ขณะสร้าง Upstash Database Global Database จำลองข้อมูลไปหลายภูมิภาคเพื่อลด Latency จาก Edge Functions :::
โค้ด Cloudflare Workers
Cloudflare Workers Function รับ request เป็นพารามิเตอร์ ใช้ Upstash REST API บันทึก Request ไปยัง Redis List ใช้วันที่ปัจจุบันเป็น Key สำหรับ Redis List ดังนั้นเราจึงบันทึก Requests ต่อวันใน Lists แยกกัน
Upstash REST API ต้องการ Endpoint และ Token หลังสร้างฐานข้อมูล คุณคัดลอก Endpoint และ Token ได้จาก Console คลิกปุ่ม REST API อัปเดต Cloudflare Workers Function ด้วยโค้ดด้านล่าง แทนที่ Endpoint และ Token:
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
มาเขียน Command Line Application เรียบง่ายที่รับวันที่เป็น Argument และคืนค่า Analytics Data สร้างโฟลเดอร์และรัน npm init ติดตั้ง Redis Client ด้วย npm install ioredis คัดลอก .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 ตัวหลังจะคิวรีข้อมูลวันนี้

คุณสามารถคิดว่าตัวอย่างนี้เป็นจุดเริ่มต้น คุณสามารถพัฒนา Web Application ที่มี Charts และ Tables ตามความต้องการ Analytics ใช้โครงสร้างข้อมูล Redis อื่นๆ เพื่อการวิเคราะห์ที่ทรงพลังกว่า
Upstash Edge Roadmap
REST API เป็นขั้นแรกใน Edge Story ของเรา เราวางแผนพัฒนาสำคัญ 2 อย่างในปีนี้:
- Edge Caching: (อัปเดต: เปิดตัวแล้ว, เรียนรู้เพิ่มเติม) ขณะนี้ REST Requests ทั้งหมดไปที่ภูมิภาคฐานข้อมูล เราจะรองรับ Edge Caching เร็วๆ นี้ REST Requests จะถูกแคชที่ Edge Locations ทั่วโลก ทำให้ Upstash Redis ให้ Low Latency ทั่วโลกเหมือน Cloudflare KV
- Global Replicated Databases: (อัปเดต: เปิดตัวแล้ว, เรียนรู้เพิ่มเติม) Global (Multi-region) Replication จะจำลองข้อมูลไปหลายภูมิภาค Requests ทั้งหมด (Redis และ REST API) จะไปที่สถานที่ใกล้ที่สุด ให้ Low Latency ทั่วโลกด้วยการเสียสละ Consistency น้อยที่สุด
ผมวางแผนเขียนบล็อกโพสต์เฉพาะสำหรับ Edge Roadmap ของเรา ติดตามและฟอลโลว์เราที่ Twitter