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

Node.js এবং Redis ডিস্ট্রিবিউটেড ক্যাশিং দিয়ে হাই-পারফরম্যান্স URL শর্টেনার বানান

Node.js এবং Redis ডিস্ট্রিবিউটেড ক্যাশিং দিয়ে হাই-পারফরম্যান্স URL শর্টেনার বানান

এই টিউটোরিয়ালে, আমরা Node.js এবং Redis ব্যবহার করে একটি স্কেলেবল URL শর্টেনিং সার্ভিস বিল্ড করব। এই সার্ভিস ডিস্ট্রিবিউটেড ক্যাশিং ব্যবহার করে হাই ট্রাফিক দক্ষতার সাথে হ্যান্ডেল করবে, লেটেন্সি কমাবে, এবং সিমলেসলি স্কেল করবে। আমরা কনসিস্টেন্ট হ্যাশিং, ক্যাশ ইনভ্যালিডেশন স্ট্র্যাটেজি, এবং শার্ডিংয়ের মতো কী কনসেপ্ট এক্সপ্লোর করব যাতে সিস্টেমটি ফাস্ট এবং নির্ভরযোগ্য থাকে।

এই গাইডের শেষে, আপনার কাছে একটি ফুলি ফাংশনাল URL শর্টেনার সার্ভিস থাকবে যা পারফরম্যান্স অপ্টিমাইজ করার জন্য ডিস্ট্রিবিউটেড ক্যাশিং ব্যবহার করে। আমরা একটি ইন্টারেক্টিভ ডেমোও তৈরি করব যেখানে ইউজাররা URL ইনপুট দিতে পারবেন এবং রিয়েল-টাইম মেট্রিক্স দেখতে পারবেন ক্যাশ হিট এবং মিসের।

আপনি কী শিখবেন

  • Node.js এবং Redis ব্যবহার করে URL শর্টেনার সার্ভিস কীভাবে বিল্ড করতে হয়।

  • পারফরম্যান্স অপ্টিমাইজ করার জন্য ডিস্ট্রিবিউটেড ক্যাশিং কীভাবে ইমপ্লিমেন্ট করতে হয়।

  • কনসিস্টেন্ট হ্যাশিং এবং ক্যাশ ইনভ্যালিডেশন স্ট্র্যাটেজি বোঝা।

  • Docker ব্যবহার করে মাল্টিপল Redis ইন্সট্যান্স সিমুলেট করা শার্ডিং এবং স্কেলিং-এর জন্য।

পূর্বশর্ত

শুরু করার আগে, নিচের موارد ইনস্টলড আছে কিনা নিশ্চিত করুন:

  • Node.js (v14 বা উচ্চতর)

  • Redis

  • Docker

  • JavaScript, Node.js, এবং Redis-এর বেসিক জ্ঞান।

সূচিপত্র

  • প্রজেক্ট ওভারভিউ

  • স্টেপ ১: প্রজেক্ট সেট আপ করা

  • স্টেপ ২: Redis ইন্সট্যান্স সেট আপ করা

  • স্টেপ ৩: URL শর্টেনার সার্ভিস ইমপ্লিমেন্ট করা

  • স্টেপ ৪: ক্যাশ ইনভ্যালিডেশন ইমপ্লিমেন্ট করা

  • স্টেপ ৫: ক্যাশ মেট্রিক্স মনিটর করা

  • স্টেপ ৬: অ্যাপ্লিকেশন টেস্ট করা

  • উপসংহার: আপনি কী শিখলেন

প্রজেক্ট ওভারভিউ

আমরা একটি URL শর্টেনার সার্ভিস বিল্ড করব যেখানে:

  1. ইউজাররা লং URL শর্টেন করতে পারবেন এবং অরিজিনাল URL রিট্রিভ করতে পারবেন।

  2. সার্ভিস Redis ক্যাশিং ব্যবহার করে শর্টেনড URL এবং অরিজিনাল URL-এর মধ্যে ম্যাপিং স্টোর করে।

  3. ক্যাশটি মাল্টিপল Redis ইন্সট্যান্সে ডিস্ট্রিবিউটেড থাকে হাই ট্রাফিক হ্যান্ডেল করার জন্য।

  4. সিস্টেমটি ক্যাশ হিট এবং মিস রিয়েল-টাইমে ডেমো করবে।

সিস্টেম আর্কিটেকচার

স্কেলেবিলিটি এবং পারফরম্যান্স নিশ্চিত করতে, আমরা আমাদের সার্ভিসকে নিচের কম্পোনেন্টগুলোর মধ্যে ভাগ করব:

  1. API সার্ভার: শর্টেনিং এবং রিট্রিভিং রিকোয়েস্ট হ্যান্ডেল করে।

  2. Redis ক্যাশিং লেয়ার: ডিস্ট্রিবিউটেড ক্যাশিং-এর জন্য মাল্টিপল Redis ইন্সট্যান্স ব্যবহার করে।

  3. Docker: মাল্টিপল Redis কন্টেইনার দিয়ে ডিস্ট্রিবিউটেড এনভায়রনমেন্ট সিমুলেট করে।

স্টেপ ১: প্রজেক্ট সেট আপ করা

Node.js অ্যাপ্লিকেশন ইনিশিয়ালাইজ করে প্রজেক্ট সেট আপ করি:

mkdir scalable-url-shortener
cd scalable-url-shortener
npm init -y

এখন, প্রয়োজনীয় ডিপেন্ডেন্সি ইনস্টল করুন:

npm install express redis shortid dotenv
  • express: একটি লাইটওয়েট ওয়েব সার্ভার ফ্রেমওয়ার্ক।

  • redis: ক্যাশিং হ্যান্ডেল করার জন্য।

  • shortid: শর্ট, ইউনিক আইডি জেনারেট করার জন্য।

  • dotenv: এনভায়রনমেন্ট ভেরিয়েবল ম্যানেজ করার জন্য।

প্রজেক্টের রুটে একটি .env ফাইল তৈরি করুন:

PORT=3000
REDIS_HOST_1=localhost
REDIS_PORT_1=6379
REDIS_HOST_2=localhost
REDIS_PORT_2=6380
REDIS_HOST_3=localhost
REDIS_PORT_3=6381

এই ভেরিয়েবলগুলো আমরা যে Redis হোস্ট এবং পোর্টগুলো ব্যবহার করব সেগুলো ডিফাইন করে।

স্টেপ ২: Redis ইন্সট্যান্স সেট আপ করা

আমরা Docker ব্যবহার করব মাল্টিপল Redis ইন্সট্যান্সের সাথে একটি ডিস্ট্রিবিউটেড এনভায়রনমেন্ট সিমুলেট করার জন্য।

নিচের কমান্ডগুলো চালিয়ে তিনটি Redis কন্টেইনার стар্ট করুন:

docker run -p 6379:6379 --name redis1 -d redis
docker run -p 6380:6379 --name redis2 -d redis
docker run -p 6381:6379 --name redis3 -d redis

এটি তিনটি Redis ইন্সট্যান্স বিভিন্ন পোর্টে সেট আপ করবে। আমরা এই ইন্সট্যান্সগুলো ব্যবহার করব কনসিস্টেন্ট হ্যাশিং এবং শার্ডিং ইমপ্লিমেন্ট করার জন্য।

স্টেপ ৩: URL শর্টেনার সার্ভিস ইমপ্লিমেন্ট করা

আমাদের মেইন অ্যাপ্লিকেশন ফাইল, index.js তৈরি করি:

require('dotenv').config();
const express = require('express');
const redis = require('redis');
const shortid = require('shortid');
const app = express();
app.use(express.json());
const redisClients = [
  redis.createClient({ host: process.env.REDIS_HOST_1, port: process.env.REDIS_PORT_1 }),
  redis.createClient({ host: process.env.REDIS_HOST_2, port: process.env.REDIS_PORT_2 }),
  redis.createClient({ host: process.env.REDIS_HOST_3, port: process.env.REDIS_PORT_3 })
];
// কী ডিস্ট্রিবিউট করার জন্য হ্যাশ ফাংশন Redis ক্লায়েন্টগুলোর মধ্যে
function getRedisClient(key) {
  const hash = key.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);
  return redisClients[hash % redisClients.length];
}
// URL শর্টেন করার এন্ডপয়েন্ট
app.post('/shorten', async (req, res) => {
  const { url } = req.body;
  if (!url) return res.status(400).send('URL is required');
  const shortId = shortid.generate();
  const redisClient = getRedisClient(shortId);
  await redisClient.set(shortId, url);
  res.json({ shortUrl: `https://localhost:${process.env.PORT}/${shortId}` });
});
// অরিজিনাল URL রিট্রিভ করার এন্ডপয়েন্ট
app.get('/:shortId', async (req, res) => {
  const { shortId } = req.params;
  const redisClient = getRedisClient(shortId);
  redisClient.get(shortId, (err, url) => {
    if (err || !url) {
      return res.status(404).send('URL not found');
    }
    res.redirect(url);
  });
});
app.listen(process.env.PORT, () => {
  console.log(`Server running on port ${process.env.PORT}`);
});

এই কোডে আপনি দেখতে পাচ্ছেন:

  1. কনসিস্টেন্ট হ্যাশিং:

    • আমরা কী (শর্টেনড URL) মাল্টিপল Redis ক্লায়েন্টের মধ্যে একটি সিম্পল হ্যাশ ফাংশন ব্যবহার করে ডিস্ট্রিবিউট করি।

    • হ্যাশ ফাংশন নিশ্চিত করে যে URLগুলো Redis ইন্সট্যান্সগুলোতে সমানভাবে ডিস্ট্রিবিউট হয়।

  2. URL শর্টেনিং:

    • /shorten এন্ডপয়েন্ট একটি লং URL এক্সেপ্ট করে এবং shortid লাইব্রেরি ব্যবহার করে একটি শর্ট আইডি জেনারেট করে।

    • শর্টেনড URL আমাদের হ্যাশ ফাংশন ব্যবহার করে Redis ইন্সট্যান্সের একটি টিতে স্টোর হয়।

  3. URL রিডাইরেকশন:

    • /:shortId এন্ডপয়েন্ট ক্যাশ থেকে অরিজিনাল URL রিট্রিভ করে এবং ইউজারকে রিডাইরেক্ট করে।

    • যদি URL ক্যাশে না পাওয়া যায়, তবে একটি 404 রেসপন্স রিটার্ন করা হয়।

স্টেপ ৪: ক্যাশ ইনভ্যালিডেশন ইমপ্লিমেন্ট করা

রিয়েল-ওয়ার্ল্ড অ্যাপ্লিকেশনে, URLগুলো এক্সপায়ার হতে পারে বা সময়ের সাথে সাথে পরিবর্তন হতে পারে। এটাকে হ্যান্ডেল করার জন্য, আমাদের ক্যাশ ইনভ্যালিডেশন ইমপ্লিমেন্ট করতে হবে।

ক্যাশড URL-এ এক্সপায়ারি যোগ করা

আমাদের index.js ফাইলটি মডিফাই করি প্রতিটি ক্যাশড এন্ট্রির জন্য এক্সপায়ারেশন টাইম সেট করার জন্য:

// এক্সপায়ারেশন সহ URL শর্টেন করার এন্ডপয়েন্ট
app.post('/shorten', async (req, res) => {
  const { url, ttl } = req.body; // ttl (time-to-live) অপশনাল
  if (!url) return res.status(400).send('URL is required');
  const shortId = shortid.generate();
  const redisClient = getRedisClient(shortId);
  await redisClient.set(shortId, url, 'EX', ttl || 3600); // ডিফল্ট TTL ১ ঘন্টা
  res.json({ shortUrl: `https://localhost:${process.env.PORT}/${shortId}` });
});
  • TTL (Time-To-Live): আমরা প্রতিটি শর্টেনড URL-এর জন্য ডিফল্ট এক্সপায়ারেশন টাইম ১ ঘন্টা সেট করি। আপনি প্রতিটি URL-এর জন্য TTL কাস্টোমাইজ করতে পারেন যদি দরকার হয়।

  • ক্যাশ ইনভ্যালিডেশন: TTL এক্সপায়ার হলে, এন্ট্রিটি অটোমেটিক্যালি ক্যাশ থেকে রিমুভ হয়ে যায়।

স্টেপ ৫: ক্যাশ মেট্রিক্স মনিটর করা

ক্যাশ হিট এবং মিস মনিটর করার জন্য, আমরা আমাদের এন্ডপয়েন্টগুলোর লগিং যোগ করব index.js-এ:

app.get('/:shortId', async (req, res) => {
  const { shortId } = req.params;
  const redisClient = getRedisClient(shortId);
  redisClient.get(shortId, (err, url) => {
    if (err || !url) {
      console.log(`Cache miss for key: ${shortId}`);
      return res.status(404).send('URL not found');
    }
    console.log(`Cache hit for key: ${shortId}`);
    res.redirect(url);
  });
});

এই কোডে কী হচ্ছে:

  • ক্যাশ হিট: যদি URL ক্যাশে পাওয়া যায়, তবে এটি একটি ক্যাশ হিট।

  • ক্যাশ মিস: যদি URL না পাওয়া যায়, তবে এটি একটি ক্যাশ মিস।

  • এই লগিং আপনাকে আপনার ডিস্ট্রিবিউটেড ক্যাশের পারফরম্যান্স মনিটর করতে সাহায্য করবে।

স্টেপ ৬: অ্যাপ্লিকেশন টেস্ট করা

  1. আপনার Redis ইন্সট্যান্সগুলো শুরু করুন:
docker start redis1 redis2 redis3
  1. Node.js সার্ভার চালান:
node index.js
  1. এন্ডপয়েন্টগুলো টেস্ট করুন curl বা Postman ব্যবহার করে:

    • একটি URL শর্টেন করুন:

      POST https://localhost:3000/shorten
      Body: { "url": "https://example.com" }
    • শর্টেনড URL এক্সেস করুন:

      GET https://localhost:3000/{shortId}

উপসংহার: আপনি কী শিখলেন

অভিনন্দন! আপনি সফলভাবে একটি স্কেলেবল URL শর্টেনার সার্ভিস বিল্ড করেছেন ডিস্ট্রিবিউটেড ক্যাশিং সহ Node.js এবং Redis ব্যবহার করে। এই টিউটোরিয়ালে, আপনি শিখেছেন কীভাবে:

  1. কনসিস্টেন্ট হ্যাশিং ইমপ্লিমেন্ট করতে হয় ক্যাশ এন্ট্রি মাল্টিপল Redis ইন্সট্যান্সে ডিস্ট্রিবিউট করার জন্য।

  2. ক্যাশ ইনভ্যালিডেশন স্ট্র্যাটেজি দিয়ে আপনার অ্যাপ্লিকেশন অপ্টিমাইজ করতে হয় ডেটা আপ-টু-ডেট রাখতে।

  3. Docker ব্যবহার করতে হয় মাল্টিপল Redis নোড সহ একটি ডিস্ট্রিবিউটেড এনভায়রনমেন্ট সিমুলেট করার জন্য।

  4. ক্যাশ হিট এবং মিস মনিটর করতে হয় পারফরম্যান্স অপ্টিমাইজ করার জন্য।

নেক্সট স্টেপস:

  • ডাটাবেস যোগ করুন: URLগুলো ডাটাবেসে স্টোর করুন পার্সিস্টেন্সের জন্য ক্যাশের বাইরে।

  • অ্যানালিটিক্স ইমপ্লিমেন্ট করুন: শর্টেনড URL-এর ক্লিক কাউন্ট এবং অ্যানালিটিক্স ট্র্যাক করুন।

  • ক্লাউডে ডিপ্লয় করুন: Kubernetes ব্যবহার করে আপনার অ্যাপ্লিকেশন ডিপ্লয় করুন অটো-স্কেলিং এবং রেজিলিয়েন্সের জন্য।

হ্যাপি কোডিং!

নিঃশুল্ক কোডিং শিখুন। freeCodeCamp-এর ওপেন সোর্স কারিকুলাম ৪০,০০০-এর বেশি মানুষকে ডেভেলপার হিসেবে জব পেতে সাহায্য করেছে। শুরু করুন

  1. দেওয়া স্ট্রিংটি পাইথন কিওয়ার্ড কিনা চেক করার প্রোগ্রাম

  2. HTML DOM Input Color form প্রোপার্টি

  3. জাভাস্ক্রিপ্ট অবজেক্টকে নতুন অ্যারেতে ফরম্যাট করা

  4. CSS-এ width এবং height প্রপার্টি