স্কেলে LeetCode ডিজাইন করা
LeetCode দেখতে সহজ মনে হয়। ব্যবহারকারীরা সমস্যাগুলো ব্রাউজ করেন, কোড লেখেন এবং ফিডব্যাক পান।
বাস্তবতা ভিন্ন। পর্দার আড়ালে রয়েছে একটি distributed system। এটি প্রতি সেকেন্ডে লক্ষ লক্ষ ব্যবহারকারী এবং হাজার হাজার কোড সাবমিশন সামলাতে সক্ষম হতে হবে। প্রতিযোগিতার সময় ব্যাপক ট্রাফিক স্পাইক (traffic spikes) সহ্য করার ক্ষমতা থাকতে হবে।
এখানে একটি স্কেলেবল কোডিং প্ল্যাটফর্ম ডিজাইন করার পদ্ধতি দেওয়া হলো।
Core Features
- অসুবিধা (difficulty) বা ট্যাগ অনুযায়ী সমস্যা ব্রাউজ এবং সার্চ করা।
- একাধিক ভাষায় কোড লেখা।
- সমাধান সাবমিট করা এবং কয়েক সেকেন্ডের মধ্যে ফলাফল পাওয়া।
- লাইভ লিডারবোর্ডসহ সাপ্তাহিক প্রতিযোগিতায় অংশগ্রহণ করা।
The Scale Requirements
- ১০ মিলিয়ন নিবন্ধিত ব্যবহারকারী।
- ২ মিলিয়ন দৈনিক সক্রিয় ব্যবহারকারী।
- প্রতিযোগিতার সময় ১০০k সমসাময়িক (concurrent) ব্যবহারকারী।
- প্রতি মিনিটে ২০k কোড সাবমিশন।
System Architecture
আপনি কোড এক্সিকিউশন সিনক্রোনাসলি (synchronously) চালাতে পারবেন না। যদি একজন ব্যবহারকারী কোড সাবমিট করেন, তবে API-এর ফলাফলের জন্য অপেক্ষা করা উচিত নয়। এতে টাইমআউট (timeout) হতে পারে।
পরিবর্তে, একটি asynchronous পদ্ধতি ব্যবহার করুন:
১. ব্যবহারকারী API-এর মাধ্যমে কোড সাবমিট করেন। ২. সিস্টেম সাবমিশনটিকে একটি Message Queue-তে (যেমন Kafka বা RabbitMQ) রাখে। ৩. Code Execution Workers কিউ (queue) থেকে টাস্কগুলো গ্রহণ করে। ৪. Workers একটি sandbox-এ কোডটি রান করে। ৫. Result Service স্ট্যাটাস আপডেট করে।
Sandbox হলো সবচেয়ে গুরুত্বপূর্ণ অংশ। আপনার সার্ভারে এলোমেলো কোড চালানো বিপজ্জনক। আপনাকে অবশ্যই আইসোলেটেড এনভায়রনমেন্ট (isolated environments) ব্যবহার করতে হবে।
Docker containers হলো সেরা পছন্দ কারণ এগুলো:
- লাইটওয়েট (Lightweight)।
- দ্রুত চালু হয়।
- সহজে হরিজন্টালি স্কেল (scale horizontally) করা যায়।
- যখন আপনি CPU, মেমরি এবং নেটওয়ার্ক অ্যাক্সেস সীমিত করবেন, তখন এটি নিরাপদ থাকে।
Data Storage Strategy
বিভিন্ন প্রয়োজনের জন্য বিভিন্ন ডেটাবেস ব্যবহার করুন:
- Relational Databases (PostgreSQL/MySQL): ব্যবহারকারী, প্রতিযোগিতা এবং র্যাঙ্কিংয়ের জন্য এগুলো ব্যবহার করুন। এগুলো ডেটার অখণ্ডতা (data integrity) নিশ্চিত করে।
- NoSQL Databases (DynamoDB/MongoDB): সমস্যা, টেস্ট কেস এবং সাবমিশন লগ-এর জন্য এগুলো ব্যবহার করুন। ডেটা বাড়ার সাথে সাথে এগুলো আরও ভালোভাবে স্কেল করতে পারে।
- Caching (Redis): ডেটাবেসের লোড কমাতে সমস্যা এবং প্রতিযোগিতার তথ্যের জন্য এটি ব্যবহার করুন।
Real-Time Leaderboards
প্রতিযোগিতার সময় প্রতি সেকেন্ডে র্যাঙ্কিং পরিবর্তিত হয়। প্রতিবার কেউ কোড সাবমিট করার সময় পুরো লিডারবোর্ড পুনরায় গণনা করবেন না।
পরিবর্তে:
- স্কোরগুলো asynchronously আপডেট করুন।
- র্যাঙ্কিং ম্যানেজ করতে Redis Sorted Sets ব্যবহার করুন।
- WebSockets-এর মাধ্যমে ব্যবহারকারীদের কাছে আপডেট পুশ করুন।
Reliability and Trade-offs
এই ডিজাইনে, availability হলো অগ্রাধিকার। লিডারবোর্ড আপডেটে সামান্য বিলম্ব হলে সমস্যা নেই। কিন্তু প্রতিযোগিতার সময় সিস্টেম ক্র্যাশ করা মোটেও কাম্য নয়। প্ল্যাটফর্মটি সচল রাখতে আমরা eventual consistency বেছে নিই।
আপনি কীভাবে কোড এক্সিকিউশন ইঞ্জিন ডিজাইন করবেন? আপনি কি Docker নাকি microVMs ব্যবহার করবেন?
উৎস: https://dev.to/himanshudevgupta/system-design-designing-leetcode-at-scale-45op
ঐচ্ছিক লার্নিং কমিউনিটি: https://t.me/GyaanSetuAi
