Coding contest-এর online judge ডিজাইন

অন্যের কোড চালানো বিপজ্জনক। Queue, sandboxed worker ও কড়া সীমা সহ একটি judge ডিজাইন করি।

sandbox বাক্সের ভেতর দিয়ে যাওয়া কোড ফাইল

লক্ষ্য: user কোড জমা দেয়; সিস্টেম লুকানো test case-এর বিরুদ্ধে চালিয়ে দ্রুত verdict (Accepted, Wrong Answer, Time Limit ইত্যাদি) ফেরত দেয়।

Requirement

  • অনেক ভাষা সমর্থন।
  • অবিশ্বস্ত কোড নিরাপদে চালানো।
  • সময় ও memory সীমা কার্যকর করা।
  • Contest spike সামলানো, যখন হাজারো মানুষ একসাথে জমা দেয়।
  • ফল ও ranked leaderboard দেখানো।

Architecture

  1. API server: submission নেয়, সংরক্ষণ করে, ID ফেরত দেয়।
  2. Queue: অপেক্ষমাণ submission রাখে।
  3. Judge worker: submission নিয়ে sandbox-এ চালায় ও verdict রেকর্ড করে।
  4. Database: problem, test case, submission, ফল।
  5. Storage: test data object storage-এ, worker-এ cache করা।
  6. ফল পৌঁছানো: client poll করে, অথবা WebSocket বা SSE-তে ফল পায়।

Queue কেন

Judging-এ কয়েক সেকেন্ড লাগে এবং সময় বদলায়। Queue spike মসৃণ করে, worker আলাদাভাবে scale করতে দেয় এবং worker মরলে retry সম্ভব করে। আলাদা queue বা অগ্রাধিকার রাখুন, যেমন practice-এর আগে contest submission।

Sandbox (সবচেয়ে গুরুত্বপূর্ণ)

User-এর কোড ফাইল পড়তে, network খুলতে, fork-bomb করতে বা অনন্তকাল চলতে চেষ্টা করতে পারে। আলাদা করে রাখুন:

  • ন্যূনতম filesystem-সহ container বা microVM।
  • CPU সময়, memory ও process সংখ্যা সীমিত করতে cgroups।
  • বিপজ্জনক system call আটকাতে seccomp / syscall filter।
  • Network নেই, এবং ছোট temporary folder ছাড়া read-only filesystem।
  • অনধিকারপ্রাপ্ত user হিসেবে চালান, প্রতিবারের পর পরিবেশ ধ্বংস করুন।
  • CPU সীমার পাশাপাশি wall-clock timeout।

এ কাজে isolate বা gVisor-এর মতো টুল আছে। জমা দেওয়া কোড কখনো সরাসরি host-এ চালাবেন না।

Judging প্রবাহ

  1. (দরকার হলে) নিজস্ব সীমা দিয়ে compile।
  2. প্রতিটি test case-এর জন্য input দিন, output ধরুন, সীমা কার্যকর করুন।
  3. প্রত্যাশিত output-এর সাথে মেলান (হুবহু মিল, বা অনেক বৈধ উত্তরের problem-এ বিশেষ checker)।
  4. প্রথম ব্যর্থতায় থামুন (বা scoring অনুযায়ী সব চালান) এবং verdict ফেরত দিন।

নির্ভুলতা ও ন্যায্যতা

সময় মাপা মেশিনের load অনুযায়ী বদলায়, তাই একই রকম নির্দিষ্ট worker-এ চালান এবং সীমানার কেস আবার চালান। Test data লুকিয়ে রাখুন যাতে user উত্তর hard-code করতে না পারে।

Leaderboard

Redis sorted set সস্তায় ranking রাখে। ফল চূড়ান্ত হলে আপডেট করুন।

Scaling

Queue-র পেছনে worker বাড়ান। ভাষার image আগে বানিয়ে রাখুন, test data স্থানীয়ভাবে cache করুন এবং contest-এ একটি গরম pool রাখুন।

মূল কথা: submission queue-তে রাখুন, প্রতিটি কড়া সীমাসহ আটকানো sandbox-এ চালান, checker দিয়ে মেলান, আর worker আলাদাভাবে scale করুন।


System Design সিরিজ, পর্ব ৩ (case study): 15 নম্বর (মোট 16)। আগের লেখা: Flash sale সিস্টেম ডিজাইন: ভিড়ে টিকে থাকা.

আরও পড়ুন

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

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

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