[ এই পোস্টটি 2012-09-02 (উপরের চেয়ে নতুন) হিসাবে আপ-টু-ডেট। ]
নোড.জেএস পুরোপুরি মাল্টি-কোর মেশিনগুলিতে স্কেল করে।
হ্যাঁ, নোড.জেএস এক-থ্রেড-প্রতি-প্রক্রিয়া। এটি একটি খুব ইচ্ছাকৃত ডিজাইনের সিদ্ধান্ত এবং লকিং শব্দার্থবিজ্ঞানের সাথে মোকাবিলা করার প্রয়োজনীয়তা দূর করে। আপনি যদি এটির সাথে একমত না হন তবে আপনি সম্ভবত এখনও বুঝতে পারবেন না যে মাল্টি-থ্রেড কোডটি ডিবাগ করা কত অসম্ভব শক্ত। নোড.জেএস প্রক্রিয়া মডেল এবং এটি কেন এইভাবে কাজ করে (এবং কেন এটি একাধিক থ্রেডকে সমর্থন করবে না) তার গভীর ব্যাখ্যা করার জন্য, আমার অন্যান্য পোস্টটি পড়ুন ।
তাহলে আমি কীভাবে আমার 16 কোর বাক্সটি গ্রহণ করব?
দুটি উপায়:
- ইমেজ এনকোডিংয়ের মতো বড় ভারী গণনার কাজগুলির জন্য, নোড.জেএস শিশু প্রসেসগুলিকে জ্বালিয়ে দিতে বা অতিরিক্ত কর্মী প্রক্রিয়াগুলিতে বার্তা প্রেরণ করতে পারে। এই নকশায়, আপনার কাছে একটি থ্রেড ভারী গণনার কাজগুলি করা এবং অন্যান্য 15 টি সিপিইউ চিউইং করা ইভেন্টগুলি এবং এন প্রসেসগুলি পরিচালনা করে।
- ওয়েব সার্ভিসে স্কেলিং থ্রুপুট জন্য, আপনার একক বাক্সে একাধিক নোড.জেএস সার্ভার চালানো উচিত, কোর প্রতি এক করে এবং তাদের মধ্যে বিভক্ত অনুরোধ ট্র্যাফিক। এটি দুর্দান্ত সিপিইউ-অ্যাফিনিটি সরবরাহ করে এবং মূল গণনা সহ প্রায় লিনিয়ারলি থ্রুটপুট স্কেল করবে।
একটি ওয়েব সার্ভিসে স্কেলিং থ্রুপুট
যেহেতু v6.0.X নোড.জেএস ক্লাস্টার মডিউলটি সরাসরি বাক্সের বাইরে অন্তর্ভুক্ত করেছে , যা একক বন্দরে শুনতে পারে এমন একাধিক নোড কর্মীদের সেটআপ করা সহজ করে তোলে। নোট যে এই পুরোনো learnboost "ক্লাস্টার" মাধ্যমে উপলব্ধ মডিউল হিসাবে একই নয় npm ।
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}
শ্রমিকরা নতুন সংযোগ গ্রহণের জন্য প্রতিযোগিতা করবে এবং সর্বনিম্ন বোঝা প্রক্রিয়াটি জয়ের সম্ভাবনা সবচেয়ে বেশি। এটি বেশ ভাল কাজ করে এবং একটি মাল্টি-কোর বক্সে বেশ ভাল মাধ্যমে থ্রুপুট স্কেল করতে পারে।
আপনার যদি একাধিক কোরগুলির যত্ন নেওয়ার জন্য যথেষ্ট পরিমাণ চাপ থাকে তবে আপনি আরও কয়েকটি জিনিস করতে চাইবেন:
আপনার নোড.জেএস সার্ভিসটি এনগিনেক্স বা অ্যাপাচি -এর মতো ওয়েব-প্রক্সিের পিছনে চালান - এমন কিছু যা সংযোগ থ্রোটলিং করতে পারে (যদি না আপনি ওভারলোডের শর্তটি বাক্সটি পুরোপুরি নামিয়ে আনতে চান), ইউআরএলগুলি পুনরায় লিখুন, স্থির সামগ্রী সরবরাহ করতে পারেন এবং অন্যান্য উপ-পরিষেবাগুলি সরবরাহ করতে পারেন।
পর্যায়ক্রমে আপনার কর্মী প্রক্রিয়াগুলি পুনর্ব্যবহার করুন। দীর্ঘ-চলমান প্রক্রিয়াটির জন্য, এমনকি একটি ছোট মেমরি ফুটোও শেষ পর্যন্ত যুক্ত হবে।
লগ সংগ্রহ / পর্যবেক্ষণ সেটআপ করুন
পিএস: আরোন এবং ক্রিস্টোফারের মধ্যে অন্য একটি পোস্টের মন্তব্যে আলোচনা হয়েছে (এই লেখার হিসাবে এটি এর শীর্ষ পোস্ট)। সে সম্পর্কে কয়েকটি মন্তব্য:
- একটি একক বন্দরে একাধিক প্রক্রিয়া শোনার জন্য এবং নতুন সংযোগ গ্রহণের জন্য প্রতিযোগিতায় মঞ্জুরি দেওয়ার জন্য একটি ভাগ করা সকেট মডেল খুব সুবিধাজনক। ধারণাগতভাবে, আপনি প্রফার্কড আপাচি উল্লেখযোগ্য সাবধানতার সাথে এটি করার কথা ভাবতে পারেন যে প্রতিটি প্রক্রিয়া কেবলমাত্র একটি সংযোগ গ্রহণ করবে এবং তারপরে মরে যাবে। অ্যাপাচে দক্ষতা হ্রাস নতুন প্রক্রিয়া কাঁটাচালার ওভারহেড হয় এবং সকেট ক্রিয়াকলাপের সাথে কোন সম্পর্ক নেই।
- নোড.জেএস এর জন্য, এন কর্মীদের একটি সকেটে প্রতিযোগিতা করা অত্যন্ত যুক্তিসঙ্গত সমাধান। বিকল্পটি হ'ল এনগিনেক্সের মতো একটি অন-বক্স ফ্রন্ট-এন্ড সেটআপ করা এবং সেই স্বতন্ত্র কর্মীদের কাছে প্রক্সি ট্র্যাফিক স্থাপন করা, নতুন সংযোগ দেওয়ার জন্য শ্রমিকদের মধ্যে বিকল্প পরিবর্তন করা। দুটি সমাধানের মধ্যে খুব অনুরূপ পারফরম্যান্স বৈশিষ্ট্য রয়েছে। এবং যেহেতু, আমি উপরে উল্লিখিত হিসাবে, আপনি সম্ভবত এনগিনেক্স (বা একটি বিকল্প) আপনার নোড পরিষেবাটিকে যে কোনও উপায়ে সীমান্তে রাখতে চান, এখানে পছন্দটি সত্যই এর মধ্যে রয়েছে:
ভাগ করা বন্দর: nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
বনাম
পৃথক বন্দর: nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
পৃথক বন্দর সেটআপের পক্ষে যুক্তিযুক্তভাবে কিছু সুবিধা রয়েছে (প্রক্রিয়াগুলির মধ্যে কম সংযোগ স্থাপনের সম্ভাবনা, আরও পরিশীলিত লোড-ব্যালেন্সিং সিদ্ধান্ত গ্রহণ করা ইত্যাদি) তবে সেটআপ করার জন্য এটি অবশ্যই আরও কাজ এবং বিল্ট-ইন ক্লাস্টার মডিউলটি কম -কম্প্লেক্সিটির বিকল্প যা বেশিরভাগ মানুষের পক্ষে কাজ করে।