URL shortener ডিজাইন: requirement থেকে scale

ক্লাসিক প্রথম case study। bit.ly-র মতো সেবা ডিজাইন করি: ID তৈরি, দ্রুত redirect, storage ও scaling।

লম্বা লিংক ছোট হয়ে আসছে

লক্ষ্য: লম্বা URL-কে ছোট করা (sho.rt/aZ3k9) এবং যে খোলে তাকে redirect করা।

Requirement

  • লম্বা URL থেকে ছোট লিংক বানানো। ঐচ্ছিক custom alias ও মেয়াদ।
  • দ্রুত ও নির্ভরযোগ্য redirect।
  • খুব read-ভারী: তৈরির চেয়ে redirect অনেক বেশি।
  • লিংক ব্যক্তিগত হলে বড় আকারে অনুমান করা কঠিন হওয়া চাই।

অনুমান

ধরুন মাসে ১০ কোটি নতুন লিংক, আর read-write অনুপাত ১০০:১। তাহলে প্রায় ৪০ write/s এবং ৪,০০০ redirect/s, peak সম্ভবত ৩ গুণ। প্রতি record প্রায় ৫০০ byte হলে মাসে ১০ কোটি লিংকে প্রায় ৫০ GB, কয়েক বছরে কয়েক TB। একটি database ধরে রাখতে পারে, কিন্তু read-এর জন্য caching লাগবে।

API

POST /links {url, alias?, expiresAt?} ছোট লিংক ফেরত দেয়। GET /{code} redirect দেয়।

ছোট কোড তৈরি

base62 (a-z, A-Z, 0-9) থেকে ৭ অক্ষরে 62^7, প্রায় ৩.৫ ট্রিলিয়ন কোড, যথেষ্ট।

  • Counter + base62: global counter একটি অনন্য সংখ্যা দেয়, তাকে base62-এ রূপ দেওয়া হয়। সংঘাত নেই, কিন্তু ক্রমিক কোড অনুমানযোগ্য এবং একটি counter bottleneck। সমাধান: প্রতিটি server-কে একটি সংখ্যার block দিয়ে দেওয়া।
  • URL-এর hash (৭ অক্ষর): একই URL একই কোড দেয়, কিন্তু collision হয় ও retry লাগে।
  • Random কোড + unique যাচাই: সহজ। unique constraint-সহ insert করুন, সংঘাত হলে retry।

Redirect: 301 না 302?

301 (স্থায়ী) browser cache করতে দেয়, load বাঁচে কিন্তু পরের ক্লিক আপনার analytics-এ আসে না। 302 (অস্থায়ী) প্রতিবার আপনার server-এ আসে, তাই ক্লিক গোনা ও গন্তব্য বদলানো যায়। Analytics লাগলে দেখে বাছুন।

Data model

code (primary key), long_url, created_at, expires_at, owner_id। code দিয়ে key-value lookup। Relational database ভালোই চলে, আর key-value store ভালো scale করে।

Read দ্রুত করা

সামনে cache (Redis): code -> long_url। জনপ্রিয় লিংক memory থেকে যায়। বিশ্বব্যাপী গতির জন্য CDN বা edge function।

বাড়তি

  • Analytics: ক্লিক queue-তে log করে পরে aggregate করুন, redirect-এর পথে নয়।
  • অপব্যবহার: URL malware ও phishing তালিকায় মিলিয়ে দেখুন, তৈরিতে rate limit দিন, নিজের domain-এ loop আটকান।
  • মেয়াদ: background job মেয়াদোত্তীর্ণ লিংক মোছে।

মূল কথা: মূল কাজ key-value lookup। ID-র block আগে থেকে দিন, জনপ্রিয় লিংক cache করুন, analytics হট পথের বাইরে রাখুন, আর অপব্যবহার ঠেকান।


System Design সিরিজ, পর্ব ৩ (case study): 1 নম্বর (মোট 16)।

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া