बहुत छोटा जवाब - क्यों न केवल EventStore का उपयोग करें?
संक्षिप्त उत्तर - क्यों नहीं reference implementation के रूप में इवेंट स्टोर का उपयोग करें, और अपनी कार्यान्वयन बाधाओं से मेल खाने के लिए their solution अनुकूलित करें?
सर्वर पक्ष के दृष्टिकोण से इसे लागू करने का सबसे अच्छा तरीका क्या है ताकि ग्राहक लगातार चुनावों के बीच किसी भी घटना को याद न करे? उदाहरण के लिए, क्या सर्वर को उन घटनाओं की कतार लागू करनी चाहिए, जिन्हें कतार में मौजूद होना चाहिए जब तक कि सभी ग्राहकों को उन्हें प्राप्त न हो जाए?
REST स्वयं ही कुछ दिशानिर्देश प्रदान करता है। सर्वर पर संग्रहीत कोई आवेदन स्थिति नहीं होनी चाहिए; क्लाइंट द्वारा भेजे गए संदेश में किसी क्लाइंट साइड स्टेट (जैसे ईवेंट स्ट्रीम में वर्तमान स्थिति) शामिल होना चाहिए, जिसे सर्वर को अनुरोध पूरा करने की आवश्यकता होगी। अनुरोध में पहचाना गया संसाधन एक अमूर्त है - इसलिए क्लाइंट संदेश भेज सकता है, उदाहरण के लिए "घटना 7 के बाद आने वाली घटना", जो समझ में आता है भले ही वह अगला ईवेंट अभी तक मौजूद न हो। कैश के माध्यम से स्केलिंग और सर्वर के नियंत्रण के बाहर की तरह अनुमति देने के लिए वर्दी इंटरफ़ेस का सम्मान किया जाना चाहिए। संसाधन की स्थिति का प्रतिनिधित्व हाइपर्मियाडिया होना चाहिए, नियंत्रण के साथ जो क्लाइंट को वर्तमान में उपलब्ध संदेशों का उपभोग करने के बाद अग्रिम करने की अनुमति देता है।
HTTP कुछ और विशिष्टताओं में फेंकता है। चूंकि सर्वर पर क्लाइंट स्टेटस की कोई ट्रैकिंग नहीं है, इसलिए कतार से पढ़ना एक सुरक्षित संचालन है। इसलिए, सुरक्षित HTTP विधियों में से एक (जीईटी, सटीक होना) पढ़ने के लिए इस्तेमाल किया जाना चाहिए। चूंकि जीईटी वास्तव में अनुरोध में सामग्री निकाय का समर्थन नहीं करता है, इसलिए सर्वर को जो जानकारी चाहिए उसे सभी अनुरोध के शीर्षलेख में पैक किया जाना चाहिए।
दूसरे शब्दों में, यूआरआई का उपयोग ईवेंट स्ट्रीम में क्लाइंट की वर्तमान स्थिति निर्दिष्ट करने के लिए किया जाता है।
Atom Syndication इवेंट प्रोसेसिंग के लिए एक अच्छा हाइपरमीडिया प्रारूप प्रदान करता है - इवेंट स्ट्रीम मैप्स एक फीड, इवेंट्स के लिए ईवेंट मैप।
अपने आप से, वे टुकड़े आपको एक ईवेंट प्रोसेसर पर एक बड़ा सिर शुरू करते हैं जो आरईएसटी वास्तुशिल्प बाधाओं के अनुरूप है। आप बस पर लंबे मतदान को बोल्ट करने की आवश्यकता है।
माइकल बार्कर (LMAX Disruptor के रखरखाव) द्वारा लिखे गए ticketing demo पर आप एक अनुमान लगा सकते हैं कि आप अपने आप पर लंबे मतदान को कैसे लागू कर सकते हैं।
माइकल के डेमो में मूल साजिश यह है कि एक लेखक धागा ट्रैकिंग कर रहा है (ए) वर्तमान में सभी क्लाइंट अपडेट के लिए इंतजार कर रहे हैं और (बी) घटनाओं का स्थानीय कैश।वह धागा घटनाओं का एक बैच पढ़ता है, यह पहचानता है कि किन अनुरोधों को अधिसूचित करने की आवश्यकता है, बदले में उन अनुरोधों में से प्रत्येक का जवाब देता है, और फिर घटनाओं के अगले बैच को संसाधित करने की प्रगति करता है।
मुझे अंगूठी बफर के रूप में घटनाओं के स्थानीय कैश के बारे में सोचना पड़ता है (जैसे विघटनकर्ता स्वयं, लेकिन लेखक धागे के लिए निजी)। लेखक धागा घटना स्ट्रीम में प्रत्येक ग्राहक की स्थिति (HTTP अनुरोध में जानकारी से) जानता है। रिंग बफर में वर्तमान पॉइंटर की तुलना में उस स्थिति की तुलना में, प्रत्येक लंबित अनुरोध को वर्गीकृत किया जा सकता है
सुदूर पिछला ग्राहक जिस स्थिति की तलाश कर रहा है उसे पहले से ही कैश से निकाल दिया गया है। क्लाइंट को स्ट्रीम में उस स्थान की "ठंड" लगातार प्रतिलिपि पर रीडायरेक्ट करें, जहां यह वर्तमान तक पहुंचने के लिए हाइपरमीडिया नियंत्रणों का पालन कर सकता है।
हालिया पिछला ग्राहक जो स्थिति खोज रहा है वह वर्तमान में कैश में उपलब्ध है, इसलिए तुरंत उपलब्ध घटनाओं के साथ ग्राहक को प्रतिक्रिया दें, और उस प्रतिक्रिया को प्रेषित करें।
भविष्य के पास ग्राहक जिस स्थिति की तलाश कर रहा है वह कैश में उपलब्ध नहीं है, लेकिन लेखक एसएलए की समाप्ति से पहले उस अनुरोध को पूरा करने में सक्षम होने का अनुमान लगाता है। इसलिए जब तक अधिक घटनाएं नहीं आतीं तब तक हम क्लाइंट को पार्क करते हैं।
सुदूर भविष्य स्थिति यह है कि ग्राहक की मांग है कैश में उपलब्ध नहीं है, और हम नहीं आशा करते हैं कि हम आवंटित समय में अनुरोध को पूरा करने में सक्षम होंगे करते । तो हम अभी जवाब देते हैं, और ग्राहक को यह तय करने दें कि क्या करना है।
(यदि आपको पर्याप्त मतदान क्लाइंट मिलते हैं जिन्हें आपको लंबे मतदान सर्वर को स्केल करना शुरू करना है, तो आपको उस मामले पर विचार करने की आवश्यकता है जहां वे सर्वर सिंक हो जाते हैं, और क्लाइंट को एक तेज सर्वर से निर्देशित किया जाता है पीछे गिर गया। तो आप इस जगह पर वाद्य यंत्र रखना चाहते हैं जो आपको यह ट्रैक करने देता है कि यह कितनी बार हो रहा है, ताकि आप उचित उपाय लागू कर सकें)।
विचार करने के लिए कुछ किनारे के मामले भी हैं - यदि एक बहुत बड़ा बैच आता है, तो आपको उन घटनाओं को बेदखल करने की आवश्यकता हो सकती है जब आप उन्हें भेजने का मौका मिलने से पहले अपने ग्राहकों की प्रतीक्षा कर रहे हैं।
जिज्ञासा से, आप HTTP और लंबे मतदान का उपयोग क्यों करना चाहते हैं? क्या आपका सिस्टम प्रशासक/प्रबंधक आपको मजबूर कर रहा है? क्योंकि websockets का उपयोग करके इसे लागू करना बहुत आसान है। –
हाँ, किसी भी तरह से "मजबूर", कहें कि यह एक आवश्यकता है – Martin
AJAX रिवर्स के बारे में कैसे? – asprin