19

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

हालांकि मैं बहुत सीमित संख्या का परीक्षण कर रहा था और यहां तक ​​कि अगर मैं अपाचे पर परीक्षण चला रहा हूं (मुझे पता है, मुझे नोड का उपयोग करना चाहिए)।

मैंने फिर ब्राउज़र को स्विच किया और वास्तव में कुछ दिलचस्प देखा: जाहिर है क्रोम सर्वर प्रेषित घटनाओं को 4-5 तक सीमित करता है, जबकि ओपेरा नहीं करता है। दूसरी ओर, फ़ायरफ़ॉक्स 4-5 एक साथ कनेक्शन के बाद, किसी भी अन्य पृष्ठ को लोड करने से इंकार कर देता है।

इसके पीछे क्या कारण है? क्या सीमा केवल उसी स्रोत से एसएसई कनेक्शन पर लागू होती है, या यदि मैं उन्हें किसी भिन्न डोमेन से खोलने का परीक्षण करता हूं तो यह वही होगा? क्या कोई मौका है कि मैं एसएसई का दुरुपयोग कर रहा हूं और यह वास्तव में ब्राउज़र को अवरुद्ध कर रहा है, या यह एक ज्ञात व्यवहार है? क्या इसके चारों ओर कोई रास्ता है?

+0

विंडोज़ में, यह एक रजिस्ट्री सेटिंग द्वारा नियंत्रित किया जाता है जो आईई, क्रोम, और फ़ायरफ़ॉक्स सम्मान है, और जो केवल एसएसई नहीं, सभी कनेक्शन को सीमित करता है। मुझे websockets के साथ एक ही समस्या थी ... आप इसे नहीं बना सकते ... – dandavis

उत्तर

26

यह सभी ब्राउज़रों में काम करता है यह है कि प्रत्येक डोमेन को सीमित मात्रा में कनेक्शन मिलते हैं और सीमाएं आपके पूरे एप्लिकेशन के लिए वैश्विक हैं। इसका मतलब है कि यदि आपके पास रीयलटाइम संचार के लिए एक कनेक्शन खुला है तो आपके पास छवियों, सीएसएस और अन्य पृष्ठों को लोड करने के लिए एक कम है। इसके शीर्ष पर आपको नए टैब या विंडो के लिए नए कनेक्शन नहीं मिलते हैं, उन सभी को समान कनेक्शन साझा करने की आवश्यकता होती है। यह बहुत निराशाजनक है लेकिन कनेक्शन को सीमित करने के अच्छे कारण हैं। कुछ साल पहले, यह सीमा सभी ब्राउज़रों में 2 थी (नियमों के आधार पर (http://www.ietf.org/rfc/rfc2616.txt) HTTP1.1 spec) लेकिन अब अधिकांश ब्राउज़र सामान्य रूप से 4-10 कनेक्शन का उपयोग करते हैं। दूसरी ओर मोबाइल ब्राउज़र को अभी भी बैटरी बचत उद्देश्यों के लिए कनेक्शन की मात्रा सीमित करने की आवश्यकता है।

ये चाल उपलब्ध हैं:

  1. उपयोग अधिक मेजबान के नाम। पूर्व असाइन करके। www1.domain.com, www2.domain.com आपको प्रत्येक होस्ट नाम के लिए नए कनेक्शन मिलते हैं। यह चाल सभी ब्राउज़रों में काम करती है। पूरे डोमेन को शामिल करने के लिए कुकी डोमेन को बदलने के लिए मत भूलना (domain.com, www.domain.com नहीं)
  2. वेब सॉकेट का उपयोग करें। वेब सॉकेट इन प्रतिबंधों से सीमित नहीं हैं और अधिक महत्वपूर्ण बात यह है कि वे आपकी शेष वेबसाइट सामग्री के साथ प्रतिस्पर्धा नहीं कर रहे हैं।
  3. जब आप नए टैब/विंडो खोलते हैं तो उसी कनेक्शन का पुन: उपयोग करें। आप किसी ऑब्जेक्ट कॉल हब के लिए सभी वास्तविक समय संचार तर्क इकट्ठे हुए हैं, तो आप इस तरह सभी खोला खिड़कियों पर उस वस्तु को याद कर सकते हैं:

    window.hub = window.opener ? window.opener.hub || new Hub()

  4. या का उपयोग फ्लैश - इन दिनों काफी नहीं सबसे अच्छा सलाह लेकिन यह अभी भी हो सकता है एक विकल्प अगर websockets एक विकल्प नहीं हैं।
  5. प्रत्येक एसएसई अनुरोध के बीच कुछ सेकंड जोड़ने के लिए याद रखें ताकि एक नया शुरू करने से पहले कतारबद्ध अनुरोधों को मंजूरी दे दी जा सके। उपयोगकर्ता द्वारा निष्क्रिय होने वाले प्रत्येक सेकेंड के लिए थोड़ा अधिक प्रतीक्षा समय भी जोड़ें, इस तरह आप उन सक्रिय उपयोगकर्ताओं पर अपने सर्वर संसाधनों पर ध्यान केंद्रित कर सकते हैं।इसके अलावा देरी की एक यादृच्छिक संख्या जोड़ने Thundering Herd Problem

एक और बात बचने के लिए जब जैसे कि जावा या सी # आप अपने लंबे पोलिंग अनुरोध कि के बाकी के लिए आवश्यक हैं में संसाधनों का उपयोग कर जोखिम एक बहु-क्रम और अवरुद्ध भाषा का प्रयोग कर याद करने के लिए अपने आवेदन। उदाहरण के लिए सी # में प्रत्येक अनुरोध सत्र ऑब्जेक्ट को लॉक करता है जिसका अर्थ है कि एसएसई अनुरोध सक्रिय होने के दौरान पूरा एप्लिकेशन उत्तरदायी नहीं है।

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

+1

महान जवाब! क्या आप जानते हैं कि क्यों फ़ायरफ़ॉक्स किसी भी अन्य डोमेन को खोलने से इंकार कर रहा था? – Sunyatasattva

+0

धन्यवाद; दुर्भाग्य से window.opener चाल केवल मेरे ऐप से बनाई गई बाल विंडो के लिए काम करेगी; किसी भी टैब के लिए नहीं जो उपयोगकर्ता खुद को खोलता है। जैसे ही उपयोगकर्ता बहुत सारे टैब खोलता है, मैं खराब हूं ... क्या आपको पता है कि यह जांचने का कोई तरीका है कि हम सभी खुले कनेक्शन निकालने वाले हैं? – phtrivier

+0

(window.parent || window.opener) का उपयोग करने का प्रयास करें जो दोनों परिदृश्यों का ख्याल रखेगा। क्रॉस टैब संदेशों को भेजने के लिए पोस्ट मैसेज विधि को भी देखें। मुझे नहीं लगता कि कनेक्शन की मात्रा देखने का कोई तरीका है लेकिन आपको समय-समय पर संपत्ति का उपयोग उन परिदृश्यों पर प्रतिक्रिया करने में सक्षम होना चाहिए जहां लंबे मतदान के अनुरोध अन्य अनुरोधों को रोक रहे हैं। xhr = नया XMLHttpRequest(); xhr.timeout = 5000; xhr.ontimeout = timeoutFired; –

3

आप एक साथ कनेक्शन की संख्या के बारे में सही हैं।

आप अधिकतम मान के लिए इस सूची देख सकते हैं: http://www.browserscope.org/?category=network

और दुर्भाग्य से, मैं कभी नहीं किसी भी काम के आसपास पाया, बहुसंकेतन और/या अलग-अलग होस्टनाम का उपयोग कर को छोड़कर।

संबंधित मुद्दे