URL Shortener-এর নকশা
URL Shortener
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Redirect-heavy workload-এর architecture বানানো
- Code uniqueness ও redirect semantics বোঝা
- Abuse, analytics ও cache failure সামলানো
সমস্যা দিয়ে শুরু
একটি SMS service দীর্ঘ product link ছোট করতে চায়। Create কম, redirect অনেক বেশি। Requirements: authenticated client link বানাবে, public user code দিয়ে destination-এ যাবে, owner link disable করতে পারবেন। Custom alias, expiry এবং analytics optional হিসেবে scope লিখুন। Availability ও low redirect latency দরকার, কিন্তু disabled phishing link stale cache থেকে চলতে থাকলে security ক্ষতি হয়। তাই read speed এবং revocation freshness-এর trade-off শুরুতেই নির্ধারণ করুন।
সহজ করে বুঝি
Shortener code থেকে long URL lookup করে redirect দেয়। Sequential ID-কে Base62 করলে ছোট code হয় কিন্তু enumeration সহজ। Random code guessing কমায়; unique database constraint এবং collision retry তবু দরকার। Analytics redirect critical path থেকে queue-তে সরানো যায়। Mutable destination হলে temporary redirect caching behavior সাধারণত বেশি controllable; 301 বা 302 বেছে নেওয়ার আগে client/CDN cache semantics বুঝুন। Short link access token নয়।
পরিচিত একটি উপমা
বইয়ের বড় ঠিকানার বদলে library call number ব্যবহার করার মতো। ছোট নম্বর থেকে আসল shelf খুঁজে পাওয়া যায়। তবে নিষিদ্ধ বইয়ের নম্বর বন্ধ করলে পুরোনো desk note থেকেও যেন সেটি ফেরত না দেওয়া হয়।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
flowchart LR C[Create API] --> D[(Unique code database)] U[Redirect request] --> K[Cache] K -->|Miss| D K --> R[302 response] R --> Q[Async click events] O[Owner disable] --> D O --> I[Cache invalidation]
Create API validated URL ও unique code save করে। Redirect cache hit হলে destination দ্রুত ফেরে; miss হলে database authoritative। Owner disable করলে source record এবং cached entry দুটোই update/invalidate হয়। Click event queue slow হলে redirect কতটা অপেক্ষা করবে policy লিখুন। User-controlled destination phishing বা malware হতে পারে; abuse reporting, rate limit ও controlled takedown দরকার।
PHP ও Laravel-এ প্রয়োগ
উদাহরণ assumption: দিনে ১ লাখ create এবং ১ কোটি redirect; average redirect QPS প্রায় ১১৬, peak multiplier আলাদা মাপতে হবে। Record প্রায় ১KB ধরলে metadata growth দিনে প্রায় ১০০MB, index/replica বাদে। API POST /links ও GET /{code}; links table-এ code unique, destination, owner_id, disabled_at, expires_at। Controller redirect-method fragment-এ $code route parameter; real URL validation create path-এ http/https allowlist করে হবে।
use App\Models\ShortLink;
use Illuminate\Support\Facades\Cache;
$link = Cache::remember("short:{$code}", 60, function () use ($code) {
return ShortLink::query()->where('code', $code)->first();
});
abort_if($link === null || $link->disabled_at !== null, 404);
abort_if($link->expires_at !== null && $link->expires_at->isPast(), 410);
return redirect()->away($link->destination, 302);সুবিধা, সীমাবদ্ধতা ও trade-off
Cache read cost কমায়, কিন্তু disable freshness TTL বা invalidation reliability-এর উপর নির্ভর করে। প্রতিটি redirect-এ authoritative revocation check দিলে cost বাড়ে। Random code length namespace capacity ও collision probability বদলায়; generator choice database uniqueness-এর বিকল্প নয়। Analytics asynchronously নিলে count সাময়িক পিছিয়ে থাকে এবং duplicate event dedupe লাগতে পারে।
সাধারণ ভুল
- Base62 encoding-কে encryption বলা।
- 301 দিয়ে mutable destination চিরকাল client-এ cache হতে পারে না ভাবা।
- Analytics failure-এ সব redirect বন্ধ করা।
আরও একটু গভীরে
Hot celebrity link এক cache shard-এ চাপ ফেলতে পারে; edge cache, local hot cache ও request coalescing বিবেচনা করুন। Disabled link-এর invalidation version ও monitoring দরকার। Cache outage-এ database-তে sudden miss storm ঠেকাতে admission control রাখুন। Personal click data কম সংগ্রহ করুন; IP retention policy লিখুন। Lost analytics event redirect-এর business contract ভাঙে কি না স্পষ্ট করুন।
মনে রাখুন
URL shortener-এর core হলো unique mapping এবং fast lookup; revocation, redirect cache semantics ও abuse handling সমান গুরুত্বপূর্ণ।
নিজে চেষ্টা করুন
একই code-এর concurrent creation test করুন এবং unique constraint conflict retry design করুন। Cache unavailable ও owner-disable scenario-তে expected behavior লিখুন। Representative link distribution দিয়ে hot-key load test-এর পরিকল্পনা দিন।
নিজের বোঝা যাচাই করুন
1. Base62 secure কেন নয়?
এটি সংখ্যা প্রকাশের encoding। Sequential ID লুকিয়ে access control তৈরি হয় না; private link হলে আলাদা authorization দরকার।
2. Unique constraint কেন?
Concurrent generator একই code দিলে database চূড়ান্ত uniqueness enforce করে। Application pre-check একা race ঠেকায় না।
3. 302 কেন বেছে নিতে পারি?
Mutable destination-এর temporary redirect behavior কাজে লাগে; caching headers ও client behavior review করতে হবে।
4. Analytics synchronous চাই?
Exact business requirement থাকলে হতে পারে, কিন্তু সাধারণ click stats critical redirect latency থেকে সরানো ভালো। Loss ও duplicate policy লিখুন।
5. Cache invalidate ব্যর্থ হলে?
Stale link চলতে পারে। TTL, versioning বা authoritative revocation check দিয়ে risk অনুযায়ী bound করুন।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।