2012-04-11 18 views
6

मैं एक वितरित प्रणाली का निर्माण कर रहा हूं जिसमें संभावित रूप से लाखों क्लाइंट शामिल हैं जिन्हें सर्वर से कमांड की प्रतीक्षा करने के लिए सभी को खुले (प्राथमिक रूप से HTTP) कनेक्शन रखने की आवश्यकता है (जो कहीं और चल रहा है) । संदेश/कमांड का भार बहुत अधिक नहीं होगा, शायद एक संदेश/सेकंड/1000 क्लाइंट जिसका अर्थ है कि यह 1000 संदेश/सेकंड @ 1 मिलियन क्लाइंट होगा। => यह मूल रूप से समवर्ती कनेक्शन के बारे में है।लाखों समवर्ती कनेक्शनों के लिए सर्वर पुश

आवश्यकताएं भी सरल हैं। एक तरफ मैसेजिंग (सर्वर-> क्लाइंट), प्रति चैनल केवल 1 क्लाइंट "।

मैं प्रौद्योगिकी के संदर्भ में बहुत खुला हूं (xmpp/websockets/धूमकेतु/...)। मैं सर्वर के रूप में Google App Engine का उपयोग कर रहा हूं, लेकिन दुर्भाग्यवश (बहुत कम कोटा और कोई जावा क्लाइंट नहीं) उनके "चैनल" मेरे लिए काम नहीं करेंगे। एक्सएमपीपी एक विकल्प था लेकिन काफी महंगा है। अब तक मैं यूआरएल Fetch & पबनब का उपयोग कर रहा था, लेकिन उन्होंने कनेक्शन (बड़े समय) के लिए चार्ज करना शुरू कर दिया।

तो:

  1. किसी को भी वहाँ बाहर एक सेवा एक किफायती तरीके से ऐसा कर सकते हैं कि मेरे लिए के बारे में पता है? अधिकांश मुझे कनेक्शन के लिए प्रतिबंधित या भारी शुल्क मिला है।

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

मेरे वास्तुकला भी संदेश सर्वर खंड के लिए अनुमति देता है, लेकिन मैं समवर्ती कनेक्शन अधिकतम करने के लिए क्योंकि संदेश प्रसंस्करण सीपीयू भूमि के ऊपर कम है चाहते हैं।

+0

यह स्वीकार करने के लिए एक कठिन है। क्या आपने यूडीपी जैसे कनेक्शन रहित प्रोटोकॉल को माना है? आपको अपना खुद का एक प्रोटोकॉल लिखना होगा लेकिन फिर आपको कनेक्शन बनाए रखना नहीं होगा और आपको कनेक्शन ओवरहेड नहीं लेना होगा। मैंने कुछ बहुत ही उच्च थ्रूपुट वितरित सर्वर लिखे हैं लेकिन ग्राहक का सामना नहीं करना है। – Gray

+0

एफवाईआई, मैंने इस बीच नेटटी का उपयोग करके इसे लागू किया है (नीचे उत्तर देखें)। – Daniel

+0

कूल @ डैनियल। मुझे इसे देखना होगा। मैंने नेटी के बारे में अच्छी बातें सुनी हैं लेकिन कभी इसका इस्तेमाल नहीं किया। – Gray

उत्तर

6

मैंने इस बीच netty.io का उपयोग करके अपना स्वयं का संदेश सर्वर लागू किया है। नेटटी जावा एनआईओ और स्केल का उपयोग बहुत अच्छी तरह से करता है। निष्क्रिय कनेक्शन के लिए मुझे प्रति कनेक्शन 500 बाइट्स का मेमोरी पदचिह्न मिलता है। मैं केवल बहुत ही सरल संदेश अग्रेषण कर रहा हूं (कोई कैशिंग, स्टोरेज या अन्य फैंसी सामान नहीं) लेकिन इसके साथ छोटे अमेज़ॅन इंस्टेंस (1ECU/1.6GB) पर आसानी से 1000 - 1500 msg/sec (प्रत्येक आधा केबी) प्राप्त हो रहा है।

अन्यथा यदि आप एक (भुगतान) सेवा की तलाश में हैं तो मैं spire.io की सिफारिश कर सकता हूं (वे कनेक्शन के लिए शुल्क नहीं लेते हैं लेकिन प्रति संदेश अधिक मूल्य रखते हैं) या पबनब (वे कनेक्शन के लिए चार्ज करते हैं लेकिन प्रति संदेश सस्ता हैं)।

3

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

लाखों सॉकेट बनाना संभव है, लेकिन केवल सबसे उन्नत तकनीकें ऐसा करने में सक्षम हैं। Erlang लाखों कनेक्शन को संभालने में सक्षम है, और बहुत स्केलेबल है। यदि आप अन्य उच्च स्तरीय प्रौद्योगिकियों का उपयोग करके लाखों कनेक्शन रखना चाहते हैं, तो आपको जो कुछ हासिल करने की कोशिश कर रहे हैं उसके बारे में सोचने के बारे में सोचने की आवश्यकता है।

उदाहरण के लिए गेटवे सर्वर का उपयोग करना जो सभी प्रोसेसिंग सर्वरों का ट्रैक रखेगा। और उनमें से डेटा (आईपी, पोर्ट्स, लोड (यदि यह एक आंतरिक नेटवर्क होगा, फ़ायरवॉलिंग और पोर्ट अग्रेषण यहां आसान हो सकता है) क्लाइंट सॉफ़्टवेयर उस गेटवे सर्वर से कनेक्ट होता है, गेटवे सर्वर कम से कम लोड सर्वर को चेक करता है और आईपी भेजता है और क्लाइंट को पोर्ट। ग्राहक प्रदान किए गए पते का उपयोग कर सीधे सर्वर पर कनेक्शन बनाता है। इस तरह आपके पास गेटवे होगा जो प्राधिकरण को भी संभाल सकता है, और लंबे समय से कनेक्शन नहीं रख सकता है, इसलिए उनमें से एक पर्याप्त हो सकता है। और कई कर्मचारी जो कर रहे हैं डेटा का प्रकाशन और कनेक्शन रखने।

यह आपकी आवश्यकताओं से बहुत संबंधित है, और हो सकता है कि आपके समाधान के लिए उपयुक्त न हो।

+0

मुझे उस विषय के लिए एक दिलचस्प लेख मिला: http://www.metabrew.com/article/a-million-user-comet-plplication-with-mochiweb-part-1 आपके लिए दिलचस्प हो सकता है कि ऑटोर आगे बढ़ने में कामयाब रहा एक सी lib का उपयोग कर मेम पदचिह्न को अनुकूलित करें जो एरलांग को बदलने के लिए कनेक्शन को संभालता है। – Daniel

+0

Maksims Mihejevs: क्या आप निम्न प्रश्न का उत्तर दे सकते हैं, यह मेरे लिए उपयोगी होगा। धन्यवाद। //stackoverflow.com/questions/23597203/instant-messaging-over-xmpp-or-websocket – Pradeep