2016-07-10 20 views
7

के माध्यम से लंबे मतदान के लिए सर्वर-साइड प्रतिक्रियाओं का कार्यान्वयन कहें कि आप एक सर्वर "कमरे" के लिए HTTP पर एक आरईएसटी एपीआई डिज़ाइन कर रहे हैं, जहां सदस्यता लेने वाले ग्राहक कमरे में होने वाली सार्वजनिक घटनाओं की निगरानी करना चाहते हैं (उदाहरण के लिए एक नया प्रतिभागी कमरे में शामिल होता है , एक और कमरा कमरे छोड़ देता है, और इसी तरह ...) लंबे मतदान अनुरोध करके।आरईएसटी एपीआई

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

क्या कोई ट्यूटोरियल, उदाहरण, इंटरनेट पर कुछ सिद्धांत ऐसे एपीआई को डिजाइन करने के बारे में हैं और सभी चीजें जिन्हें सर्वर परिप्रेक्ष्य से ध्यान में रखा जाना चाहिए?

+0

जिज्ञासा से, आप HTTP और लंबे मतदान का उपयोग क्यों करना चाहते हैं? क्या आपका सिस्टम प्रशासक/प्रबंधक आपको मजबूर कर रहा है? क्योंकि websockets का उपयोग करके इसे लागू करना बहुत आसान है। –

+0

हाँ, किसी भी तरह से "मजबूर", कहें कि यह एक आवश्यकता है – Martin

+0

AJAX रिवर्स के बारे में कैसे? – asprin

उत्तर

1

बहुत छोटा जवाब - क्यों न केवल EventStore का उपयोग करें?

संक्षिप्त उत्तर - क्यों नहीं reference implementation के रूप में इवेंट स्टोर का उपयोग करें, और अपनी कार्यान्वयन बाधाओं से मेल खाने के लिए their solution अनुकूलित करें?

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

REST स्वयं ही कुछ दिशानिर्देश प्रदान करता है। सर्वर पर संग्रहीत कोई आवेदन स्थिति नहीं होनी चाहिए; क्लाइंट द्वारा भेजे गए संदेश में किसी क्लाइंट साइड स्टेट (जैसे ईवेंट स्ट्रीम में वर्तमान स्थिति) शामिल होना चाहिए, जिसे सर्वर को अनुरोध पूरा करने की आवश्यकता होगी। अनुरोध में पहचाना गया संसाधन एक अमूर्त है - इसलिए क्लाइंट संदेश भेज सकता है, उदाहरण के लिए "घटना 7 के बाद आने वाली घटना", जो समझ में आता है भले ही वह अगला ईवेंट अभी तक मौजूद न हो। कैश के माध्यम से स्केलिंग और सर्वर के नियंत्रण के बाहर की तरह अनुमति देने के लिए वर्दी इंटरफ़ेस का सम्मान किया जाना चाहिए। संसाधन की स्थिति का प्रतिनिधित्व हाइपर्मियाडिया होना चाहिए, नियंत्रण के साथ जो क्लाइंट को वर्तमान में उपलब्ध संदेशों का उपभोग करने के बाद अग्रिम करने की अनुमति देता है।

HTTP कुछ और विशिष्टताओं में फेंकता है। चूंकि सर्वर पर क्लाइंट स्टेटस की कोई ट्रैकिंग नहीं है, इसलिए कतार से पढ़ना एक सुरक्षित संचालन है। इसलिए, सुरक्षित HTTP विधियों में से एक (जीईटी, सटीक होना) पढ़ने के लिए इस्तेमाल किया जाना चाहिए। चूंकि जीईटी वास्तव में अनुरोध में सामग्री निकाय का समर्थन नहीं करता है, इसलिए सर्वर को जो जानकारी चाहिए उसे सभी अनुरोध के शीर्षलेख में पैक किया जाना चाहिए।

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

Atom Syndication इवेंट प्रोसेसिंग के लिए एक अच्छा हाइपरमीडिया प्रारूप प्रदान करता है - इवेंट स्ट्रीम मैप्स एक फीड, इवेंट्स के लिए ईवेंट मैप।

अपने आप से, वे टुकड़े आपको एक ईवेंट प्रोसेसर पर एक बड़ा सिर शुरू करते हैं जो आरईएसटी वास्तुशिल्प बाधाओं के अनुरूप है। आप बस पर लंबे मतदान को बोल्ट करने की आवश्यकता है।

माइकल बार्कर (LMAX Disruptor के रखरखाव) द्वारा लिखे गए ticketing demo पर आप एक अनुमान लगा सकते हैं कि आप अपने आप पर लंबे मतदान को कैसे लागू कर सकते हैं।

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

मुझे अंगूठी बफर के रूप में घटनाओं के स्थानीय कैश के बारे में सोचना पड़ता है (जैसे विघटनकर्ता स्वयं, लेकिन लेखक धागे के लिए निजी)। लेखक धागा घटना स्ट्रीम में प्रत्येक ग्राहक की स्थिति (HTTP अनुरोध में जानकारी से) जानता है। रिंग बफर में वर्तमान पॉइंटर की तुलना में उस स्थिति की तुलना में, प्रत्येक लंबित अनुरोध को वर्गीकृत किया जा सकता है

सुदूर पिछला ग्राहक जिस स्थिति की तलाश कर रहा है उसे पहले से ही कैश से निकाल दिया गया है। क्लाइंट को स्ट्रीम में उस स्थान की "ठंड" लगातार प्रतिलिपि पर रीडायरेक्ट करें, जहां यह वर्तमान तक पहुंचने के लिए हाइपरमीडिया नियंत्रणों का पालन कर सकता है।

हालिया पिछला ग्राहक जो स्थिति खोज रहा है वह वर्तमान में कैश में उपलब्ध है, इसलिए तुरंत उपलब्ध घटनाओं के साथ ग्राहक को प्रतिक्रिया दें, और उस प्रतिक्रिया को प्रेषित करें।

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

सुदूर भविष्य स्थिति यह है कि ग्राहक की मांग है कैश में उपलब्ध नहीं है, और हम नहीं आशा करते हैं कि हम आवंटित समय में अनुरोध को पूरा करने में सक्षम होंगे करते । तो हम अभी जवाब देते हैं, और ग्राहक को यह तय करने दें कि क्या करना है।

(यदि आपको पर्याप्त मतदान क्लाइंट मिलते हैं जिन्हें आपको लंबे मतदान सर्वर को स्केल करना शुरू करना है, तो आपको उस मामले पर विचार करने की आवश्यकता है जहां वे सर्वर सिंक हो जाते हैं, और क्लाइंट को एक तेज सर्वर से निर्देशित किया जाता है पीछे गिर गया। तो आप इस जगह पर वाद्य यंत्र रखना चाहते हैं जो आपको यह ट्रैक करने देता है कि यह कितनी बार हो रहा है, ताकि आप उचित उपाय लागू कर सकें)।

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

1

सरल, ग्राहक को प्राप्त अंतिम संदेश के टाइमस्टैम्प (या आईडी, या अनुक्रमणिका) में पास है।

GET /rooms/5/messages रिटर्न सभी संदेशों को सर्वर के बारे में जानता है, का निवेदन तरह

[ 
    { 
    "message": "hello", 
    "timestamp": "2016-07-18T18:44:34Z" 
    }, 
    { 
    "message": "world", 
    "timestamp": "2016-07-18T18:47:16Z" 
    } 
] 

ग्राहक तो लंबे समय से चुनाव सर्वर GET /rooms/5/messages?since=2016-07-18T18:47:16Z जो उस समय के बाद या तो सभी संदेश देता है (यदि कोई हो तो) या ब्लॉक जब तक साथ कमरे में एक नया संदेश है।

0

I दृढ़ता से वेबसाकेट का उपयोग करने की सलाह देते हैं। socket.io देखें। लंबे मतदान एक हैक है जो आवश्यक रूप से वांछनीय नहीं है और वास्तव में "समर्थित" नहीं है।

0

लंबे मतदान एक अच्छा विचार नहीं है। विशेष रूप से जब कोई सर्वर पक्ष में होने वाले परिवर्तनों की निगरानी करना चाहता है। ऐसे तंत्र हैं जहां सर्वर परिवर्तनों के लिए ग्राहकों को सूचनाएं भेजता है। इसका उपयोग करके हासिल किया जा सकता है, क्योंकि पहले से ही gcoreb का उल्लेख किया गया है, Socket.io (Nodejs स्टैक) या सिग्नलआर (.net स्टैक)।

1

सभी घटनाओं के साथ संदर्भ संख्या भेजें। क्लिंट प्राप्त नवीनतम घटना के संदर्भ संख्या के साथ कॉल करेगा। यदि कोई ईवेंट उपलब्ध नहीं है और नए संदर्भ संख्या के साथ एक बार ईवेंट उपलब्ध हो तो आप लंबे मतदान अनुरोध को अवरुद्ध करेंगे। मामले की घटनाओं में पहले से ही उपलब्ध हैं, यह अनुरोध संदर्भ संख्या घटना के बाद उत्पन्न सभी घटनाओं को वापस कर देगा।

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