במדריך זה, נבנה שירות קיצור כתובות URL הניתן להתאים לשטח באמצעות Node.js ו־Redis. השירות יעזור בשימוש במטמון מבוזר כדי לעסוק בתעבורה גבוהה ביעילות, להפחית את ההשהייה, ולהתרחב בצורה חלקה. נבחן עקרונות מפתח כמו פיצוץ קבוע, אסטרטגיות פסולת מטמון, ושימוש בשבירה כדי להבטיח שהמערכת תישאר מהירה ואמינה.

עד סיום המדריך הזה, תהיה לך שירות קיצור כתובות URL פועל לגמרי שמשתמש במטמון מבוזר כדי לייעל ביצועים. ניצור גם הדגמה אינטראקטיבית בה משתמשים יכולים להזין כתובות URL ולראות מדדים בזמן אמת כמו פגיעות במטמון ופגיעות חסרות.

מה תלמד

  • כיצד לבנות שירות קיצור כתובת URL באמצעות Node.js ו־Redis.

  • כיצד ליישם מטמון מבוזר כדי לייעל ביצועים.

  • הבנת פיצוץ קבוע ואסטרטגיות פסולת מטמון

    .

  • שימוש ב־Docker כדי לחקות מספר מופעים של Redis לשבירה והתרחבות.

דרישות מוקדמות

לפני התחלת העבודה, וודא שיש לך את התוכנות הבאות מותקנות:

  • Node.js (גרסה 14 או גבוהה יותר)

  • Redis

  • Docker

  • ידע בסיסי ב-JavaScript, Node.js ו-Redis.

תוכן עניינים

סקירת פרויקט

נבנה שירות לקצרת כתובת URL בו:

  1. משתמשים יכולים לקצר כתובות URL ארוכות ולאחזר כתובות המקוריות.

  2. השירות משתמש במטמון Redis כדי לאחסן התאמות בין כתובות URL הקצוצות לכתובות URL המקוריות.

  3. המטמון מופץ בין מספר מופעי Redis כדי להתמודד עם תעבורה גבוהה.

  4. המערכת תציג פגיעות במטמון ו־חיסורים בזמן אמת.

ארכיטקטורת המערכת

כדי להבטיח גמישות וביצועים, נחלק את השירות שלנו לרכיבים הבאים:

  1. שרת API: עוסק בבקשות לקיצור ולשחזור כתובות URL.

  2. שכבת מטמון Redis: משתמשת במספר מופעי Redis למטמון מבוזר.

  3. Docker: מדמה סביבה מבוזרת עם מכולות Redis מרובות.

שלב 1: התקנת הפרוייקט

בואו נכין את הפרויקט על ידי אתחול אפליקציית 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 והפורטים שבהם נשתמש.

שלב 2: התקנת המופעים של 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 הרצים על פורטים שונים. נשתמש במופעים אלו כדי ליישם חיתוך קבוע ושרדינג.

שלב 3: יישום שירות קיצוץ כתובת 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: `http://localhost:${process.env.PORT}/${shortId}` });
});

// נקודת קצה לקבלת הכתובת המקורית
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.

שלב 4: מיושם פסולת מטמון

ביישום בסביבת עבודה אמיתית, ייתכן שכתובות ה-URL יפגו או תשתנה מעט לאורך הזמן. על מנת לטפל בזה, עלינו ליישם פסולת מטמון.

הוספת תפוגה לכתובות URL המטמונות

נשנה את קובץ ה-index.js שלנו כך שנגדיר זמן תפוגה עבור כל רשומת מטמון:

// נקודת קצה לקיצור URL עם תפוגה
app.post('/shorten', async (req, res) => {
  const { url, ttl } = req.body; // ttl (זמן לחיות) אופציונלי
  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: `http://localhost:${process.env.PORT}/${shortId}` });
});
  • TTL (זמן לחיות): אנו מגדירים זמן תפוגה ברירת מחדל של שעה אחת עבור כל כתובת URL מקוצרת. תוכל להתאים אישית את ה-TTL עבור כל כתובת URL לפי הצורך.

  • פסולת מטמון: כאשר ה-TTL פג, הרשומה מוסרת אוטומטית מהמטמון.

שלב 5: מעקב אחר מדדי המטמון.

כדי למנות פגיעות במטמון ו־חסרים, נוסיף קצת לוגינג לנקודות הקצה שלנו ב־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, זוהי חסרי מטמון.

  • הלוגינג הזה יעזור לך למנות את ביצועי מטמון ההפצה שלך.

שלב 6: בדיקת היישום

  1. התחל את המופעים של Redis שלך:
docker start redis1 redis2 redis3
  1. הרץ את שרת ה־Node.js:
node index.js
  1. בדוק את נקודות הקצה באמצעות curl או Postman:

    • קצר כתובת URL:

        POST http://localhost:3000//shorten
        Body: { "url": "https://example.com" }
      
    • גש לכתובת ה-URL המקוצרת:

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

מסקנה: מה שלמדת

מזל טוב! בנית בהצלחה שירות קיצור כתובות אתרים עם מטמון מבוזר באמצעות Node.js ו-Redis. לאורך המדריך הזה, למדת:

  1. ליישם פיזור עץ קבוע כדי להפיץ רשומות מטמון ברחבי Redis מרובים.

  2. לייעוץ את היישום שלך עם אסטרטגיות ביטול מטמון כדי לשמור על עדכניות הנתונים.

  3. להשתמש ב- Docker כדי לחידד סביבת מפוצלת עם מרכזי Redis מרובים.

  4. למעקב אחר פגיעות והחמקות במטמון כדי למקסם את הביצועים.

שלבים הבאים:

  • להוסיף מסד נתונים: לאחסן כתובות URL במסד נתונים לשמירה מעבר למטמון.

  • ליישם ניתוחים: לעקוב אחר מוני לחיצות וניתוחים עבור כתובות URL מקוצרות.

  • להעלות לענן: להעלות את היישום שלך באמצעות Kubernetes עבור התכנסות אוטומטית ועמידות.

שעה טובה בקידוד!