Server-Sent Events क्या हैं? स्ट्रीम, उपयोग और सीमाएँ

Server-Sent Events क्या हैं? स्ट्रीम, उपयोग और सीमाएँ

Scrapeless Agent Browser डायनेमिक वेबसाइटों के लिए ब्राउज़र ऑटोमेशन चलाता है, जिनके पेज server-sent events के माध्यम से अपडेट प्राप्त कर सकते हैं।

संक्षेप में

  • Server-sent events सर्वर से क्लाइंट तक अपडेट पहुँचाते हैं। स्ट्रीम एक द्विदिश मैसेजिंग चैनल के बजाय HTTP response ही बनी रहती है।
  • इवेंट सीमाएँ नेटवर्क chunks से अलग होती हैं। किसी consumer को टेक्स्ट को संदेश मानने से पहले event-stream फ़ॉर्मेट को पार्स करना होता है।
  • स्ट्रीमिंग के लिए एक स्पष्ट observation सीमा चाहिए। आपके कार्य के लिए आवश्यक जानकारी आ जाने के बाद भी कनेक्शन खुला रह सकता है।
  • केवल event IDs ठीक-एक-बार डिलीवरी की गारंटी नहीं देते। retention, replay और storage व्यवहार एप्लीकेशन कॉन्ट्रैक्ट का हिस्सा होते हैं।

Server-Sent Events एक एकतरफ़ा HTTP स्ट्रीम हैं

Server-sent events, जिन्हें अक्सर SSE कहा जाता है, सर्वर को लंबे समय तक चलने वाले HTTP response पर टेक्स्ट इवेंट्स की एक श्रृंखला भेजने देती हैं। क्लाइंट कनेक्शन खोलता है और सर्वर जैसे-जैसे अपडेट उपलब्ध होते हैं, उन्हें लिखता जाता है। कोई डैशबोर्ड जॉब की प्रगति प्राप्त कर सकता है या कोई पेज पूरे resource को हर बार दोबारा माँगे बिना धीरे-धीरे आउटपुट दिखा सकता है जब भी कुछ बदलता है।

यह HTML event-stream विनिर्देश इवेंट फ़ॉर्मेट और ब्राउज़र के EventSource इंटरफ़ेस दोनों को परिभाषित करता है। response media type text/event-stream, होता है और स्ट्रीम UTF-8 टेक्स्ट होती है। SSE को payload फ़ॉर्मेट के रूप में JSON की आवश्यकता नहीं होती। कोई एप्लीकेशन किसी इवेंट के data के अंदर serialized JSON रख सकता है, लेकिन उस JSON को पार्स करना इवेंट फ्रेमिंग के बाद का अलग चरण है।

SSE एप्लीकेशन मैसेजिंग लेयर पर एकतरफ़ा है। ब्राउज़र फिर भी स्ट्रीम खोलने वाला HTTP अनुरोध भेजता है, और वह उपयोगकर्ता क्रियाओं के लिए अलग अनुरोध भेज सकता है। स्वयं event stream सर्वर-से-क्लाइंट संदेशों को वहन करता है। यह अंतर SSE को सूचनाओं और प्रगति दिखाने के लिए उपयोगी बनाता है, जबकि कमांड्स को उनके अपने authorization और validation के साथ साधारण एप्लीकेशन endpoints पर रखता है।

कैसे इवेंट फ्रेमिंग टेक्स्ट को संदेशों में बदलती है

एक SSE संदेश line endings से अलग किए गए फ़ील्ड्स से बना होता है और एक खाली लाइन पर डिस्पैच होता है। data फ़ील्ड payload टेक्स्ट ले जाता है, event फ़ील्ड इवेंट टाइप का नाम दे सकता है, और id फ़ील्ड इवेंट पहचानकर्ता को अपडेट कर सकता है। कोलन से शुरू होने वाली पंक्तियाँ टिप्पणियाँ होती हैं। एक इवेंट में कई data पंक्तियाँ newline characters के साथ जोड़ी जाती हैं।

कोई network read किसी इवेंट के अनुरूप नहीं होता। कोई transport chunk किसी फ़ील्ड का हिस्सा, कई पूर्ण संदेश, या एक संदेश का अंत और दूसरे की शुरुआत शामिल कर सकता है। किसी कस्टम consumer को एक persistent टेक्स्ट डिकोडर और एक फ्रेमिंग बफ़र चाहिए। प्रत्येक आने वाले chunk को newline पर बाँट देना, बिना अधूरे टेक्स्ट को सुरक्षित रखे, character decoding और message सीमाओं दोनों को ख़राब कर सकता है।

कोई अनाम इवेंट EventSource में जेनरिक message handler तक पहुँचता है, जबकि नामित इवेंट अपना संबंधित event type इस्तेमाल करता है। एप्लीकेशन डेवलपरों को इन नामों और उनके payload आकारों का दस्तावेज़ बनाना चाहिए। प्रगति संदेश, किसी आइटम का अपडेट, और अंतिम completion संदेश को एक-दूसरे की तरह नहीं समझा जाना चाहिए। स्ट्रीम ट्रांसपोर्ट केवल इवेंट्स पहुँचाता है; प्रत्येक इवेंट का क्या अर्थ है, यह एप्लीकेशन पर निर्भर करता है।

EventSource और Fetch अलग-अलग इंटरफ़ेस प्रस्तुत करते हैं

EventSource वह ब्राउज़र API है जो event streams के लिए डिज़ाइन की गई है, जबकि Fetch एक अधिक सामान्य request और response इंटरफ़ेस प्रस्तुत करता है। EventSource किसी URL और सीमित विकल्पों के सेट को लेता है, न कि मनमाने request कॉन्फ़िगरेशन को। यह custom authorization headers सेट करने या request body भेजने के लिए सामान्य विकल्प प्रदान नहीं करता। यह तब मायने रखता है जब कोई API कॉन्ट्रैक्ट किसी विशेष header या POST अनुरोध की माँग करता है।

कोई Fetch-आधारित consumer streaming response bytes पढ़ सकता है और स्वयं event parsing लागू कर सकता है। web Streams API स्ट्रीम abstraction प्रदान करती है, लेकिन यह अपने आप किसी भी टेक्स्ट को सही तरह फ़्रेम किए गए SSE संदेशों में नहीं बदलती। Fetch का उपयोग करने वाले consumer को incremental decoding, message सीमाएँ, cancellation, और सेवा के एप्लीकेशन-स्तरीय completion सिग्नल का ध्यान रखना होता है।

इंटरफ़ेस endpoint कॉन्ट्रैक्ट के आधार पर चुनें। किसी सेवा को streaming के रूप में वर्णित किया जा सकता है, पर वह SSE के बजाय newline-delimited JSON, कोई custom binary फ़ॉर्मेट, या साधारण response टेक्स्ट भेज सकती है। parser चुनने से पहले response media type और फ्रेमिंग जाँचें। कोई विज़ुअल पेज जो धीरे-धीरे अपडेट होता है, यह साबित करने के लिए पर्याप्त नहीं कि SSE उपयोग हो रहा है: वे अपडेट SSE, WebSockets, polling, या पहले से डाउनलोड किए गए डेटा की client-side rendering के माध्यम से भी आ सकते हैं।

तंत्रदिशा और रूपसामान्य उपयोग
SSEHTTP response में सर्वर-से-क्लाइंट टेक्स्ट इवेंट्सप्रगति अपडेट और सूचनाएँ
WebSocketsस्थायी कनेक्शन पर द्विदिश संदेशबार-बार दो-तरफ़ा संदेशों वाले इंटरैक्टिव सत्र
Pollingबार-बार होने वाले request और response का आदान-प्रदानजहाँ ताज़गी की ज़रूरतें मध्यम हों, वहाँ कभी-कभार जाँच
Generic Fetch streamingएप्लीकेशन कोड द्वारा व्याख्यायित response bytesकस्टम स्ट्रीमिंग प्रोटोकॉल या request आवश्यकताएँ

जहाँ प्रॉक्सी और बफरिंग अनुभव को बदल देते हैं

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

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

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

इवेंट IDs डिलीवरी गारंटी को परिभाषित नहीं करते

एक इवेंट पहचानकर्ता एप्लिकेशन को अपनी स्ट्रीम में एक स्थिति का वर्णन करने का तरीका देता है। ब्राउज़र एक बाद के इवेंट‑स्ट्रीम कनेक्शन की स्थापना करते समय अंतिम इवेंट ID संप्रेषित कर सकता है, लेकिन एक पहचानकर्ता सर्वर को ऐतिहासिक डेटा बनाए रखने के लिए बाध्य नहीं करता। यह कि पहले से छूट गया इवेंट उपलब्ध कराया जा सकता है या एक समाप्त स्थिति को कैसे संभाला जाता है, सर्वर की रिटेन्शन और रिप्ले नीति तय करती है।

सटीक‑एक‑बार प्रोसेसिंग के लिए केवल एक ID प्राप्त करना पर्याप्त नहीं है। कोई एप्लिकेशन इवेंट प्राप्त कर सकता है और उसे सहेजने से पहले बंद हो सकता है, या इवेंट को सहेज सकता है लेकिन उसकी प्रोसेसिंग स्थिति दर्ज करने से पहले। टिकाऊ इनजेशन के लिए, एक इवेंट पहचान परिभाषित करें और स्टोरेज व्यवहार को स्पष्ट करें। डुप्लिकेट पता लगाना एप्लिकेशन के इवेंट अनुबंध का उपयोग करे, न कि यह मान ले कि पेलोड का दृश्य टेक्स्ट किसी इवेंट की अनूठी पहचान करता है।

किसी प्रगति संकेतक को अक्सर स्थायी इवेंट इतिहास की आवश्यकता नहीं होती। एक वित्तीय लेजर या ऑडिट लॉग की अलग आवश्यकताएँ होती हैं और उसे प्रलेखित, टिकाऊ इंटरफ़ेस का उपयोग करना चाहिए। कार्य को जिन रिकॉर्ड गारंटियों की आवश्यकता है, उनके आधार पर डेटा स्रोत चुनें। एक लाइव दृश्य फ़ीड किसी व्यक्ति को किसी प्रक्रिया का निरीक्षण करने में मदद कर सकती है, जबकि पूर्ण ऐतिहासिक डेटा सेट के एकमात्र स्रोत के रूप में अनुपयुक्त रह सकती है।

प्रमाणीकरण, उत्पत्ति, और संवेदनशील पेलोड

एक SSE एंडपॉइंट को अन्य एंडपॉइंट्स से अपेक्षित समान संसाधन प्राधिकरण लागू करना चाहिए। किसी उपयोगकर्ता की स्ट्रीम खोलने की क्षमता बैकएंड द्वारा प्रकाशित किए जा सकने वाले हर इवेंट को अधिकृत नहीं करती। कॉलर के लिए संदेशों को फ़िल्टर करें और सर्वर की सब्सक्रिप्शन लॉजिक में टेनेंट सीमाएँ बनाए रखें। केवल EventSource के सीमित कॉन्फ़िगरेशन विकल्पों के आसपास काम करने के लिए किसी स्ट्रीम URL में सीक्रेट्स न रखें।

क्रॉस‑उत्पत्ति स्ट्रीम्स भी ब्राउज़र एक्सेस नियमों के अधीन होती हैं। Fetch origin and credentials model यह नियंत्रित करता है कि CORS और क्रेडेंशियल्स ब्राउज़र अनुरोधों के साथ कैसे इंटरैक्ट करते हैं। यदि ब्राउज़र किसी प्रतिक्रिया को कॉलिंग पेज के लिए उजागर नहीं कर सकता, तो सफल सर्वर प्रतिक्रिया पर्याप्त नहीं है। जहाँ क्रेडेंशियल्स का उपयोग होता है, वास्तविक क्लाइंट के अनुरूप अनुमत origin और क्रेडेंशियल हैंडलिंग कॉन्फ़िगर करें।

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

वह एप्लिकेशन स्टेट निरीक्षण करें जिसकी आपको वास्तव में आवश्यकता है

किसी ब्राउज़र ऑटोमेशन कार्य को सभी नेटवर्क गतिविधि के समाप्त होने की प्रतीक्षा करने की बजाय किसी सार्थक पेज स्टेट पर रुकना चाहिए। किसी पेज के जीवनकाल के लिए एक SSE कनेक्शन खुला रह सकता है। सीमित डेटा संग्रह के लिए, प्रासंगिक सेलेक्टर, पूर्णता लेबल, रिकॉर्ड पहचान या अवलोकन विंडो परिभाषित करें। स्थायी स्ट्रीम वाले पेज के लिए नेटवर्क‑निष्क्रिय स्थिति कभी भी पूर्णता का प्रतिनिधित्व नहीं कर सकती।

Scrapeless Agent Browser पेज नेविगेशन और इंटरैक्शन के लिए ब्राउज़र परिवेश प्रदान करता है। Agent Browser overview उस परिवेश का वर्णन करता है; यह हर इवेंट‑स्ट्रीम एंडपॉइंट को प्रबंधित टिकाऊ निर्यात नहीं बनाता। सिस्टम का निदान करते समय ब्राउज़र के नियंत्रण कनेक्शन को लक्ष्य पेज की SSE ट्रैफ़िक से अलग रखें। वे अलग‑अलग उद्देश्यों की पूर्ति करते हैं और अलग नेटवर्क पाथ का अनुसरण कर सकते हैं।

एक उपयोगी काल्पनिक प्रगति कार्य किसी सार्वजनिक जॉब पेज को तब तक देखता है जब तक उसका पूर्णता लेबल दिखाई न दे, फिर दृश्य परिणाम सारांश पढ़ता है। ऑटोमेशन रिकॉर्ड करता है कि क्या पूर्णता अवलोकन विंडो के भीतर दिखाई दी। यह यह निष्कर्ष नहीं निकालता कि हर आंतरिक प्रगति इवेंट संग्रहीत था। संबंधित WebSocket messaging concepts समझाते हैं कि जब एप्लिकेशन को बार‑बार दो‑तरफ़ा इंटरैक्शन की आवश्यकता होती है, तो एक अलग द्विदिश चैनल बेहतर विकल्प क्यों हो सकता है।

निर्णय करें कि SSE उत्पाद आवश्यकता के अनुरूप है या नहीं

SSE उन इंटरफ़ेसों के लिए उपयुक्त है जहाँ सर्वर के पास डिलीवर करने के लिए अपडेट होते हैं और क्लाइंट मुख्य रूप से सुनता है। यह स्टेटस फ़ीड्स, सूचनाओं और क्रमिक पाठ के लिए व्यावहारिक विकल्प है, बशर्ते कि कनेक्शन और बफ़रिंग व्यवहार डिप्लॉयमेंट के अनुरूप हों। जब एप्लिकेशन को टिकाऊ बल्क एक्सपोर्ट, मनमाना दो‑तरफ़ा मैसेजिंग, या ऐसा अनुरोध आकार चाहिए जिसे चुना गया SSE क्लाइंट व्यक्त नहीं कर सकता, तो किसी अलग इंटरफ़ेस को प्राथमिकता दें।

SSE अपनाने से पहले, संदेश प्रकार, प्राधिकरण स्कोप, पूर्णता व्यवहार, रिटेन्शन अपेक्षाएँ और संसाधन सफ़ाई को लिख लें। ब्राउज़र अवलोकनों का बजट बनाते समय Scrapeless pricing अलग से समीक्षा करें। एक सुदृढ़ डिज़ाइन सत्र द्वारा उत्पन्न उपयोगी कार्य को मापता है और जब वह कार्य पूरा हो जाए तो कनेक्शन बंद कर देता है, बजाय इसके कि अनिश्चित काल तक खुला पेज सफल संग्रह माना जाए।

निष्कर्ष

जब किसी पेज को सर्वर-उत्पन्न टेक्स्ट अपडेट की आवश्यकता हो और एप्लिकेशन उनके अर्थ और जीवनचक्र को परिभाषित कर सके, तब SSE का उपयोग करें। स्ट्रीम पर निर्भर होने से पहले फ्रेमिंग, ओरिजिन नियमों, बफरिंग और डिलीवरी अपेक्षाओं को मान्य करें। ब्राउज़र ऑब्ज़र्वेशन के लिए, निर्धारित सीमा के भीतर आवश्यक स्थिति एकत्र करें और जैसे ही वह ऑब्ज़र्वेशन पूरा हो जाए, सत्र बंद कर दें।

अपना वेब डेटा वर्कफ़्लो बनाएं

स्पष्ट पूर्णता शर्तों और सीमित ऑब्ज़र्वेशन स्कोप के साथ डायनेमिक पेजों का निरीक्षण करने के लिए Agent Browser का उपयोग करें।

आज ही साइन अप करें और पाएं $5 का निःशुल्क क्रेडिट — क्रेडिट कार्ड की आवश्यकता नहीं.

अपना $5 क्रेडिट प्राप्त करें →

अक्सर पूछे जाने वाले प्रश्न (FAQ)

क्या सर्वर‑सेंट इवेंट्स WebSockets के समान हैं?

सर्वर‑सेंट इवेंट्स और WebSockets अलग मैसेजिंग मॉडल प्रदान करते हैं। SSE HTTP रिस्पॉन्स के माध्यम से सर्वर से क्लाइंट तक टेक्स्ट इवेंट्स भेजता है। WebSockets द्विदिश मैसेजिंग का समर्थन करते हैं। इनके बीच चयन एप्लिकेशन की दिशा, फ्रेमिंग, जीवनचक्र और डिलीवरी आवश्यकताओं के आधार पर करें, न कि इसके इंटरफ़ेस की दिखावट के आधार पर।

क्या SSE में हमेशा JSON होता है?

SSE को JSON की आवश्यकता नहीं होती। इसका data फ़ील्ड टेक्स्ट रखता है, जिसे एप्लिकेशन JSON या किसी अन्य टेक्स्ट रेप्रेज़ेंटेशन के रूप में एन्कोड करना चुन सकता है। पहले event-stream फ्रेमिंग को पार्स करें, फिर प्रत्येक पेलोड की व्याख्या endpoint की प्रलेखित स्कीमा का उपयोग करके करें।

क्या EventSource Authorization हेडर सेट कर सकता है?

नेटिव EventSource कंस्ट्रक्टर एक सामान्य कस्टम‑हेडर विकल्प प्रदान नहीं करता। जिस endpoint को Authorization हेडर की आवश्यकता होती है, उसे संगत क्लाइंट दृष्टिकोण की जरूरत होगी, जैसे कि सही SSE पार्सर वाला Fetch‑आधारित स्ट्रीम कंज़्यूमर। प्रमाणीकरण विधि को सेवा अनुबंध के अनुरूप रखें।

क्या इवेंट ID पूरी इवेंट हिस्ट्री की गारंटी देते हैं?

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

SSE‑चालित ब्राउज़र पेज कब समाप्त होता है?

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

संदर्भ