एक सॉकेट सर्वर और गेम सर्वर को अलग-अलग प्रक्रियाएं होनी चाहिए?


14

एक साधारण मानक क्लाइंट / सर्वर गेम मान लें। सर्वर के लिए, एक अलग प्रक्रिया होना सार्थक है जो ग्राहकों से कनेक्शन और संदेश सुनता है और स्थानीय सॉकेट या स्टड के माध्यम से डेटा भेजता है जो वास्तविक गेम सर्वर को चलाता है?

दूसरा विकल्प यह होगा कि दोनों चीजों को एक ही प्रक्रिया में किया जाए। आने वाले संदेशों को कतारबद्ध करना और उन्हें सही क्रम में निष्पादित करना एक रुकने वाला मुद्दा नहीं होना चाहिए।

मैं सोच रहा हूं कि क्या दो "गतिविधियों" को अलग करने के लिए अतिरिक्त संसाधन वास्तव में इसके लायक हैं। मुझे कैसे तय करना चाहिए? मैं किसी भी पेशेवरों / विपक्ष को सुनना चाहूंगा।


1
दोनों भाग कैसे संवाद करते हैं? सॉकेट?
vz0

क्या आप अपने आप को एक अलग संचार तकनीक का उपयोग करने के लिए "श्रोता" को बदलने की परिकल्पना करते हैं, या एक से अधिक प्रकार के क्लाइंट-सर्वर संचार का उपयोग करने के लिए विकल्प जोड़ते हैं (उदाहरण के लिए अगर मोबाइल क्लाइंट को एक अलग तरीके से संचार करना था)? यदि ऐसा है, तो इसे अलग करने के लायक हो सकता है ताकि आप आवश्यकतानुसार मॉड्यूल को स्वैप / आउट कर सकें।
जॉन स्टोरी

@JonStory हाँ, मैं करता हूँ। यहां तक ​​कि 2 अलग-अलग श्रोताओं के साथ यह अभी भी एक ही प्रक्रिया हो सकती है, लेकिन यहां सभी उत्तरों को पढ़ने और इसके बारे में कुछ और सोचने के बाद, मैंने फैसला किया है कि अलग-अलग प्रक्रियाएं करना इसके लायक होगा। इस विशेष परियोजना के लिए मुख्य क्लाइंट एक जावास्क्रिप्ट ब्राउज़र एक होगा, लेकिन मैं भविष्य में एक देशी मोबाइल क्लाइंट ऐप जोड़ने की योजना बना रहा हूं।
luleksde

जवाबों:


17

एपीआई डिजाइन के नजरिए से, यह निर्णय लेते समय कि क्या कई अलग-अलग संचार कार्यक्रम या सिर्फ एक बनाना है, सवाल यह है: क्या प्रत्येक कार्यक्रम दूसरों के बिना सार्थक हो सकता है? आपकी परियोजना और वरीयताओं के आधार पर उत्तर अलग-अलग होंगे।

यदि वे नहीं कर सकते , तो यह सोचने लायक नहीं है। स्पष्ट रूप से वे इतने भारी लिंक से जुड़े हैं कि वे वास्तव में अलग प्रक्रिया नहीं हैं।

यदि वे कर सकते हैं , और आप भविष्य में उन्हें बदलने के लिए खुद को अलग-अलग घटकों में छोड़ना चाह सकते हैं, तो ओएस-प्रदान की प्रक्रिया अमूर्त मदद कर सकती है।

कैसे ज्यादा यह मदद करता है अपने तकनीक ढेर हालांकि के बाकी पर निर्भर करता है। उदाहरण के लिए, Erlang पहले से ही प्रक्रियाओं के रूप में आंतरिक रूप से मॉडल करता है, इसलिए आप इसे OS-प्रक्रियाओं में विभाजित करने से वैचारिक लाभ प्राप्त नहीं करेंगे। जब तक आप शायद सर्वर के उन हिस्सों को एक अलग भाषा में लिखने की सोच रहे हों। C ++ प्रोग्राम के आंतरिक घटकों को आमतौर पर बहुत तंग किया जाता है और इसलिए उन्हें स्वैप करना कठिन होता है, इसलिए विभिन्न ओएस प्रक्रियाओं में उन्हें विभाजित करने से आप बाद में काम को बचा सकते हैं यदि आप इस तरह की पुनर्व्यवस्थितियों का पूर्वाभास कर सकते हैं।


11

क्या यह एक अलग प्रक्रिया है कि ग्राहकों से कनेक्शन और संदेशों के लिए सुनता है और वास्तविक खेल सर्वर चलाता है कि किसी अन्य प्रक्रिया के लिए स्थानीय सॉकेट या स्टड के माध्यम से डेटा भेजता है?

यह जवाब देने के लिए कि क्या यह सार्थक है, आपको पहले खुद से पूछना होगा कि आप एक समर्पित कतार सेवा को जोड़कर क्या समस्या हल करने की कोशिश कर रहे हैं। यदि यह उस समस्या को हल करता है, तो यह सार्थक है; यदि यह एक समस्या का समाधान नहीं करता है या यदि आपके पास शुरू करने के लिए हल करने के लिए कोई समस्या नहीं है, तो यह संभवतः नहीं है।

आइए देखें कि कुछ कारण बहु-स्तरीय वास्तुकला का उपयोग क्यों करते हैं:

  1. अगर आप अपने वर्कलोड को कई वर्कर मशीनों पर फैलाना चाहते हैं तो लोड बैलेंसिंग - लोड बैलेंसिंग का मतलब है। यदि आपके कार्यक्रम में ऐसी अड़चनें हैं जिन्हें आप एक ही मशीन पर कई समवर्ती कार्यकर्ता प्रक्रिया के द्वारा हल करना चाहते हैं, तो यह वास्तव में अड़चन को हल करने के लिए लंबे समय में सबसे अच्छा है, लेकिन एक छोटी अवधि के समाधान के रूप में, स्पॉनिंग कार्यकर्ता प्रक्रियाएं व्यावहारिक हो सकती हैं।
  2. विशेषाधिकार पृथक्करण - हो सकता है कि आप अपने गेम सर्वर या इसके विपरीत पहुँच प्राप्त करने के लिए अपने चैट सर्वर में सुरक्षा भंग न करें। यदि आपका गेम सर्वर आपके इन-गेम चैट सर्वर से अलग है, तो आप अपने गेम सर्वर और चैट सर्वर को अलग-अलग सुरक्षा डोमेन में रहने के लिए कॉन्फ़िगर कर सकते हैं (जैसे अलग-अलग उपयोगकर्ता के रूप में चलाएं, अलग-अलग एक्सेस विशेषाधिकार, अलग-अलग प्रक्रिया सीमाएं, आदि)।
  3. शून्य डाउनटाइम अपग्रेड - यदि आप शून्य डाउनटाइम अपग्रेड को प्राप्त करना चाहते हैं, तो आपको कई स्तरीय होना चाहिए और सिस्टम को कॉन्फ़िगर करना होगा जैसे कि जब आप सर्विसिंग के लिए एक सर्वर को लेते हैं, तो उसके अनुरोध को उसी सर्वर में अन्य सर्वरों पर पुनर्निर्देशित किया जाएगा ताकि यह सुनिश्चित हो सके सेवा।
  4. ब्रेकिंग लिमिट - यदि आप सॉकेट लिमिट, फाइल डिस्क्रिप्टर लिमिट, एक ग्लोबल इंटरप्रेटर लॉक इत्यादि तक पहुंचते हैं, तो आप कई प्रक्रियाओं को चलाकर उस सीमा के आसपास काम करने में सक्षम हो सकते हैं। इसे हल करने का एक और तरीका सीमा को बदलना है, लेकिन यह हमेशा आसान नहीं होता है क्योंकि आपको कर्नेल को फिर से भरना पड़ सकता है, या सुरक्षा या प्रदर्शन निहितार्थ हो सकते हैं।
  5. संसाधनों के रिसाव को सीमित करना - आप ऐसे सॉफ्टवेयर लिखना चाहते हैं जो संसाधनों को लीक न करें, लेकिन पूरी तरह से प्रबंधित भाषाओं में भी यह लंबे समय से चली आ रही प्रक्रियाओं में बेहद कठिन है, और इससे भी बदतर यह एक विकास के माहौल में दोहराने के लिए कठिन है। एक मल्टीटियर आर्किटेक्चर आपको सेवा को बाधित किए बिना, संसाधन रिसाव से नुकसान को सीमित करने के लिए कुछ समय या अनुरोधों के बाद गेम सर्वर को मारने और प्रतिक्रिया करने की अनुमति देता है।

5

मैं शाफ़्ट सनकी से सहमत हूँ। जब तक आपके पास एक एकल गेमर है, यह परेशानी के लायक नहीं है।

हालाँकि, यह आर्किटेक्चर उपयोगी साबित हो सकता है जब आपको क्षैतिज रूप से स्केल करने की आवश्यकता होती है। जब एक गेमरवर अब पर्याप्त नहीं है और आपको अपने गेम को प्रदर्शन के कारणों के लिए कई गेमर्स पर वितरित करने की आवश्यकता है, तो "सॉकेट सर्वर" आर्किटेक्चर को सॉकेट सर्वर को एक लोड बैलेंसर में बदलने के लिए आसानी से अनुकूलित किया जा सकता है जो स्वचालित रूप से कई बैकएंड में से एक के कनेक्शन को रूट करता है। सर्वर।

लेकिन जब आपको यकीन नहीं होगा कि आपको इसकी आवश्यकता होगी, तो इस बिंदु पर दो अलग-अलग सर्वर एप्लिकेशन विकसित करने की संभावना है।


4

यह संभवतः नहीं है, अधिकांश भाषाओं में अतुल्यकालिक सॉकेट्स हैं जो आपको एक बार में कई कनेक्शनों का उपयोग करने की अनुमति देते हैं, जबकि डेटा प्रतीक्षा के बिना अवरुद्ध है। यह "सॉकेट सर्वर" भाग को ओएस / कर्नेल में स्थानांतरित करता है।

एक स्पष्ट सॉकेट सर्वर के साथ आप कुछ अतिरिक्त प्रतियों की लागत को लागू करेंगे, जैसा कि आप स्थानीय सॉकेट के माध्यम से डेटा पास करते हैं; स्केलेबिलिटी को मारने वाली एक चीज अतिरिक्त प्रतियां हैं जहां आपको उनकी आवश्यकता नहीं है।


1
जब तक आप पहले से ही नहीं जानते हैं कि आपके सर्वर में बहुत अधिक स्केलेबिलिटी की आवश्यकता होगी, मुझे इस स्तर पर प्रदर्शन की चिंता नहीं होगी। कुछ डेटा को मेमोरी में कॉपी करने का ओवरहेड इंटरनेट पर डेटा भेजने की तुलना में गायब हो जाता है ।
अंको
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.