Web crawler ডিজাইন
Crawler কোনো সাইটকে চাপ না দিয়ে শত কোটি পেজ আনে। URL frontier, deduplication ও politeness নিয়ম ডিজাইন করি।

লক্ষ্য: seed URL থেকে শুরু করে পেজ নামানো, লিংক বের করা ও অনুসরণ করা, যাতে search index বা বিশ্লেষণের জন্য কনটেন্ট জমে।
Requirement
- শত কোটি পেজে scale; ওয়েবসাইটের প্রতি ভদ্র থাকা।
- একই পেজ দুবার না আনা এবং crawler trap এড়ানো।
robots.txtমানা; ব্যর্থতা ও ধীর সাইট সামলানো।- গুরুত্বপূর্ণ পেজ সতেজ রাখা।
মূল উপাদান
- URL frontier: crawl-এর অপেক্ষায় থাকা URL-এর queue।
- Fetcher: পেজ নামানো worker।
- DNS resolver (cache করা; DNS bottleneck হতে পারে)।
- Parser: টেক্সট ও লিংক বের করে।
- Deduplication: URL-দেখা-হয়েছে আর কনটেন্ট-দেখা-হয়েছে যাচাই।
- Storage: raw পেজ object storage-এ, metadata database-এ।
URL frontier
এটি শুধু queue নয়। এটিকে সামলাতে হয়:
- অগ্রাধিকার: গুরুত্বপূর্ণ সাইট ও ঘন ঘন বদলানো পেজ আগে।
- Politeness: এক সাইটে একসাথে শতশত request নয়। প্রতি host-এর আলাদা queue রাখুন, একই host-এ request-এর মধ্যে বিরতি দিন, আর দেওয়া থাকলে
Crawl-delayমানুন।
প্রচলিত ডিজাইনে hash দিয়ে প্রতিটি host একটি worker-এ ম্যাপ হয়, যাতে ওই worker সেই host-এর গতি নিয়ন্ত্রণ করে।
Deduplication
- URL normalisation: host ছোট হাতের, fragment বাদ, query parameter সাজানো, relative লিংক সমাধান।
- URL-seen set: জানা URL বাদ দিতে Bloom filter বা বড় hash set।
- কনটেন্ট dedup: পেজের কনটেন্টের hash (বা প্রায়-ডুপ্লিকেটের জন্য simhash) করে mirror ও কপি বাদ দিন।
Crawler trap
অসীম ক্যালেন্ডার, URL-এ session ID এবং স্বয়ংক্রিয় লিংক loop crawler-কে আটকে দিতে পারে। প্রতিরোধ: সর্বোচ্চ গভীরতা, প্রতি domain-এ URL সংখ্যার সীমা, URL দৈর্ঘ্যের সীমা এবং pattern শনাক্তকরণ।
robots.txt ও নৈতিকতা
প্রতিটি host-এর robots.txt এনে cache করুন ও মানুন। স্পষ্ট user-agent ও যোগাযোগ URL দিয়ে নিজের crawler চেনান। ছোট সাইটে ভারী load দেবেন না।
Distribution ও ব্যর্থতা
Host-এর hash দিয়ে অনেক মেশিনে কাজ ভাগ করুন। ব্যর্থ fetch backoff দিয়ে retry করুন, timeout দিন, এবং frontier-এর অবস্থা checkpoint করুন যাতে crash-এ অগ্রগতি না হারায়।
Freshness
পেজ কত ঘন ঘন বদলায় সে অনুযায়ী আবার crawl করুন: সংবাদের homepage ঘন ঘন, static পেজ কম। Bandwidth বাঁচাতে HTTP ETag / If-Modified-Since ব্যবহার করুন।
কনটেন্ট-সংক্রান্ত বিষয়
অনেক পেজে JavaScript render লাগে। Headless browser ধীর ও ব্যয়বহুল, তাই শুধু যেখানে দরকার সেখানে ব্যবহার করুন।
মূল কথা: per-host politeness-সচেতন frontier, Bloom-filter URL dedup, কনটেন্ট hashing, trap-এর সীমা, এবং robots.txt-এর প্রতি সম্মান।
System Design সিরিজ, পর্ব ৩ (case study): 12 নম্বর (মোট 16)। আগের লেখা: Double booking ছাড়া ticket booking সিস্টেম ডিজাইন.


