কম্পিউটার টিউটোরিয়াল

কনকারেন্সি আয়ত্ত করুন: হাই-পারফরম্যান্স অ্যাপের জন্য কার্যকর স্কেলিং

কনকারেন্সি আয়ত্ত করা

একাধিক মানুষ একই সাথে আপনার অ্যাপ ব্যবহার করবে, এবং আপনি অ্যাপটি যত দ্রুত সম্ভব ডেলিভার করতে চান। তাই কনকারেন্সি হ্যান্ডেল করার কোনো উপায় দরকার। ভয় পাবেন না! অধিকাংশ ওয়েব সার্ভার ডিফল্টভাবে এটি করে। কিন্তু যখন স্কেল করতে হবে, আপনি কনকারেন্সি সবচেয়ে কার্যকরভাবে ব্যবহার করতে চান।

কনকারেন্সির বিভিন্ন ধরন

কনকারেন্সি হ্যান্ডেল করার একাধিক উপায় আছে: মাল্টি-প্রসেস, মাল্টি-থ্রেডিং এবং ইভেন্ট-ড্রিভেন। প্রতিটির উপযোগিতা, প্রস ও কন্স আছে। এই আর্টিকেলে আপনি শিখবেন সেগুলো কীভাবে ভিন্ন এবং কখন কোনটি ব্যবহার করবেন।

মাল্টি-প্রসেস (Unicorn)

কনকারেন্সি হ্যান্ডেল করার এটি সবচেয়ে সহজ উপায়। একটি মাস্টার প্রসেস নিজের কপি করে একাধিক ওয়ার্কার প্রসেস তৈরি করে। ওয়ার্কার প্রসেস実際ের রিকোয়েস্ট হ্যান্ডেল করে, মাস্টার ওয়ার্কারগুলো ম্যানেজ করে।

প্রতিটি ওয়ার্কার প্রসেসের মেমরিতে পুরো কোডবেস থাকে। এতে এই পদ্ধতিটি খুব মেমরি-ইনটেনসিভ, এবং বড় ইনফ্রাস্ট্রাকচারে স্কেল করা কঠিন।

মাল্টি-প্রসেস সারসংক্ষেপ
ইউজ কেসআপনি যেন একটি নন-রুবি উদাহরণ জানেন সেটি হলো Chrome ব্রাউজার। এটি প্রতিটি ট্যাবের জন্য আলাদা প্রসেস দেয় মাল্টি-প্রসেস কনকারেন্সি ব্যবহার করে। এটি একটি ট্যাব ক্র্যাশ করলে পুরো অ্যাপলিকেশন ডাউন না হয় তা নিশ্চিত করে। তাদের কেসে, এটি এক্সপ্লয়েন্ট একটি ট্যাবে আইসোলেট করতে সাহায্য করে।
Prosসর্বाधিক সহজে ইমপ্লিমেন্ট করা যায়।
থ্রেড সেফটির জটিলতা উপেক্ষা করে।
প্রতিটি ওয়ার্কার ক্র্যাশ করলে বাকি সিস্টেম ক্ষতিগ্রস্ত হয় না।
Consপ্রতিটি প্রসেস পুরো কোডবেস মেমরিতে লোড করে। এতে মেমরি-ইনটেনসিভ হয়।
তাই বড় পরিমাণ কনকারেন্ট কানেকশনে স্কেল করা যায় না।

মাল্টি-থ্রেডিং (Puma)

এই থ্রেডিং মডেল একটি প্রসেসকে একই সাথে একাধিক রিকোয়েস্ট হ্যান্ডেল করতে দেয়। এটি একটি প্রসেসের ভিতরে একাধিক থ্রেড চালায় এটিকে করে।

মাল্টি-প্রসেস পদ্ধতির বিপরীতে, সকল থ্রেড একই প্রসেসের ভিতরে চলে। এর মানে তারা গ্লোबल ভেরিয়েবল সহ ডেটা শেয়ার করে। তাই প্রতি থ্রেড খুব ছোট চাঙ্ক এক্সট্রা মেমরি ব্যবহার করে।

গ্লোবাল ইন্টারপ্রেটার লক (GIL)

এটি আমাকে MRI-র গ্লোবাল ইন্টারপ্রেটার লক (GIL)-এ নিয়ে আসে। GIL হলো সকল রুবি কোড এক্সিকিউশনের চারদিকের একটি লক। যদিও আমাদের থ্রেডগুলো প্যারায়ালে চলতে প্রतीত হয়, কিন্তু একবারে শুধু একটি থ্রেড এক্টিভ থাকে।

I/O GIL-র বাইরে অপারেট করে। যখন আপনি একটি ডাটাবেস কোয়েরি এক্সিকিউট করেন এবং রেজাল্টের জন্য অপেক্ষা করেন, সেটি লক করে না। অন্য একটি থ্রেড সামান্যে কিছু কাজ করার সুযোগ পায়। যদি আপনি থ্রেডে অনেক ম্যাথ এবং হ্যাশ বা অ্যারে অপারেশন করেন, MRI ব্যবহার করলে আপনি শুধু একটি কোর ইউটিলাইজ করতে পারবেন। অধিকাংশ কেসে আপনাকে পুরো মেশিন ইউটিলাইজ করার জন্য একাধিক প্রসেসই লাগবে। অথবা আপনি Rubinius বা JRuby ব্যবহার করতে পারেন, যেগুলোর GIL নেই।

থ্রেড সেফটি

আপনি যদি একাধিক থ্রেড ব্যবহার করেন তবে শেয়ারড ডেটা ম্যানিপুলেট করার সকল কোড থ্রেড-সেফভাবে লিখতে হবে। আপনি এটি করতে পারেন উদাহরণস্বরূপ Mutex ব্যবহার করে শেয়ারড ডেটা স্ট্রাকচার ম্যানিপুলেট করার আগে লক করে। এতে নিশ্চিত হবে যে অন্যান্য থ্রেড পুরনো ডেটা ওপর ভিত্তি করে কাজ করছে না যখন আপনি ডেটা পরিবর্তন করছেন।

মাল্টি-থ্রেডেড সারসংক্ষেপ
ইউজ কেসএটি "মিডেল অফ দ্য রোড" অপশন। অনেক স্ট্যান্ডার্ড ওয়েব অ্যাপ্লিকেশনের জন্য ব্যবহার হয় যেগুলো শর্ট রিকোয়েস্টের বেশি লোড হ্যান্ডেল করে (যেমন একটি ব্যস্ত ওয়েব অ্যাপ্লিকেশন)।
Prosমাল্টি-প্রসেস চেয়ে কম মেমরি ব্যবহার করে।
Consআপনাকে নিশ্চিত করতে হবে আপনার কোড থ্রেড-সেফ।
যদি একটি থ্রেড ক্র্যাশ করে, সেটি পুরো প্রসেস ডাউন করতে পারে।
GIL I/O ব্যতীত সকল অপারেশন লক করে রাখে।

ইভেন্ট-লুপ (Thin)

ইভেন্ট-লুপ তখন ব্যবহার হয় যখন আপনাকে প্রচুর কনকারেন্ট I/O অপারেশন করতে হয়। মডেলটি নিজে একাধিক রিকোয়েস্ট একসাথে এক্সিকিউট করতে বাধ্য করে না, কিন্তু এটি খুব বেশি কনকারেন্ট ইউজার হ্যান্ডেল করার একটি কার্যকর উপায়।

নিচে রুবিতে লেখা একটি খুব সহজ ইভেন্ট লুপ দেখানো হয়েছে। লুপটি event_queue-থেকে ইভেন্ট নেয় এবং হ্যান্ডেল করে। যদি কোনো ইভেন্ট না থাকে, তবে স্লিপ করে এবং আবার চেক করে কিউতে নতুন ইভেন্ট আছে কিনা।

loop do if event_queue.any? handle_event(event_queue.pop) else sleep 0.1 end end

চিত্রিত সংস্করণ

এই চিত্রে, আমরা এক ধাপ বাড়িয়েছি। ইভেন্ট লুপ এখন OS, কিউ এবং কিছু মেমরির সাথে একটি সুন্দর ড্যান্স করছে।

ধাপে ধাপে

  1. OS নেটওয়ার্ক এবং ডিস্ক উপলব্ধতা ট্র্যাক করে।
  2. যখন OS দেখে I/O রেডি, তখন এটি একটি ইভেন্ট কিউতে পাঠায়।
  3. কিউ হলো ইভেন্টের একটি লিস্ট যেখান থেকে ইভেন্ট লুপ টপটি নেয়।
  4. ইভেন্ট লুপ ইভেন্টটি হ্যান্ডেল করে।
  5. এটি কিছু মেমরি ব্যবহার করে কানেকশন সম্পর্কে মেটা ডেটা সংরক্ষণ করতে।
  6. এটি সরাসরি ইভেন্ট কিউতে নতুন ইভেন্ট পাঠাতে পারে। উদাহরণস্বরূপ, একটি ইভেন্টের কন্টেন্টের ভিত্তিতে কিউ শাট ডাউন করার মেসেজ।
  7. যদি এটি একটি I/O অপারেশন করতে চায়, তবে OS-কে বলে যে এটি একটি নির্দিষ্ট I/O অপারেশনে আগ্রহী। OS নেটওয়ার্ক এবং ডিস্ক ট্র্যাক করে (দেখুন [১]) এবং I/O রেডি হলে আবার একটি ইভেন্ট যোগ করে।
ইভেন্ট-লুপ সারসংক্ষেপ
ইউজ কেসযব ইউজারদের সাথে প্রচুর কনকারেন্ট কানেকশন থাকে। Slack বা Chrome নোটিফিকেশন যেন সার্ভিসের কথা ভাবুন।
Prosপ্রতি কানেকশন почти শূন্য মেমরি ওভারহেড।
বহু বড় পরিমাণ প্যারায়াল কানেকশনে স্কেল করে।
Consএটি একটি কঠিন মেন্টাল মডেল বুঝতে।
ব্যাচ সাইজ ছোট এবং প্রেডিক্টেবল হতে হবে কিউ বিল্ড-আপ এড়াতে।

আপনি কোনটি ব্যবহার করবেন?

আশা করি এই আর্টিকেল আপনাকে বিভিন্ন কনকারেন্সি মডেল সম্পর্কে আরও ভালো বোঝা দিয়েছে। এটি ডেভেলপারদের বুঝতে কয়েকটি কঠিন বিষয়ের মধ্যে একটি, কিন্তু এটি বুঝলে আপনার অ্যাপের জন্য সঠিক সেটআপ এক্সপেরিমেন্ট ও ব্যবহার করার টুলস মিয়ে যাবে।

সংক্ষেপে

  • বেশিরভাগ অ্যাপের জন্য থ্রেডিং অর্থপূর্ণ, রুবি/রেইলস ইকোসিস্টেম ধীরে ধীরে এই দিকে যাচ্ছে।
  • যদি আপনি হাইলি কনকারেন্ট অ্যাপ লং-রানিং স্ট্রিমসহ চালান, ইভেন্ট-লুপ আপনাকে স্কেল করতে দেবে।
  • যদি আপনার হাই ট্রাফিক সাইট না থাকে, অথবা আপনি আশা করেন আপনার ওয়ার্কারগুলো ব্রেক করবে, তবে পুরানো মাল্টি-প্রসেসই যান।

এবং, একটি ইভেন্ট লুপ চালানো সম্ভব একটি থ্রেডের ভিতরে, যা একটি মাল্টি-প্রসেস সেটআপের ভিতরে। তাই হ্যাঁ, আপনি আপনার স্ট্রূপওয়াফেল খাওয়াও পারেন এবং রাখতে পারেন!

আপনি যদি এই কনকারেন্সি মডেল সম্পর্কে আরও পড়তে চান তবে আমাদের ডিটেইলড আর্টিকেলগুলো চেক আউট করুন মাল্টি-প্রসেস, মাল্টি-থ্রেডিং এবং ইভেন্ট লুপ সম্পর্কে।


  1. HTML multiple অ্যাট্রিবিউট

  2. DBMS-এ ডেডলক (Deadlocks)

  3. রুবিতে ইউনিক্স ডেমন বোঝা: একটি থিয়োরেটিক্যাল গাইড

  4. রুবি রেগুলার এক্সপ্রেশন মাস্টার করুন: অ্যাডভান্সড প্যাটার্ন ম্যাচিং এবং ভ্যালিডেশন