46

क्या HTML5 SSEs और सीधे अजाक्स मतदान के बीच एक बड़ा अंतर है (प्रदर्शन, ब्राउज़र कार्यान्वयन उपलब्धता, सर्वर लोड आदि के मामले में)? सर्वर की तरफ से, ऐसा लगता है कि EventSource बस प्रत्येक ~ 3 सेकंड या उससे निर्दिष्ट पृष्ठ को मार रहा है (हालांकि मुझे लगता है कि समय लचीला है)।सर्वर-प्रेषित घटनाक्रम बनाम मतदान

माना जाता है कि टाइमर सेट करने और इसे $.get रखने के बजाय ग्राहक पक्ष पर सेट करना आसान है, लेकिन क्या कुछ और है? क्या यह कम हेडर भेजता है, या कुछ अन्य जादू करता हूं जो मुझे याद आ रही है?

उत्तर

67

अजाक्स मतदान बहुत सारे HTTP ओवरहेड जोड़ता है क्योंकि यह लगातार HTTP कनेक्शन स्थापित और फाड़ रहा है। HTML5 Rocks इसे रखता है "दूसरी तरफ सर्वर-प्रेषित घटनाओं को जमीन से डिजाइन करने के लिए कुशल बनाया गया है।"

सर्वर द्वारा भेजे गए ईवेंट एक लंबे समय तक रहने वाले HTTP कनेक्शन को खोलते हैं। सर्वर तब अनौपचारिक रूप से डेटा भेजता है, जब ग्राहक के पास अनुरोध करने या कुछ भी करने की आवश्यकता नहीं होती है लेकिन संदेशों के लिए प्रतीक्षा की जाती है।

सर्वर से भेजे गए ईवेंट के लिए एक नकारात्मक पक्ष यह है कि चूंकि वे सर्वर से लगातार कनेक्शन बनाते हैं, तो संभवतः आपके सर्वर पर कई खुले कनेक्शन हो सकते हैं। कुछ सर्वर handle massive numbers of concurrent connections better दूसरों की तुलना में। उस ने कहा, आपको मतदान के साथ-साथ उन कनेक्शनों को फिर से स्थापित करने के ऊपरी हिस्से में भी समान समस्याएं होंगी।

सर्वर द्वारा भेजे गए ईवेंट काफी अच्छी तरह से supported in most browsers हैं, आईई के उल्लेखनीय अपवाद हैं। लेकिन polyfills (और jQuery plugin) हैं जो इसे ठीक करेंगे।

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

यदि आप सर्वर पर PHP का उपयोग कर रहे हैं तो आप स्ट्रिंग्स, संख्याओं, सरणी और ऑब्जेक्ट्स को ठीक से एन्कोड किए गए JSON में बदलने के लिए json_encode() का उपयोग कर सकते हैं। अन्य बैक-एंड भाषाएं समान कार्य भी प्रदान कर सकती हैं।

2

मैं केवल जो कहा गया है, उसके लिए एक उच्च परिप्रेक्ष्य जोड़ता हूं, और यही वह है कि एसएसई प्रकाशित-सदस्यता मॉडल है क्योंकि AJAX के मामले में निरंतर मतदान के विपरीत।

आम तौर पर, दोनों तरीकों (मतदान और प्रकाशित-सदस्यता) ग्राहक को अप-टू-डेट स्थिति को बनाए रखने के तरीके को हल करने का प्रयास कर रहे हैं।

1) मतदान मॉडल

यह आसान है। ग्राहक (ब्राउज़र) को पहले प्रारंभिक स्थिति (पृष्ठ) प्राप्त होता है और इसके लिए अद्यतन करने के लिए, इसे समय-समय पर राज्य (पृष्ठ या उसके भाग) का अनुरोध करने की आवश्यकता होती है और परिणाम को वर्तमान स्थिति में संसाधित करने की आवश्यकता होती है (पूरे पृष्ठ को रीफ्रेश करें या इसे इंटेलिजेंट में प्रस्तुत करें AJAX के मामले में हिस्सा)।

स्वाभाविक रूप से, एक दोष यह है कि यदि सर्वर स्थिति के साथ कुछ भी नहीं होता है तो संसाधन (सीपीयू, नेटवर्क, ...) अनावश्यक रूप से उपयोग किए जाते हैं। एक और बात यह है कि अगर राज्य बदलता है तो ग्राहक इसे अगले चुनाव अवधि में ही प्राप्त करते हैं, न कि ASAP। अक्सर दो चीजों के बीच एक अच्छी अवधि के समय समझौता का मूल्यांकन करने की आवश्यकता होती है।

मतदान का एक और उदाहरण थ्रेडिंग में एक स्पिनवाइट है।

2) प्रकाशित करें: सदस्य बनने के मॉडल

यह काम करता है इस प्रकार है:

  • (ग्राहक पहले अनुरोध और (कुछ प्रारंभिक अवस्था)
  • क्लाइंट सर्वर का सदस्य बनता चलता साथ संभवतः एक अनुरोध भेजता है, घटना संदर्भ जैसे कुछ संदर्भ)
  • सर्वर क्लाइंट के संदर्भ को कुछ क्लाइंट संदर्भ भंडार
  • राज्य के अद्यतन के मामले में संदर्भित करता है, से rver क्लाइंट को संदर्भित क्लाइंट के संदर्भ के आधार पर एक अधिसूचना भेजता है; यानी यह एक अनुरोध के जवाब में लेकिन एक और के रूप में संदेश सर्वर
  • अच्छा ग्राहकों की सदस्यता समाप्त द्वारा शुरू की, जब वे कोई

यह SSE है, या एक waitable घटना सूत्रण में मिली सूचनाओं में अधिक रुचि रखते हैं, नहीं है उदाहरण। जैसा कि कहा गया है, एक प्राकृतिक दोष यह है कि सर्वर को अपने सभी सब्स्क्राइब किए गए ग्राहकों के बारे में पता होना चाहिए, जो कार्यान्वयन के आधार पर एक मुद्दा हो सकता है।

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