2012-07-26 10 views
11

Server-Sent Events का उपयोग करते समय क्लाइंट में रुचि रखने वाली विभिन्न घटनाओं को प्राप्त करने के लिए एकाधिक कनेक्शन स्थापित करना चाहिए, या एक कनेक्शन होना चाहिए और क्लाइंट इंगित करता है कि यह एक अलग चैनल के माध्यम से क्या रुचि रखता है? बाद में आईएमओ अधिक बेहतर लगता है हालांकि कुछ लोगों के लिए यह क्लाइंट कोड अधिक जटिल बना सकता है। Spec नामित घटनाओं (एक विशेष विषय से संबंधित घटनाओं) का समर्थन करता है, जो मुझे बताता है कि सर्वर-प्रेषित घटना कनेक्शन को सभी घटनाओं के लिए एकल चैनल के रूप में उपयोग किया जाना चाहिए।प्रति ऐप केवल एक इवेंटसोर्स ऑब्जेक्ट होना चाहिए?

निम्नलिखित कोड पहले परिदृश्य जहां एक से अधिक सर्वर-से भेजे घटना कनेक्शन शुरू कर रहे हैं दिखाता है:

var EventSource eventSource1 = new EventSource("events/topic1"); 
eventSource1.addEventListener('topic1', topic1Listener, false); 

var EventSource eventSource2 = new EventSource("events/topic2"); 
eventSource2.addEventListener('topic2', topic2Listener, false); 

eventSource1 "topic1" घटनाओं प्राप्त होगा और eventSource2 "topic2" घटनाओं प्राप्त होगा। जबकि यह बहुत सीधे आगे है यह भी एक हैंग करने के साथ बहुत अक्षम है प्राप्त प्रत्येक विषय आप में रुचि रखते हैं के लिए होने वाली

विकल्प निम्नलिखित की तरह कुछ है:।

var EventSource eventSource3 = new EventSource("/events?id=1234") 
eventSource3.addEventListener('topic3', topic3Listener, false); 
eventSource3.addEventListener('topic4', topic4Listener, false); 

var subscription = new XMLHttpRequest(); 
subscription.open("PUT", "/events/topic3?id=1234", true); 
subscription.send(); 

इस उदाहरण में एक भी EventSource होगा मौजूद है और किसी विशेष घटना में रुचि सर्वर-प्रेषित ईवेंट कनेक्शन और आईडी पैरा द्वारा सहसंबंधित पंजीकरण के साथ एक अलग अनुरोध द्वारा निर्दिष्ट किया जाएगा। विषय 3 लिस्टर को "विषय 3" घटनाएं और विषय 4 प्राप्तकर्ता नहीं मिलेगा। जबकि थोड़ा और कोड की आवश्यकता होती है, लाभ यह है कि केवल एक ही कनेक्शन बनाया जाता है, लेकिन घटनाओं को अभी भी पहचाना जा सकता है और अलग-अलग संभाला जा सकता है।

वेब पर ऐसे कई उदाहरण हैं जो नामित घटनाओं का उपयोग दिखाते हैं, लेकिन ऐसा लगता है कि ईवेंट नाम (या विषय) अग्रिम में ज्ञात हैं इसलिए क्लाइंट के साथ रुचि पंजीकृत करने की कोई आवश्यकता नहीं है (example)। हालांकि मुझे अभी तक कई इवेंटसोर्स ऑब्जेक्ट्स दिखाने का एक उदाहरण दिखाई नहीं दे रहा है, मैंने एक विशेष विषय में रुचि पंजीकृत करने के लिए एक अलग अनुरोध का उपयोग करके क्लाइंट को एक उदाहरण भी नहीं देखा है, जैसा कि मैं ऊपर कर रहा हूं। Spec की मेरी व्याख्या मुझे विश्वास दिलाती है कि किसी निश्चित विषय (या घटना का नाम) में रुचि का संकेत पूरी तरह से डेवलपर तक है और यह क्लाइंट के साथ स्थाई रूप से किया जा सकता है, जो घटनाओं के नामों को जानने के लिए या क्लाइंट के साथ गतिशील रूप से सर्वर को चेतावनी दी जाती है कि यह विशेष घटनाओं को प्राप्त करने में रूचि रखता है।

मुझे इस विषय पर अन्य लोगों के विचारों को सुनने में बहुत दिलचस्पी होगी। एनबी: मैं आमतौर पर जावा देव हूं इसलिए कृपया मेरे औसत जेएस कोड को क्षमा करें .. :)

+0

आप अपने घटना धारा में सभी ईवेंट के नाम पर उपयोग नहीं कर सकते, इसके बजाय आप और "संदेश" घटना के लिए सुन सकते हैं event.data में आप अपने topicId और अतिरिक्त जानकारी सांकेतिक शब्दों में बदलना कर सकते हैं – 4esn0k

+0

हाँ ज़रूर, लेकिन इसका मतलब यह होगा कि मुझे ऐसे डेटा को पेलोड में एन्कोड करने की आवश्यकता है जो वास्तव में समझ में नहीं आता है जब संदेश पहचान पहले से ही spec के डेटा फ़्रेमिंग का हिस्सा है। –

+1

+1! बहुत अच्छा सवाल है। आपने आखिर में क्या किया ? मैं दूसरे दृष्टिकोण के साथ जाने की भी सोच रहा हूं। अगर आप साझा करते हैं कि आप इसके साथ किसी भी समस्या में भाग गए हैं तो सराहना करेंगे। – brainOverflow

उत्तर

3

मैं अत्यधिक अनुशंसा करता हूं कि आईएमएचओ, आपके पास एक EventSource प्रति एसएसई-सेवा प्रदान करने वाली वस्तु है, और फिर विभिन्न प्रकारों का उपयोग करके संदेशों को उत्सर्जित करें ।

आखिरकार, यह इस बात पर निर्भर करता है कि संदेश प्रकार कितने समान हैं। उदाहरण के लिए, यदि आपके पास उपयोगकर्ताओं से संबंधित 5 अलग-अलग प्रकार के संदेश हैं, तो उपयोगकर्ता EventSource और ईवेंट प्रकारों के साथ अंतर करें।

यदि आपके पास उपयोगकर्ताओं के बारे में एक ईवेंट प्रकार है, और दूसरा सैंडविच के बारे में है, तो मैं कहूंगा कि उन्हें अलग-अलग सेवाओं में रखें, और इस प्रकार EventSource एस।

इवेंट स्रोतों को तोड़ने के बारे में सोचना एक अच्छा विचार है, वैसे ही आप एक आरामदायक सेवा करेंगे। अगर आपको AJAX के साथ एक ही सेवा से दो चीजें नहीं मिलेंगी, तो आपको शायद उन्हें उसी ईवेंटसोर्स से नहीं मिलना चाहिए।

+0

क्या वह स्केल करता है? – nilskp

0

अस्पष्ट और अनुमोदित ब्राउज़र मानक व्याख्या * के जवाब में, ब्राउज़र विक्रेताओं ने एक डोमेन/पोर्ट को अनुमत लगातार कनेक्शन की संख्या पर असंगत रूप से लागू प्रतिबंध लगाए हैं।चूंकि प्रत्येक इवेंट रिसीवर एसिंक संदर्भ में एक रिसीवर खुला रहता है, तब तक एक लगातार निरंतर कनेक्शन आवंटन मानता है, यह महत्वपूर्ण है कि इवेंटसोर्स श्रोताओं की संख्या अलग-अलग, विक्रेता-विशिष्ट सीमाओं से अधिक से बचने के लिए सख्ती से सीमित हो। अभ्यास में यह आपको प्रति आवेदन लगभग 6 EventSource/async संदर्भ जोड़े तक सीमित करता है। गिरावट सुंदर है (उदाहरण के लिए अतिरिक्त इवेंटसोर्स कनेक्शन अनुरोध केवल स्लॉट उपलब्ध होने तक ही प्रतीक्षा करेंगे), लेकिन ध्यान रखें कि पृष्ठ संसाधनों को पुनर्प्राप्त करने के लिए कनेक्शन उपलब्ध होना चाहिए, एक्सएचआर का जवाब देना,

* डब्ल्यू 3 सी ने मानकों को जारी किया है लगातार कनेक्शन के संबंध में भाषा "... एक साथ कनेक्शन की संख्या सीमित करनी चाहिए ..." इस भाषा का मतलब है कि मानक अनिवार्य नहीं है इसलिए विक्रेता अनुपालन परिवर्तनीय है। http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4

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