যদি আপনাকে এই প্রশ্নটি জিজ্ঞাসা করতে হয় তবে বেশিরভাগ ওয়েব অ্যাপ্লিকেশন / পরিষেবাগুলি কী করে তা আপনি সম্ভবত অপরিচিত। আপনি সম্ভবত ভাবছেন যে সমস্ত সফ্টওয়্যার এটি করে:
user do an action
│
v
application start processing action
└──> loop ...
└──> busy processing
end loop
└──> send result to user
যাইহোক, ওয়েব অ্যাপ্লিকেশনগুলি বা ব্যাক-এন্ড হিসাবে কোনও ডেটাবেসযুক্ত কোনও অ্যাপ্লিকেশন এটি কীভাবে কাজ করে না। ওয়েব অ্যাপ্লিকেশনগুলি এটি করে:
user do an action
│
v
application start processing action
└──> make database request
└──> do nothing until request completes
request complete
└──> send result to user
এই পরিস্থিতিতে, সফ্টওয়্যারটি তার চলমান বেশিরভাগ সময় 0% সিপিইউ সময় ব্যবহার করে ডাটাবেস ফিরে আসার জন্য অপেক্ষা করে spend
মাল্টিথ্রেডেড অ্যাপ্লিকেশন:
মাল্টিথ্রেডেড নেটওয়ার্ক অ্যাপ্লিকেশনগুলি উপরের কাজের চাপটি এভাবে পরিচালনা করে:
request ──> spawn thread
└──> wait for database request
└──> answer request
request ──> spawn thread
└──> wait for database request
└──> answer request
request ──> spawn thread
└──> wait for database request
└──> answer request
সুতরাং থ্রেড তাদের বেশিরভাগ সময় 0% সিপিইউ ব্যবহার করে ডেটাবেসের ডেটা ফেরার জন্য অপেক্ষা করে। এটি করার সময় তাদের একটি থ্রেডের জন্য প্রয়োজনীয় মেমরি বরাদ্দ করতে হয়েছিল যার মধ্যে প্রতিটি থ্রেডের জন্য সম্পূর্ণ পৃথক প্রোগ্রাম স্ট্যাক অন্তর্ভুক্ত রয়েছে। এছাড়াও, তাদের একটি থ্রেড শুরু করতে হবে যা পুরো প্রক্রিয়া শুরু করার মতো ব্যয়বহুল নয় তবে এখনও ঠিক সঠিক নয় সস্তা।
সিঙ্গলথ্রেডেড ইভেন্ট লুপ
যেহেতু আমরা আমাদের বেশিরভাগ সময় 0% সিপিইউ ব্যবহার করে ব্যয় করি, তাই যখন আমরা সিপিইউ ব্যবহার করি না তখন কেন কিছু কোড চালাবেন না? এইভাবে, প্রতিটি অনুরোধটি এখনও বহু পরিমাণে অ্যাপ্লিকেশনগুলির সমান পরিমাণ সিপিইউ সময় পাবে তবে আমাদের কোনও থ্রেড শুরু করার দরকার নেই। সুতরাং আমরা এটি করি:
request ──> make database request
request ──> make database request
request ──> make database request
database request complete ──> send response
database request complete ──> send response
database request complete ──> send response
অনুশীলনে উভয় পন্থা প্রায় একই লেটেন্সি সহ তথ্য ফেরত দেয় যেহেতু এটি ডাটাবেসের প্রতিক্রিয়া সময় যা প্রক্রিয়াকরণে প্রাধান্য পায়।
এখানে মূল সুবিধাটি হ'ল আমাদের একটি নতুন থ্রেড স্পোন করার দরকার নেই তাই আমাদের প্রচুর পরিমাণে এবং প্রচুর পরিমাণে ম্যালোক করার দরকার নেই যা আমাদের ধীর করে দেবে।
যাদু, অদৃশ্য থ্রেডিং
আপাতদৃষ্টিতে রহস্যজনক বিষয়টি হল উপরোক্ত দুটি পদ্ধতিই কীভাবে "সমান্তরাল" তে কাজের চাপ চালায়? উত্তরটি হ'ল ডাটাবেসটি থ্রেড করা। সুতরাং আমাদের একক থ্রেডযুক্ত অ্যাপ্লিকেশনটি অন্য একটি প্রক্রিয়াটির মাল্টি-থ্রেডযুক্ত আচরণের উপকার করছে: ডাটাবেস।
যেখানে সিঙ্গলথ্রেডেড পন্থা ব্যর্থ হয়
যদি আপনাকে ডেটা ফেরানোর আগে প্রচুর সিপিইউ গণনা করতে হয় তবে একটি সিঙ্গলথ্রেডেড অ্যাপ্লিকেশনটি বড় ব্যর্থ হয়। এখন, আমি ডেটাবেস ফলাফল লুপ প্রক্রিয়াজাতকরণ জন্য একটি মানে না। এটি এখনও বেশিরভাগ ও (এন)। আমার অর্থ হ'ল ফুরিয়ার ট্রান্সফর্ম (উদাহরণস্বরূপ এমপি 3 এনকোডিং) করা, রে ট্রেসিং (3 ডি রেন্ডারিং) ইত্যাদি things
সিঙ্গলথ্রেডেড অ্যাপ্লিকেশনগুলির আরেকটি ক্ষতি হ'ল এটি কেবলমাত্র একটি সিপিইউ কোর ব্যবহার করবে। সুতরাং আপনার যদি কোয়াড-কোর সার্ভার থাকে (আজকাল অস্বাভাবিক নয়) তবে আপনি অন্য 3 টি কোর ব্যবহার করছেন না।
যেখানে মাল্টিথ্রেডেড অ্যাপ্রোচ ব্যর্থ হয়
আপনার যদি প্রতিটি থ্রেডে প্রচুর র্যাম বরাদ্দ করতে হয় তবে একটি মাল্টিথ্রেডেড অ্যাপ্লিকেশনটি বড় ব্যর্থ। প্রথমত, র্যামের ব্যবহার নিজেই মানে আপনি একক পাঠা অ্যাপ্লিকেশন হিসাবে যতগুলি অনুরোধ পরিচালনা করতে পারবেন না। সবচেয়ে খারাপ, malloc ধীর। প্রচুর এবং প্রচুর অবজেক্টগুলি বরাদ্দ করা (যা আধুনিক ওয়েব ফ্রেমওয়ার্কগুলির জন্য সাধারণ) এর অর্থ আমরা সিঙ্গলথ্রেডযুক্ত অ্যাপ্লিকেশনগুলির চেয়ে ধীরে ধীরে শেষ হতে পারি। এখানেই নোড.জেএস সাধারণত জিততে পারে।
এমন একটি ব্যবহারের ক্ষেত্রে যা মাল্টিথ্রিডডকে আরও খারাপ করে শেষ করে যখন আপনার থ্রেডে অন্য স্ক্রিপ্টিং ভাষা চালানো দরকার। প্রথমে আপনাকে সাধারণত সেই ভাষার জন্য পুরো রানটাইম ম্যালোক করতে হয়, তারপরে আপনাকে আপনার স্ক্রিপ্ট দ্বারা ব্যবহৃত ভেরিয়েবলগুলি ম্যালোক করতে হবে।
সুতরাং আপনি যদি সিটিতে যান বা যান বা জাভা নেটওয়ার্ক অ্যাপ্লিকেশন লিখছেন তবে থ্রেডিংয়ের ওভারহেডটি সাধারণত খুব খারাপ হয় না। আপনি যদি পিএইচপি বা রুবির পরিবেশনার জন্য কোনও সি সার্ভার লিখছেন তবে জাভাস্ক্রিপ্ট বা রুবি বা পাইথনে দ্রুত সার্ভারটি লেখা খুব সহজ।
হাইব্রিড পদ্ধতির
কিছু ওয়েব সার্ভার একটি হাইব্রিড পদ্ধতির ব্যবহার করে। উদাহরণস্বরূপ এনগিনেক্স এবং অ্যাপাচি 2 ইভেন্ট লুপের থ্রেড পুল হিসাবে তাদের নেটওয়ার্ক প্রসেসিং কোড প্রয়োগ করে। প্রতিটি থ্রেড একযোগে ইভেন্ট লুপ চালায় অনুরোধগুলি একক থ্রেডযুক্ত প্রক্রিয়া করে তবে অনুরোধগুলি একাধিক থ্রেডের মধ্যে লোড-ভারসাম্যযুক্ত।
কিছু একক থ্রেডযুক্ত আর্কিটেকচারে হাইব্রিড পদ্ধতির ব্যবহারও হয়। একক প্রক্রিয়া থেকে একাধিক থ্রেড চালু করার পরিবর্তে আপনি একাধিক অ্যাপ্লিকেশন চালু করতে পারেন - উদাহরণস্বরূপ, কোয়াড-কোর মেশিনে 4 টি নোড.জে সার্ভার। তারপরে প্রক্রিয়াগুলির মধ্যে কাজের চাপ ছড়িয়ে দিতে আপনি একটি লোড ব্যালেন্সার ব্যবহার করেন।
কার্যত দুটি পন্থাগুলি একে অপরের প্রযুক্তিগতভাবে অভিন্ন মিরর-চিত্র।