Ad click aggregation সিস্টেম ডিজাইন
বিজ্ঞাপনদাতা প্রতি ক্লিকে টাকা দেয়, তাই প্রতিটি গণনা নির্ভুল ও দ্রুত হতে হবে। Deduplication ও reconciliation সহ streaming pipeline ডিজাইন করি।

লক্ষ্য: প্রতিটি বিজ্ঞাপনের ক্লিক প্রতি মিনিটে (এবং অন্যান্য মাত্রায়) গোনা, যাতে dashboard ও billing কম দেরিতে নির্ভুল সংখ্যা দেখায়।
Requirement
- খুব বেশি event হার (যেমন peak-এ প্রতি সেকেন্ডে ১,০০,০০০+ ক্লিক)।
- "বিজ্ঞাপন X-এর গত ঘণ্টার ক্লিক" ও "গত ৫ মিনিটের সেরা বিজ্ঞাপন"-এর মতো query।
- নির্ভুলতা গুরুত্বপূর্ণ: টাকা এর ওপর নির্ভর করে।
- Late ও ডুপ্লিকেট event সামলানো; ব্যর্থতা থেকে ফেরা।
Pipeline
- সংগ্রহ: ক্লিক event API বা বিজ্ঞাপন server দিয়ে এসে সোজা log-এ (Kafka) যায়। প্রতিটি event সরাসরি চূড়ান্ত database-এ লিখবেন না।
- Raw storage: প্রতিটি raw event সস্তা storage-এ (object storage) সত্যের উৎস হিসেবে রাখুন।
- Stream processing: একটি job (Flink, Spark Streaming বা অনুরূপ) log পড়ে,
ad_idঅনুযায়ী event-গুলোকে সময়ের window-এ (যেমন ১ মিনিট) ভাগ করে গণনা করে। - Aggregate store: analytics query-র উপযোগী database-এ (columnar বা time-series store) ফল লিখুন।
- Query API: aggregate থেকে dashboard সার্ভ করে।
Window
প্রতি মিনিটের গণনায় tumbling window (নির্দিষ্ট, না-মিলানো, যেমন প্রতি মিনিট)। "গত ৫ মিনিট"-এর জন্য sliding window।
Late event
Network দেরিতে event দেরিতে আসতে পারে। পৌঁছানোর সময় নয়, event time (ক্লিক কখন হয়েছে) ব্যবহার করুন, আর window বন্ধের আগে পিছিয়ে থাকাদের জন্য অল্প অপেক্ষা করা watermark। খুব দেরিতে আসা event পরের batch job ঠিক করে।
ডুপ্লিকেট ও exactly-once
Retry ডুপ্লিকেট event বানায়। প্রতিটি ক্লিকে অনন্য ID দিন ও deduplicate করুন (stream job-এ ID-র একটি স্বল্পস্থায়ী set)। Checkpoint করা প্রক্রিয়া ও idempotent write (ad_id + window দিয়ে upsert)-এর সাথে মিলিয়ে ফল exactly-once-এর মতো আচরণ করে।
Reconciliation
Raw event-এর ওপর নিয়মিত batch job চালিয়ে গণনা আবার হিসাব করুন এবং streaming ফলের সাথে মেলান। অমিল থাকলে aggregate ঠিক করুন। এভাবে bug ও late data ধরা পড়ে, আর billing-মানের সিস্টেম বিশ্বাসযোগ্য থাকে।
Hot key
একটি ভাইরাল বিজ্ঞাপন event-এর বিশাল অংশ বানায়। কয়েকটি worker জুড়ে ছোট আংশিক গণনায় আগে-aggregate (স্থানীয় combine) করে তারপর merge করুন।
Fraud
Billing-এর আগে bot ও পুনরাবৃত্ত ক্লিক (যেমন একই user বহুবার ক্লিক) ছাঁটুন। অবৈধ traffic মুছে না দিয়ে audit-এর জন্য চিহ্নিত রাখুন।
Scaling
Log-কে ad_id দিয়ে partition করুন, partition অনুযায়ী stream worker বাড়ান, সাম্প্রতিক aggregate দ্রুত store-এ রাখুন এবং পুরোনো data archive করুন।
মূল কথা: আগে log, event time ধরে window-এ aggregate, click ID দিয়ে dedupe, আর streaming ফল raw data-র সাথে reconcile করুন।
System Design সিরিজ, পর্ব ৩ (case study): 16 নম্বর (মোট 16)। আগের লেখা: Coding contest-এর online judge ডিজাইন.


