PM2 में क्लस्टर और फोर्क मोड अंतर


89

मैंने इस प्रश्न का पता लगाने के लिए बहुत खोज की है, लेकिन मुझे स्पष्ट स्पष्टीकरण नहीं मिला। क्या केवल एक ही अंतर है कि क्लस्टर्ड ऐप को छोटा किया जा सकता है और कांटेक्ट ऐप नहीं हो सकता है?

PM2 की सार्वजनिक साइट बताती है कि क्लस्टर मोड इन सुविधाओं को कर सकता है , लेकिन कोई भी फोर्क मोड के पेशेवरों के बारे में नहीं कहता है (हो सकता है, यह NODE_APP_INSTANCEपरिवर्तनशील हो सकता है)।

मुझे लगता है कि क्लस्टर कांटा का हिस्सा हो सकता है क्योंकि फोर्क सामान्य रूप से इस्तेमाल किया जा रहा है। इसलिए, मुझे लगता है कि Fork का अर्थ है, PM2 के बिंदु से 'forked प्रक्रिया' और Cluster का अर्थ है 'forked प्रक्रिया जिसे स्केल किया जा सकता है'। फिर, मुझे फोर्क मोड का उपयोग क्यों करना चाहिए?

जवाबों:


121

के बीच मुख्य अंतर fork_modeऔर cluster_modeहै कि यह आदेश या तो उपयोग करने के लिए PM2 है child_process.fork एपीआई या क्लस्टर एपीआई।

आंतरिक रूप से इसका क्या अर्थ है?

कांटा मोड

forkमोड को मूल प्रक्रिया के रूप में लें । यह बदलने की अनुमति देता है exec_interpreter, ताकि आप pm2 के साथ phpया pythonसर्वर चला सकें। हाँ, exec_interpreter"कमांड" है जिसका उपयोग बाल प्रक्रिया शुरू करने के लिए किया जाता है। डिफ़ॉल्ट रूप से, pm2 का उपयोग करेगा nodeताकि pm2 start server.jsकुछ ऐसा हो जाए :

require('child_process').spawn('node', ['server.js'])

यह मोड बहुत उपयोगी है क्योंकि यह बहुत सारी संभावनाओं को सक्षम करता है। उदाहरण के लिए, आप पूर्व-स्थापित पोर्ट पर कई सर्वर लॉन्च कर सकते हैं जो तब HAProxy या Nginx द्वारा लोड-संतुलित होंगे।

क्लस्टर मोड

clusterकेवल के साथ काम करेंगे nodeके रूप में यह है exec_interpreter(: जैसे क्योंकि यह NodeJS क्लस्टर मॉड्यूल के लिए उपयोग करेंगे isMaster, forkतरीकों आदि)। यह शून्य-कॉन्फ़िगरेशन प्रक्रिया प्रबंधन के लिए बहुत अच्छा है क्योंकि प्रक्रिया स्वचालित रूप से कई उदाहरणों में कांटा जाएगी। उदाहरण के लिए pm2 start -i 4 server.js4 इंस्टेंसेस लॉन्च करेगा server.jsऔर क्लस्टर मॉड्यूल को लोड संतुलन को संभालने देगा।


3
यहां आपके उत्तर के आधार पर प्रश्न: मेरे पास एक उपयोग का मामला है, जो मेरे पास है, मेरे नोड के 30 उदाहरण कहते हैं। जेएस ऐप एक अद्वितीय, पूर्वनिर्धारित, पोर्ट संख्या (: 3000 के माध्यम से: 3030) के साथ उत्पन्न होता है और प्रत्येक इंस्टेंसेस को संभालता है उपयोगकर्ताओं के विशिष्ट समूह जो केवल अपने निर्दिष्ट पोर्ट पर पहुंचेंगे। इसलिए मैं नहीं चाहता कि मास्टर प्रक्रिया लोड संतुलन करने के लिए हो, लेकिन इसके बजाय, केवल बच्चे प्रक्रियाओं को शुरू करें (और चालू रखें)। क्या यह संभव है? या क्या यह केवल बच्चे की सभी प्रक्रियाओं के दौरान लोड को फैलाने का प्रयास करेगा?
तैमुक

3
मैं fork_mode में 30 प्रक्रियाओं को लॉन्च करने के लिए pm2 प्रोग्रामेटिक API का उपयोग करूंगा और 30 पोर्ट के बीच लोड बैलेंसर के रूप में कुछ और उपयोग करूंगा। आप भी काम कर सकते हैं pm2 start -i 30 app.jsऔर नोडज क्लस्टर को काम करने दें।
सोयाका

11
नोट: cluster modeमास्टर प्रक्रिया में विफलता का एक बिंदु है।
कार्ल पोकस

40

नोड.जेएस एकल-धागा है।

इसका मतलब है कि आपके इंटेल क्वाड-कोर सीपीयू में से केवल 1 कोर नोड एप्लिकेशन को निष्पादित कर सकता है।

इसे कहते हैं fork_mode:।

हम इसका उपयोग स्थानीय देव के लिए करते हैं

pm2 start server.js -i 0 आपके CPU के प्रत्येक कोर पर 1 नोड थ्रेड चलाने में मदद करता है।

और ऑटो-लोड-संतुलन स्टेटलेस आने वाले अनुरोधों को।

पर एक ही बंदरगाह

हम इसे कहते हैं cluster_mode:।

जिसका उपयोग उत्पादन पर प्रदर्शन के लिए किया जाता है ।

यदि आप अपने पीसी का परीक्षण करना चाहते हैं तो आप स्थानीय देव पर ऐसा करना चुन सकते हैं :)


2
thaks, यह मेरे दिमाग में बहुत सारी बातें बताता है
ऋषभ अग्रवाल

1
महान व्याख्या !!
पाइके

1
Node.js एकल थ्रेडेड नहीं है, एक उपयोगकर्ता थ्रेड है (वर्तमान में) लेकिन यह निश्चित रूप से एक libuv थ्रेडपूल द्वारा समर्थित है।
बेंजामिन Gruenbaum

1
@BenjaminGruenbaum आपसे सहमत है। मेरे कथन को इस धारणा में समझा जाना चाहिए कि मैं बहुत गहराई से कामेच्छा के स्तर का उल्लेख नहीं कर रहा हूँ
हॉटांग

16

यहां प्रलेखन और स्रोत वास्तव में भ्रामक हैं।

सूत्रों में इस पर पढ़ना, केवल अंतर प्रतीत होता है, कि वे नोड clusterया child_processएपीआई का उपयोग करते हैं । चूंकि बाद clusterका उपयोग करता है, आप वास्तव में ऐसा ही कर रहे हैं। वहाँ बस एक बहुत अधिक कस्टम stdioसराय के आसपास हो रहा है fork_mode। इसके अलावा clusterकेवल तार के माध्यम से संचार किया जा सकता है, न कि वस्तुओं के साथ।

डिफ़ॉल्ट रूप से आप उपयोग कर रहे हैं fork_mode। यदि आप -i [number]-ओपशन को पास करते हैं , तो आप जा रहे हैं cluster_mode, जिसे आप आमतौर पर w / के लिए लक्ष्य बनाते हैं pm2

इसके अलावा fork_modeउदाहरण शायद की वजह से एक ही पोर्ट पर सुनने नहीं कर सकता EADDRINUSEcluster_modeकर सकते हैं। इस तरह से आप अपने आप को संतुलित करने के लिए उसी पोर्ट पर चलाने के लिए ऐप को स्ट्रक्चर कर सकते हैं। आपको राज्य के बिना ऐप्स का निर्माण करना होगा, हालांकि उदाहरण सत्र, dbs।


1
मैं अभी भी असमंजस में हूँ। clusterअंतर्निहित मॉड्यूल child_processआंतरिक रूप से उपयोग करता है ? और आपका सुझाव है कि क्या मुझे लचीला चाहिए stdio, मुझे फोर्क-मोड का उपयोग करना होगा?
जिनेउंग किम

यह stdioबात कुछ pm2कार्यान्वयन की है। इस बारे में चिंता मत करो। आप cluster_modeउत्पादन में उपयोग करना चाहते हैं क्योंकि यह आपके उदाहरण को सख्त कर रहा है क्योंकि यह -i [number]पृष्ठभूमि में उदाहरणों को चला रहा है । fork_modeयदि सख्त होना आवश्यक नहीं है या आप बेहतर लॉग और सामान चाहते हैं तो उपयोग करें ।
एल्जेफेडेलरोडोडेलजेफ

1
स्पष्ट रूप cluster_modeसे आपके सिस्टम के अधिक संसाधनों का उपयोग करता है क्योंकि आप -i [number]प्रक्रियाएं चला रहे हैं।
इलाजेफेलरोडोडेलजिफे

हालाँकि मैंने आपके जवाब की गर्मजोशी से सराहना की, लेकिन मैंने अब भी इस मुद्दे को नहीं पकड़ा। आपके अधिकांश स्पष्टीकरण एक तरह की प्राकृतिक चीजें हैं (जैसे, CLI का उपयोग cluster_mode, का लोड-बैलेंस cluster_mode, cluster_modeअधिक संसाधनों का उपयोग करता है ..)। यही कारण है कि मैंने मतदान नहीं किया है। क्या आप दोनों सरल उपयोग मामलों की व्याख्या कर सकते हैं? प्रत्येक मामले को वाजिब होना चाहिए, क्योंकि इसने अपना मोड लिया।
जिनेउंग किम

@eljefedelrodeodeljefe क्या आप इसके बारे में अधिक बता सकते हैं कि "आपको राज्य के बिना एप्लिकेशन का निर्माण करना है, हालांकि उदाहरण के लिए, dbs?"। ऐप राज्य के बिना क्यों होना चाहिए?
STEN
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.