কীভাবে, সাধারণভাবে, নোড.জেএস 10,000 টি সমবর্তী অনুরোধগুলি পরিচালনা করে?


393

আমি বুঝতে পেরেছি যে নোড.জেএস একটি সময়ে কেবল একটিতে প্রক্রিয়াকরণের অনুরোধগুলি (যা অবরুদ্ধকরণ নয়) প্রক্রিয়াকরণের জন্য একটি একক থ্রেড এবং ইভেন্ট লুপ ব্যবহার করে। কিন্তু তবুও, কীভাবে এটি কাজ করে, 10,000 সমবর্তী অনুরোধগুলি বলি। ইভেন্ট লুপ সমস্ত অনুরোধ প্রক্রিয়া করবে? যে খুব বেশি সময় লাগবে না?

মাল্টি থ্রেডেড ওয়েব সার্ভারের চেয়ে এটি কীভাবে দ্রুত হতে পারে তা আমি এখনও বুঝতে পারি না (এখনও)। আমি বুঝেছি যে মাল্টি-থ্রেডেড ওয়েব সার্ভার রিসোর্সে (মেমোরি, সিপিইউ) আরও ব্যয়বহুল হবে, তবে কি এটি আরও দ্রুত হবে না? আমি সম্ভবত ভুল! দয়া করে ব্যাখ্যা করুন যে এই একক থ্রেডটি প্রচুর অনুরোধগুলিতে কীভাবে দ্রুত হয় এবং 10,000 এর মতো প্রচুর অনুরোধ পরিবেশন করার সময় এটি সাধারণত (উচ্চ স্তরে) কী করে।

এবং এছাড়াও, যে একক থ্রেড স্কেল ভাল পরিমাণে ভাল হবে? দয়া করে মনে রাখবেন যে আমি কেবল নোড.জেএস শিখতে শুরু করছি


4
কারণ বেশিরভাগ কাজ (চারপাশে চলমান ডেটা) সিপিইউতে জড়িত না।
অরেঞ্জডোগ

4
আরও মনে রাখবেন যে জাভাস্ক্রিপ্ট চালানো মাত্র একটি থ্রেড এর অর্থ এই নয় যে কাজ করার মতো প্রচুর অন্যান্য থ্রেড নেই।
অরেঞ্জডোগ

এই প্রশ্নটি হয় খুব বিস্তৃত, বা অন্যান্য বিভিন্ন প্রশ্নের সদৃশ।
অরেঞ্জডোগ


একক থ্রেডিংয়ের পাশাপাশি, নোড.জেএস "নন ব্লকিং আই / ও" হিসাবে পরিচিত এমন কিছু করে। এখানে সমস্ত যাদু সম্পন্ন হয়েছে
আনন্দ এন

উত্তর:


762

যদি আপনাকে এই প্রশ্নটি জিজ্ঞাসা করতে হয় তবে বেশিরভাগ ওয়েব অ্যাপ্লিকেশন / পরিষেবাগুলি কী করে তা আপনি সম্ভবত অপরিচিত। আপনি সম্ভবত ভাবছেন যে সমস্ত সফ্টওয়্যার এটি করে:

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 টি নোড.জে সার্ভার। তারপরে প্রক্রিয়াগুলির মধ্যে কাজের চাপ ছড়িয়ে দিতে আপনি একটি লোড ব্যালেন্সার ব্যবহার করেন।

কার্যত দুটি পন্থাগুলি একে অপরের প্রযুক্তিগতভাবে অভিন্ন মিরর-চিত্র।


104
এটি এখন পর্যন্ত নোডের জন্য সবচেয়ে ভাল ব্যাখ্যা। এই "একক থ্রেডেড অ্যাপটি আসলে অন্য প্রক্রিয়াটির একাধিক-থ্রেড আচরণের
উপকার

যদি ক্লায়েন্ট নোডে একাধিক অনুরোধ করে, যেমন কোনও নাম পাওয়া এবং এটি সংশোধন করা, এবং এই ক্রিয়াকলাপগুলি প্রচুর ক্লায়েন্টের দ্বারা খুব দ্রুত পরিচালনা করার জন্য সার্ভারের দিকে চাপ দেয় তা সম্পর্কে কী বলা যায়। আমি কীভাবে এমন দৃশ্য পরিচালনা করতে পারি?
রেমারিও

3
@ ক্যাসপেইন ক্যালডিয়ন এটি খুব দ্রুত এবং প্রচুর ক্লায়েন্ট দ্বারা আপনি কী বোঝাতে চান তার উপর নির্ভর করে। যেমনটি হ'ল নোড.জেএস প্রতি সেকেন্ডে 1000 টিরও বেশি অনুরোধের প্রক্রিয়াকরণ করতে পারে এবং গতি কেবল আপনার নেটওয়ার্ক কার্ডের গতিতে সীমাবদ্ধ। নোট করুন যে এটি প্রতি সেকেন্ডে 1000 অনুরোধগুলি ক্লায়েন্ট একসাথে সংযুক্ত নয়। এটি ইস্যু ছাড়াই 10000 যুগপত ক্লায়েন্ট পরিচালনা করতে পারে। আসল বাধা হ'ল নেটওয়ার্ক কার্ড।
slebetman

1
@ স্লেবেটম্যান, সর্বকালের সেরা ব্যাখ্যা। তবে একটি জিনিস, যদি আমার কাছে এমন কোনও মেশিন লার্নিং অ্যালগরিদম থাকে যা কিছু তথ্য প্রসেস করে এবং সে অনুযায়ী ফলাফল সরবরাহ করে, আমি কি একাধিক
থ্রেডযুক্ত

5
@ গণেশেয়ারওয়াদ অ্যালগরিদমগুলি সিপিইউ, পরিষেবাগুলি (ডাটাবেস, আরএসটিআইপি ইত্যাদি) ব্যবহার করে I / O। এআই যদি জেএস-এ লেখা একটি অ্যালগরিদম হয় তবে আপনার এটি অন্য থ্রেড বা প্রক্রিয়াতে চালানো উচিত। এআই যদি অন্য কোনও কম্পিউটারে চলমান পরিষেবা (যেমন অ্যামাজন বা গুগল বা আইবিএম এআই পরিষেবা) থাকে তবে একক থ্রেডযুক্ত আর্কিটেকচার ব্যবহার করুন।
slebetman

46

আপনি যা ভাবছেন বলে মনে হচ্ছে এটি হ'ল বেশিরভাগ প্রক্রিয়াজাতকরণ নোড ইভেন্ট লুপে পরিচালিত হয়। নোড আসলে I / O এর কাজগুলিকে থ্রেডে ফেলে দেয়। আই / ও ক্রিয়াকলাপগুলি সাধারণত সিপিইউ অপারেশনগুলির চেয়ে দীর্ঘতার অর্ডার নেয় তাই সিপিইউ কেন তার জন্য অপেক্ষা করে? এছাড়াও, ওএস ইতিমধ্যে I / O কার্যগুলি খুব ভালভাবে পরিচালনা করতে পারে। প্রকৃতপক্ষে, নোড এটির আশেপাশে অপেক্ষা না করে সিপিইউ ব্যবহারের জন্য অনেক বেশি।

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


5
রেস্তোঁরা সাদৃশ্য জন্য ধন্যবাদ! আমি উপমাগুলি এবং বাস্তব-জগতের উদাহরণগুলি থেকে এত সহজে শিখতে পারি।
লাভাচে

13

আমি বুঝতে পেরেছি যে নোড.জেএস একটি সময়ে কেবল একটিতে প্রক্রিয়াকরণের অনুরোধগুলি (যা অবরুদ্ধকরণ নয়) প্রক্রিয়াকরণের জন্য একটি একক থ্রেড এবং ইভেন্ট লুপ ব্যবহার করে।

আপনি এখানে যা বলেছিলেন তা আমি ভুল বুঝে উঠতে পারি, তবে "একবারে এক" মনে হচ্ছে আপনি ইভেন্ট ভিত্তিক আর্কিটেকচারটি পুরোপুরি বুঝতে পারছেন না।

একটি "প্রচলিত" (অ ইভেন্ট-চালিত) অ্যাপ্লিকেশন আর্কিটেকচারে, প্রক্রিয়াটি কিছু হওয়ার জন্য অপেক্ষা করে বসে অনেক সময় ব্যয় করে। নোড.জেসের মতো ইভেন্ট-ভিত্তিক আর্কিটেকচারে প্রক্রিয়াটি কেবল অপেক্ষা করে না, এটি অন্য কাজ করে যেতে পারে।

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

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

যখন কোনও আই / ও অবজেক্টের অবস্থা (যেমন নেটওয়ার্ক সংযোগ) এর পরিবর্তিত হয় যে এটির প্রক্রিয়াজাতকরণ প্রয়োজন (উদাহরণস্বরূপ সকেটে ডেটা পাওয়া যায়, একটি সকেট লিখনযোগ্য হয়ে যায় ইত্যাদি) মূল নোড.জেএস জেএস থ্রেড একটি তালিকার সাথে জাগ্রত হয় প্রক্রিয়া করা প্রয়োজন আইটেম।

এটি প্রাসঙ্গিক ডেটা কাঠামোটি সন্ধান করে এবং সেই কাঠামোর উপর কিছু ইভেন্ট নির্গত করে যা কলব্যাকগুলি চালিত করে, যা আগত তথ্যগুলি প্রক্রিয়াকরণ করে, বা কোনও সকেটে আরও ডেটা লেখেন ইত্যাদি Once একবার প্রসেসিংয়ের প্রয়োজনীয় সমস্ত আই / ও বস্তু হয়ে গেলে প্রক্রিয়া করা হয়েছে, প্রধান নোড.জেএস জেএস থ্রেড আরও অপেক্ষা করবে যতক্ষণ না বলা হয় যে আরও বেশি ডেটা উপলব্ধ (বা অন্য কোনও ক্রিয়াকলাপ শেষ হয়েছে বা শেষ হয়েছে)।

পরের বার এটি জাগ্রত হওয়ার পরে, এটি আলাদা আই / ও অবজেক্টটি প্রক্রিয়া করার প্রয়োজনের কারণে হতে পারে - উদাহরণস্বরূপ একটি ভিন্ন নেটওয়ার্ক সংযোগ। প্রতিবার, প্রাসঙ্গিক কলব্যাকগুলি চালিত হয় এবং তারপরে এটি অন্য কিছু হওয়ার জন্য অপেক্ষা করে ঘুমিয়ে যায়।

গুরুত্বপূর্ণ বিষয়টি হ'ল বিভিন্ন অনুরোধগুলির প্রক্রিয়াটি আন্তঃবিহীন, এটি কোনও অনুরোধ শুরু থেকে শেষ না করে এবং পরবর্তীটিতে চলে যায়।

আমার মনে হ'ল এর মূল সুবিধাটি হ'ল ধীর রিকুয়েস্ট (যেমন আপনি 2 জি ডেটা সংযোগের মাধ্যমে মোবাইল ফোনের ডিভাইসে 1MB রেসপন্স ডেটা প্রেরণের চেষ্টা করছেন, বা আপনি সত্যিই ধীর ডাটাবেস ক্যোয়ারী করছেন) জিতেছে ' টি দ্রুত ব্লক।

প্রচলিত বহু-থ্রেডযুক্ত ওয়েব সার্ভারে আপনার প্রতিটি অনুরোধ পরিচালনা করার জন্য সাধারণত একটি থ্রেড থাকবে এবং এটি শেষ না হওয়া পর্যন্ত কেবলমাত্র সেই অনুরোধটিই প্রক্রিয়া করবে। আপনার যদি খুব ধীরে ধীরে অনুরোধ হয় তবে কী হবে? আপনি এই অনুরোধগুলি প্রক্রিয়াজাতকরণের জন্য আপনার প্রচুর থ্রেড দিয়ে শেষ করেন এবং অন্যান্য অনুরোধগুলি (যা খুব সাধারণ অনুরোধ হতে পারে যা খুব তাড়াতাড়ি পরিচালনা করা যেতে পারে) তাদের পিছনে সারি তৈরি করা হয়।

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

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


12

একক থ্রেডেড ইভেন্ট লুপ মডেল প্রসেসিং পদক্ষেপ:

  • ক্লায়েন্টরা ওয়েব সার্ভারে অনুরোধ পাঠান।

  • নোড জেএস ওয়েব সার্ভার ক্লায়েন্টের অনুরোধগুলিতে পরিষেবা সরবরাহের জন্য অভ্যন্তরীণভাবে একটি সীমিত থ্রেড পুল পরিচালনা করে।

  • নোড জেএস ওয়েব সার্ভার সেই অনুরোধগুলি গ্রহণ করে এগুলিকে একটি কাতারে রাখে। এটি "ইভেন্ট ক্যু" নামে পরিচিত।

  • নোড জেএস ওয়েব সার্ভার অভ্যন্তরীণভাবে একটি উপাদান রয়েছে, "ইভেন্ট লুপ" নামে পরিচিত। কেন এই নামটি পেল তা হ'ল এটি অনুরোধগুলি গ্রহণ করতে এবং প্রক্রিয়া করার জন্য অনির্দিষ্টকালের লুপ ব্যবহার করে।

  • ইভেন্ট লুপটি কেবল একক থ্রেড ব্যবহার করে। এটি নোড জেএস প্ল্যাটফর্ম প্রসেসিং মডেলের প্রধান হৃদয়।

  • ইভেন্ট লুপটি কোনও ক্লায়েন্টের অনুরোধ ইভেন্ট কাতারে রাখা আছে তা পরীক্ষা করে। যদি না হয় তবে অনির্দিষ্টকালের জন্য আগত অনুরোধগুলির জন্য অপেক্ষা করুন।

  • যদি হ্যাঁ হয় তবে ইভেন্ট ইভেন্ট থেকে একটি ক্লায়েন্টের অনুরোধটি বেছে নিন

    1. সেই ক্লায়েন্টের অনুরোধটি প্রক্রিয়া শুরু করে
    2. যদি সেই ক্লায়েন্টের অনুরোধের জন্য কোনও ব্লকিং আইও অপারেশনগুলির প্রয়োজন হয় না, তবে সবকিছু প্রক্রিয়া করুন, প্রতিক্রিয়া প্রস্তুত করুন এবং ক্লায়েন্টকে এটি আবার প্রেরণ করুন।
    3. যদি সেই ক্লায়েন্টের অনুরোধটির জন্য ডেটাবেস, ফাইল সিস্টেম, বাহ্যিক পরিষেবাদির সাথে ইন্টারঅ্যাক্ট করার মতো কিছু ব্লকিং আইও অপারেশনগুলির প্রয়োজন হয় তবে তা ভিন্ন পদ্ধতির অনুসরণ করবে
  • অভ্যন্তরীণ থ্রেড পুল থেকে থ্রেডগুলির উপলভ্যতা পরীক্ষা করে
  • একটি থ্রেড তুলে নিয়ে এই ক্লায়েন্টের অনুরোধটি সেই থ্রেডে বরাদ্দ করুন।
  • এই থ্রেডটি এই অনুরোধটি গ্রহণ, এটি প্রক্রিয়াজাতকরণ, ব্লকিং আইও অপারেশন সম্পাদন, প্রতিক্রিয়া প্রস্তুত এবং ইভেন্ট লুপে ফেরত পাঠানোর জন্য দায়ী

    @ রম্ববাবু পোসা খুব সুন্দরভাবে ব্যাখ্যা করেছেন আরও ব্যাখ্যার জন্য এই লিঙ্কটি ফেলে দিন


এই ব্লগ পোস্টে দেওয়া চিত্রটি ভুল বলে মনে হচ্ছে, তারা এই নিবন্ধে যা উল্লেখ করেছে তা সম্পূর্ণ সঠিক নয়।
রাঞ্জ

11

Slebetman উত্তর যুক্ত: আপনি যখন বলবেন Node.JS 10,000 সমবর্তী অনুরোধগুলি হ্যান্ডেল করতে পারে তারা মূলত নন-ব্লক করার অনুরোধগুলি হয় এই অনুরোধগুলি মূলত ডাটাবেস ক্যোয়ারীর সাথে সম্পর্কিত।

অভ্যন্তরীণভাবে, event loopএর Node.JSহ্যান্ডলিং হচ্ছে thread pool, যেখানে প্রতিটি থ্রেড হ্যান্ডল করে একটি non-blocking requestএবং ইভেন্ট লুপটি একটি থ্রেডের সাথে কাজ অর্পণ করার পরে আরও অনুরোধ শুনতে থাকে thread pool। থ্রেডগুলির একটি যখন কাজ শেষ করে, এটি একটি সিগন্যাল প্রেরণ করে event loopযে এটি ওরফে শেষ হয়েছে callbackEvent loopতারপরে এই কলব্যাকটি প্রক্রিয়া করুন এবং প্রতিক্রিয়াটি আবার প্রেরণ করুন।

আপনি নোডজেএস-এ নতুন হিসাবে, nextTickইভেন্ট লুপটি অভ্যন্তরীণভাবে কীভাবে কাজ করে তা বোঝার জন্য আরও পড়ুন । ব্লগ পড়ুন http://javascriptissexy.com , তারা আমার জন্য সত্যিই সহায়ক যখন আমি জাভাস্ক্রিপ্ট / NodeJS দিয়ে শুরু।


2

স্লেবেটম্যানকে যুক্ত করা হচ্ছে কার্যকর করার সময় কী ঘটে থাকে সে সম্পর্কে আরও স্পষ্টতার জন্য উত্তরে ।

নোডজেজে অভ্যন্তরীণ থ্রেড পুলটিতে ডিফল্টরূপে 4 টি থ্রেড রয়েছে। এবং এটি পুরো অনুরোধটি থ্রেড পুল থেকে একটি নতুন থ্রেডের সাথে সংযুক্ত থাকে না অনুরোধের পুরো সম্পাদনটি ঠিক কোনও সাধারণ অনুরোধের (যেমন কোনও ব্লকিং টাস্ক ছাড়াই) ঘটে থাকে ঠিক তেমনই যখনই কোনও অনুরোধ দীর্ঘকাল চলতে থাকে বা ডিবি এর মতো ভারী ক্রিয়াকলাপ হয় কল, একটি ফাইল অপারেশন বা একটি http অনুরোধ টাস্কটি অভ্যন্তরীণ থ্রেড পুলে সারি করা হয় যা libuv দ্বারা সরবরাহ করা হয়। এবং নোডজেস হিসাবে প্রতিটি 5 তম বা পরবর্তী সাম্প্রতিক অনুরোধটি ডিফল্টরূপে অভ্যন্তরীণ থ্রেড পুলে 4 টি থ্রেড সরবরাহ করে যতক্ষণ না কোনও থ্রেড মুক্ত হয় এবং এই ক্রিয়াকলাপগুলি কলব্যাকের উপরে চলে যাওয়ার পরে কলব্যাক সারিটিতে ঠেলে দেওয়া হয়। এবং ইভেন্ট লুপ দ্বারা বাছাই করা হয় এবং প্রতিক্রিয়া ফিরে পাঠায়।

এখন এখানে আরেকটি তথ্য এসেছে যা এটি একবারে কলব্যাক সারি নয়, অনেকগুলি সারি রয়েছে।

  1. নেক্সটিক কিউ
  2. মাইক্রো টাস্ক কিউ
  3. টাইমারস কিউ
  4. আইও কলব্যাক সারি (অনুরোধ, ফাইল অপস, ডিবি অপ্স)
  5. আইও পোলের সারি
  6. পর্যায়ের সারি বা সেটআইমিডিয়েট পরীক্ষা করুন
  7. হ্যান্ডলারের সারি বন্ধ করুন

যখনই কোনও অনুরোধ আসে কোডব্যাক সারিবদ্ধভাবে এই ক্রমে কোডটি কার্যকর করে।

এটির মতো নয় যখন কোনও ব্লক করার অনুরোধটি এটি একটি নতুন থ্রেডের সাথে সংযুক্ত থাকে। ডিফল্টরূপে কেবল 4 টি থ্রেড রয়েছে। সুতরাং সেখানে আরও একটি কুইউং ঘটছে।

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

কলব্যাকের ধরণের উপর ভিত্তি করে সমস্ত কিছুর উপর ভিত্তি করে ক্রিয়াকলাপ হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.