2010-06-22 18 views
11

एसओए में हमें क्लाइंट और सर्वर के बीच राज्य (या निर्भर निर्भरता) का निर्माण या धारण नहीं करना चाहिए। यह समझा जाता है। लेकिन इस मामले में क्या पैटर्न का पालन किया जा सकता है कि कोई ग्राहक वास्तविक समय की सेवा का उपभोग करना चाहता है जो 'पंक्तियों' की खुली समाप्ति संख्या वापस कर सकता है?एसओए/वेब सेवा पेजिनेशन

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

यदि हम वेब सेवाओं के लिए पेजिनेशन जैसी परिदृश्यों पर विचार करना चाहते हैं, तो ये कौन से पैटर्न पालन करेंगे जो अभी भी एसओए के सिद्धांतों का पालन करने की अनुमति देगा (या जितना संभव हो सके करीब)।

विचारकों के लिए कुछ नियम: 1) एक SQL डेटाबेस के समर्थन से (इसलिए) एक सेट का चयन में एक पंक्ति संख्या की कोई अवधारणा) 2 यह लगातार छोड़ सकते हैं या एक में एक पंक्ति नकल नहीं करने के लिए महत्वपूर्ण है पृष्ठांकन 3) डाटा डाला जा सकता है के दौरान सेट और अन्य ग्राहकों 4) डाटासेट एक जीवित (अद्यतन करने योग्य) डाटासेट

व्यक्तिगत रूप से विचार करने के लिए कोई जरूरत नहीं है द्वारा डेटाबेस में किसी भी समय नष्ट कर दिया, मुझे लगता है कि 1 और 2 ऊपर से पहले समाधान के साथ समाधान स्थान को बाधित करके हमारे समाधान को वर्तनी देते हैं।

मेरे प्रस्तावित समाधान में डेटा (जितना अधिक चुना जाता है) को केवल पढ़ने के लिए स्टोर/कैश में संग्रहीत किया जाएगा जहां इसे परिणाम सेट में पंक्ति संख्या असाइन की जा सकती है और इस डेटा स्नैपशॉट पर पेजिनेशन होने की अनुमति दी जा सकती है। स्नैपशॉट्स (सर्वर, बाहरी कैश, memcached या ehcache स्टोर करने के लिए मेरे पास बुनियादी ढांचा होगा - यह काफी बड़ा होना चाहिए)। ऐसी क्वेरी का परिणाम स्नैपशॉट आईडी होगा और स्नैपशॉट एपीआई (वेब ​​सेवाएं) और स्नैपशॉट आईडी का उपयोग करके स्नैपशॉट से डेटा पुनर्प्राप्त कर सकते हैं। परिणामों को केवल पढ़ने के लिए, एक्स रिकॉर्ड के लिए केवल एक ही समय में संसाधित किया जाएगा, जहां एक्स कुछ उचित था।

प्रतिस्पर्धी विचार और विचार, आलोचना या प्रशंसा की सराहना की जाएगी।

+0

मैं आपको बताऊंगा कि ट्विटर कैसे उनके अंकन को संभालता है। यह आपकी मदद की हो सकती है https://dev.twitter.com/rest/public/timelines –

उत्तर

0

वेब सेवा में पृष्ठित परिणाम वास्तव में हासिल करना काफी आसान है।

आपको बस वेब सेवा कॉल में दो पैरामीटर जोड़ना है: पृष्ठ का आकार, पृष्ठ संख्या।

पृष्ठ का आकार किसी पृष्ठ में शामिल करने के परिणामों की संख्या है। पृष्ठ संख्या उन परिणामों के पृष्ठ की संख्या है जिन्हें आप ढूंढ रहे हैं।

आपकी वेब सेवा तब डेटाबेस (या कैश) पर वापस जाती है, परिणामों को वापस लेती है, आंकड़े बताती हैं कि कौन से परिणाम अनुरोधित पृष्ठ पर फिट होते हैं, और केवल उन परिणामों को वापस करते हैं।

क्लाइंट को सेवा से इच्छित परिणामों के प्रति पृष्ठ एक ही अनुरोध करना होगा।

+1

धन्यवाद - लेकिन आवश्यकताओं को पूरा नहीं करता है। डेटाबेस पर वापस जाने से लगातार परिणाम नहीं मिलते हैं, डेटा को जोड़ा जा सकता है, हटाया जा सकता है या कॉल के बीच बदल दिया जा सकता है जो स्थिरता को मुश्किल बनाता है। आप पंक्तियों को इस तरह से छोड़ सकते हैं क्योंकि डेटा ऊपर हटा दिया गया था। अगर सॉर्ट मानदंड हमें अद्वितीय नहीं है तो आप अनुक्रम की गारंटी भी नहीं दे सकते हैं। याद रखें, मैं ऐसे पैटर्न की तलाश में हूं जो मैं वैश्विक स्तर पर लागू कर सकता हूं जो इन समस्याओं को हल करता है। हालांकि, कोशिश अच्छी थी। – cmdematos

0

जो आप memcached के साथ प्रस्तावित करते हैं वह कैशिंग तालिका के साथ भी काम करेगा। पहली सेवा कॉल (1) INSERT परिणाम स्नैपशॉट आईडी (2) के साथ कैशिंग तालिका में कैशिंग तालिका और स्नैपशॉट आईडी से पहला पृष्ठ लौटाएगा। बाद की कॉल स्नैपशॉट आईडी का उपयोग कर कैशिंग तालिका से पूछकर पृष्ठ आकार और पृष्ठ संख्या के आधार पर पृष्ठों को वापस कर देगी।

मुझे यह सोचना चाहिए कि इसे एक मेमोरी कैशिंग तालिका का उपयोग करके भी अनुकूलित किया जा सकता है, लेकिन यह इस बात पर निर्भर करता है कि आपका डेटाबेस डिस्क तालिका से INSERT-INTO को इन-मेमोरी तालिका में समर्थन करता है या नहीं। हालांकि यह एक क्लस्टर पर्यावरण में जटिल हो सकता है।

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

1

एसओए ऐसी निम्न स्तर की कार्यक्षमता के लिए नहीं है।

एसओए व्यापार क्षेत्रों के साथ गोंद करने के लिए है, बैकएंड के लिए आगे नहीं। ऐसा नहीं है क्योंकि आपका एप्लिकेशन वेबसाइसेस का उपयोग करके बैक एंड पर बात करता है, आपके पास "एसओए" एप्लिकेशन है। यह गैर-समझ में नहीं है क्योंकि एसओए 1 पृथक प्रणाली के संदर्भ में व्यर्थ है।

उस बिंदु से, यह स्पष्ट है कि, एसओए में, कॉलर को उस SQL ​​तालिका के बारे में पता नहीं होना चाहिए था जिसे आप पेजिंग कर रहे हैं, यह कार्यान्वयन विस्तार है कि एसओए को छिपाना चाहिए। दूसरी तरफ सर्वर को ग्राहक के राज्य के बारे में पता नहीं होना चाहिए, क्योंकि यह वास्तव में खुला होने के लिए ग्राहकों के ब्योरे के लिए अज्ञेयवादी होना चाहिए।

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

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

... तो हो सकता है कि आपने सभी मामलों के लिए तालिका में सीधे SQL पहुंच प्रदान की हो।

एसओए सिस्टम के बीच व्यावसायिक संदेशों के लिए है, बैकएंड में किसी एप्लिकेशन के अग्रभाग को चिपकाने के लिए नहीं।

+0

मैं नीचे वोट में एक टिप्पणी की सराहना करता हूं। अगर यह मेरे लेखन के कारण था, तो मुझे बहुत खेद है, फिर भी एक टिप्पणी मददगार होगी। अगर ऐसा इसलिए था क्योंकि आप मानते हैं कि एसओए में अंकन ठीक है, तो कृपया जांचें, ऐसा नहीं है। मेरा सुझाव है: http://blogs.msdn.com/b/rogerwolterblog/archive/2006/04/20/580353.aspx –

0

समान समस्या, नौसेना दृष्टिकोण का उपयोग करके हल किया गया।

$ws->getList($first_record_id, $limit) 

यह है कि पारित कर दिया आईडी

select * from collection where collection.id > $first_record_id ASC limit $limit 

आईडी एएससी द्वारा आदेश दिया से शुरू $ सीमा तत्व का एक पेज लौट (प्रत्येक तत्व एक कुंजी है), लेकिन MySQL में

Navision कुंजी का उपयोग एक autoincrement आईडी बेहतर है।

इस मामले पृष्ठांकन में संभाल बड़े परिणाम सेट के लिए और एक दृश्यपटल पृष्ठांकन के लिए नहीं करना है ...

0

मुझे यकीन है कि अगर एसओए यहाँ चिंता का विषय है नहीं कर रहा हूँ। आपके एपीआई को पेजिंग करने के साथ आपके पास समस्या है। मैं आपको बताऊंगा कि कैसे ट्विटर अपने पेजिनेशन को नियंत्रित करता है dev.twitter.com/rest/public/timelines

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