কম্পিউটার টিউটোরিয়াল

Cloudflare Workers-এ Redis ব্যবহার করে এজ কম্পিউটিং-এর শক্তি ব্যবহার করুন

এজ কম্পিউটিং গত বছরের সবচেয়ে আকর্ষণীয় ক্যাপাবিলিটিlerden একটি। CDN আপনার ফাইলগুলো ব্যবহারকারীদের কাছে রাখতে দেয়। Edge computing আপনার অ্যাপ্লিকেশন ব্যবহারকারীদের কাছে চালাতে দেয়। এটি ডেভেলপারদের গ্লোবালি ডিস্ট্রিবিউটেড, হাই-পারফরম্যান্স অ্যাপ্লিকেশন বানাতে সাহায্য করে।

Cloudflare Workers এই স্পেসে বর্তমানে লিডিং প্রোডাক্ট। এটি কোল্ড স্টার্ট ছাড়া সার্ভারলেস প্রসেসিং এনভায়রনমেন্ট দেয়। আপনি Cloudflare-এর গ্লোবাল নেটওয়ার্ক ব্যবহার করে আপনার অ্যাপ্লিকেশন লেটেন্সি ন্যূনতম করতে পারেন। আপনি জাভাস্ক্রিপ্ট, রাস্ট, C এবং C++-তে ফাংশন লিখতে পারেন।

সার্ভারলেস ফাংশন (AWS Lambda ইত্যাদি)-এর মতোই Cloudflare Workers স্টেটলেস। Cloudflare-এর সার্ভে-এ দেখুন ডেভেলপাররা এজ ফাংশন থেকে ডেটাবেস কানেক্ট করার উপায় চাইছেন। দুর্ভাগ্য, অধিকাংশ ডেটাবেস সার্ভারলেস এনভায়রনমেন্টের জন্য ডিজাইন করা নয়, তারা পারসিস্টেন্ট কানেকশন চায়। আমরা Redis-এর ওপর REST API ডেভেলপ করেছি যাতে সার্ভারলেস এজ ফাংশনরা সবচেয়ে সহজ এবং দ্রুত উপায়ে Upstash এক্সেস করতে পারে।

Cloudflare Workers KV-এর সাথে তুলনা

Cloudflare-এ একটি বেসিক Key Value store আছে যা আপনি Edge ফাংশনগুলোর স্টেট স্টোর করতে ব্যবহার করতে পারেন। Upstash Redis Cloudflare KV-এর চেয়ে বেশ কিছু দিকেই উন্নত:

  • Cloudflare KV শুধু বেসিক get/set/delete ফাংশনালিটি দেয়। Upstash আপনাকে সকল Redis ডেটা স্ট্রাকচার দেয় (Hashes, Lists, SortedSets, ranges, appends, increments ইত্যাদি) যাতে অনেক বেশি সফিস্টিকেটেড ফাংশনালিটি বানাতে পারেন।
  • Cloudflare KV শুধু Cloudflare ইকোসিস্টেম থেকে এক্সেসযোগ্য। Upstash Redis আপনি যেকোনো জায়গা থেকে এক্সেস ও কনসাম করতে পারেন কারণ এটি Redis এবং REST API দুটোই সাপোর্ট করে। আপনি Edge থেকে ডেটা অফলোড করে Redis-এ রাখতে পারেন, তারপর যেকোনো Redis ক্লায়েন্ট দিয়ে প্রসেস করতে পারেন।
  • Cloudflare KV রিড-হেভি অ্যাপ্লিকেশনের জন্য অপ্টিমাইজড। রাইট ৬০ সেকেন্ড নিতে পারে অন্য লোকেশনে রেপ্লিকেট হওয়ার জন্য। Upstash-এ রাইট লেটেন্সি মিলিসেকেন্ডে।

Analytics at Edge

ওয়েব অ্যানালিটিক্স সব ওয়েবসাইট মালিকের জন্য খুব সাধারণ প্রয়োজন। Google Analytics শক্তিশালী কিন্তু অনেক ডেভেলপার তাদের ট্রাফিক ডেটা Google-এর সাথে শেয়ার করতে চান না এবং ব্যবহারকারীদের ব্রাউজারে কুকি ইনজেক্ট করতে চান না। আপনার ওয়েবসাইট ট্রাফিক CDN-এর মাধ্যমে আসায়, আপনি সহজেই Edge লেয়ারেই ট্রাফিক ট্র্যাক করতে পারেন। এখানে আমরা একটি সিম্পল উদাহরণ বাস্তবায়ন করব Cloudflare Workers থেকে ইউজার ট্রাফিক ট্র্যাক করার জন্য। আমরা Cloudflare Workers-এ ট্রাফিক ইন্টারসেপ্ট করব এবং ইউজার রিকোয়েস্ট Upstash Redis-এ সেভ করব। তারপর একটি বেসিক স্ট্যান্ডঅ্যালোন অ্যাপ্লিকেশন লিখব যা রিকোয়েস্টগুলো বিশ্লেষণ করে একটি নির্বাচিত দিনের নিচের ইনফো দেবে:

  • Page views
  • Unique visitors
  • সর্বাধিক ভিজিটরের টপ কান্ট্রি
  • সর্বাধিক ভিজিটেড পেজ

সেটআপ

যদি ডেটাবেস না থাকে, এই গাইড ফলো করে তৈরি করুন। ডেটাবেস পেজে REST API বাটনে ক্লিক করে REST URL কপি করুন। Cloudflare একাউন্ট থাকলে Workers ফাংশন তৈরি করুন বা প্লেگران্ড ব্যবহার করুন একাউন্ট ছাড়াও।

:::note Upstash ডেটাবেস তৈরি করার সময় Global Database সিলেক্ট করুন। গ্লোবাল ডেটাবেস ডেটা একাধিক রিজনে রেপ্লিকেট করে এজ ফাংশন থেকে লেটেন্সি কমায়। :::

Cloudflare Workers কোড

Cloudflare Workers ফাংশন request প্যারামিটার হিসেবে গ্রহণ করে। Upstash-এর REST API ব্যবহার করে আমি রিকোয়েস্টটি একটি Redis List-এ রেকর্ড করছি। করেন্ট ডেটাকে Redis List-এর কি হিসেবে ব্যবহার করছি। তাই প্রতিদিনের রিকোয়েস্ট আলাদা আলাদা লিস্টে রেকর্ড হচ্ছে।

Upstash REST API-তে এন্ডপয়েন্ট এবং টোকেন লাগে। ডেটাবেস তৈরি করার পর কনসোলে REST API বাটনে ক্লিক করে এন্ডপয়েন্ট এবং টোকেন কপি করুন। নিচের কোড দিয়ে আপনার Cloudflare Workers ফাংশন আপডেট করুন, এন্ডপয়েন্ট এবং টোকেন রিপ্লেস করুন:

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 কোড

এখন একটি সিম্পল কমান্ড লাইন অ্যাপ্লিকেশন লিখি যা তারিখ আর্গুমেন্ট হিসেবে নেবে এবং অ্যানালিটিক্স ডেটা রিটার্ন করবে। একটা ফোল্ডার তৈরি করে 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 Workers-এ Redis ব্যবহার করে এজ কম্পিউটিং-এর শক্তি ব্যবহার করুন

এই উদাহরণটি একটি স্টার্টিং পয়েন্ট হিসেবে চিন্তা করুন। আপনি আপনার অ্যানালিটিক্স প্রয়োজন অনুযায়ী চার্ট এবং টেবিল সহ একটি রিচ ওয়েব অ্যাপ্লিকেশন ডেভেলপ করতে পারেন। আরও পাওয়ারফুল অ্যানালিসিসের জন্য অন্যান্য Redis ডেটা স্ট্রাকচার ব্যবহার করতে পারেন।

Upstash Edge Roadmap

REST API হলো আমাদের Edge গল্পের প্রথম ধাপ। আমরা এই বছর দুটি গুরুত্বপূর্ণ ডেভেলপমেন্ট প্ল্যান করছি।

  • Edge Caching: (আপডেট: এটি রিলিজ হয়েছে, আরও জানুন) এখন সব REST রিকোয়েস্ট আপনার ডেটাবেস রিজনে যায়। আমরা শীঘ্রই Edge Caching সাপোর্ট করব, যাতে আপনার REST রিকোয়েস্ট গ্লোবালি সব এজ লোকেশনেই ক্যাশ হয়। এটি Upstash Redis-কে Cloudflare KV-এর মতো সারাবিশ্বে কম লেটেন্সি দিতে সক্ষম করবে।
  • Global Replicated Databases: (আপডেট: এটি রিলিজ হয়েছে, আরও জানুন) গ্লোবাল (মাল্টি-রিজন) রেপ্লিকেশন আপনার ডেটা একাধিক রিজনে রেপ্লিকেট করবে। তাই সব রিকোয়েস্ট (Redis এবং REST API উভয়) নিকটতম লোকেশনে যাবে। এটি গ্লোবালি কম লেটেন্সি দেবে কনসিস্টেন্সির সর্বনিম্ন স্যাক্রিফাইস সহ।

আমি আমাদের Edge roadmap-এ নিয়ে একটি ডেডিকেটেড ব্লগ পোস্ট লিখতে প্ল্যান করছি। আপডেট পেতে টুইটার-এ ফলো করুন।

  1. SvelteKit এবং সার্ভারলেস রেডিস (Upstash) দিয়ে দ্রুত TODO অ্যাপ তৈরি করুন

  2. Remix এবং সার্ভারলেস রেডিস দিয়ে স্কেলেবল TODO অ্যাপ তৈরি করুন

  3. ক্লাউডফ্লেয়ার ওয়ার্কার্স এবং সার্ভারলেস রেডিস দিয়ে কাস্টম ওয়েইটিং রুম তৈরি করুন - ট্রাফিক সার্জ নিয়ন্ত্রণ

  4. এজ ক্যাশিংয়ে Redis-র মাধ্যমে ৫ মিলিসেকেন্ড গ্লোবাল লেটেন্সি অর্জন