কম্পিউটার

সামঞ্জস্য আয়ত্ত করা

সংযোগ আয়ত্ত করা

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

বিভিন্ন ধরনের একত্রিতকরণ

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

মাল্টি-প্রসেস (ইউনিকর্ন)

এটি একযোগে পরিচালনা করার সবচেয়ে সহজ উপায়। একটি মাস্টার প্রক্রিয়া নিজেকে একাধিক কর্মী প্রক্রিয়ার সাথে সংযুক্ত করে। কর্মী প্রক্রিয়া প্রকৃত অনুরোধগুলি পরিচালনা করে, যখন মাস্টার শ্রমিকদের পরিচালনা করেন।

প্রতিটি কর্মী প্রক্রিয়ার মেমরিতে সম্পূর্ণ কোডবেস থাকে। এটি এই পদ্ধতিটিকে বেশ মেমরি-নিবিড় করে তোলে এবং বড় পরিকাঠামোতে স্কেল করা কঠিন করে তোলে।

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

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

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

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

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

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

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

থ্রেড নিরাপত্তা

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

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

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

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

নীচে আপনি রুবিতে লেখা একটি খুব সাধারণ ইভেন্ট লুপ দেখতে পাবেন। লুপটি ইভেন্টটিকে event_queue থেকে নেবে এবং এটি পরিচালনা করুন। যদি কোন ইভেন্ট না থাকে, তাহলে এটি ঘুমোবে এবং সারিতে নতুন ইভেন্ট আছে কিনা তা দেখার জন্য পুনরাবৃত্তি করবে।

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

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

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

ধাপে ধাপে

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

আপনার কোনটি ব্যবহার করা উচিত?

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

সারাংশে

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

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

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


  1. HTML মাল্টিপল অ্যাট্রিবিউট

  2. DBMS এ অচলাবস্থা

  3. রুবিতে ইউনিক্স ডেমনের একটি তাত্ত্বিক ভূমিকা

  4. রুবি নিয়মিত এক্সপ্রেশন আয়ত্ত