2009-06-13 3 views
5

मेरे आवेदन में, हमारे पास getFoo() नामक एक webservice विधि है जो एक Foo ऑब्जेक्ट देता है। getFoo() विधि को कई सौ बार एक दूसरे कहा जाता है। अपाचे सीएक्सएफ का उपयोग कर फू ऑब्जेक्ट को हमारे जावा ऑब्जेक्ट से एसओएपी एक्सएमएल प्रतिक्रिया में मार्शल किया गया है।प्रदर्शन को बेहतर बनाने के लिए किसी विशेष जावा ऑब्जेक्ट के लिए अपाचे सीएक्सएफ द्वारा उत्पन्न किए गए मार्शल किए गए SOAP XML को कैश कैसे किया जा सकता है?

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

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

संपादित करें (6/16/09): एक कस्टम BareOutInterceptor बनाने और इंटरसेप्टर श्रृंखला को संशोधित करने के लिए कस्टम एक कॉल करने के लिए से कुछ प्रगति की है। कस्टम केवल कुछ लिखने के लिए कुछ अतिरिक्त तर्क जोड़ता है जो "writeParts (....)" विधि को कॉल करता है जो किसी दिए गए जावा ऑब्जेक्ट के लिए केवल एक बार मार्शलिंग करता है। समाधान समाप्त हो जाएगा एक बार समाप्त हो जाएगा। इसके अलावा, मैंने सवाल का नाम बदल दिया।

+0

क्या एसओ पर एक अपाचे सीएक्सएफ विशेषज्ञ है जो हमें बता सकता है कि आउटबाउंड इंटरसेप्टर श्रृंखला में कस्टम मार्शलर को कैसे जोड़ना है? –

उत्तर

3

ठीक है, बिल्कुल सही उत्तर नहीं जिसे आप ढूंढ रहे हैं, लेकिन वैसे भी: कारण है कि आरईएसटी का उपयोग वेबसाइकिलों में उच्च यातायात (जैसे Google) के साथ किया जाता है, यह है कि आरईएसटी को कैशबल होने के लिए डिज़ाइन किया गया है - जबकि एसओएपी अभी तक डिज़ाइन नहीं किया गया है कैचबल हो

एसओएपी मूल रूप से (प्रति HTTP परिभाषा) गैर-कैशबल POST अनुरोधों पर आधारित है, और आरईएसटी जीईटी का उपयोग करता है - जो कैश करना आसान है।

आपको वास्तविक वेबसाइट पर जाने से पहले एसओएपी (POST) अनुरोध का निरीक्षण करना होगा - यानी प्रॉक्सी का उपयोग करना। "मानक" प्रॉक्सी आमतौर पर एसओएपी वाक्यविन्यास से अनजान हैं।

IBM's WebSphere Application Server though can do that

सादर, ओलाफ

+0

@ ओलाफ जब webservice विधि कहा जाता है ... मैं अभी भी Foo ऑब्जेक्ट की सामग्री निर्धारित करने के लिए कुछ व्यावसायिक तर्क लागू करना चाहता हूं। तो, यह किसी दिए गए पोस्ट रिटर्न वाई के लिए उतना आसान नहीं है। लेकिन, आम तौर पर सामग्री कॉल करने वाले 99% उपयोगकर्ताओं के लिए सामग्री वही होती है। तो, मैं वस्तु के लिए किसी भी तरह से marshalled परिणाम कैश करना चाहता हूँ। आपकी पोस्ट के लिए धन्यवाद हालांकि लेख दिलचस्प था। – blak3r

+0

मुझे नहीं पता कि इसके लिए कार्यान्वयन/उदाहरण का उपयोग करने के लिए तैयार है या नहीं, लेकिन इसके लिए आप एक (थोड़ा संशोधित) ज्ञापन पैटर्न कार्यान्वयन का उपयोग कर सकते हैं। http://en.wikipedia.org/wiki/Memoization –

0

वहाँ सोप में कोई सख्त आवश्यकता है कि आप सर्वर या क्लाइंट सोप अंतिम बिंदुओं को संभालने के लिए CXF की तरह एक ढांचे का उपयोग करने की आवश्यकता है। एक्सिस 1.1-आधारित सर्वर से बात करने के लिए एक्सिस 1.4-आधारित एसओएपी क्लाइंट का उपयोग करते समय हमने क्लाइंट थ्रेड डेडलॉक्स में भाग लिया, और एक्सिस को मिटाने और हाथों से लिखित कोड में अनुरोध करके उन्हें ठीक किया। हमें यह बताकर एक्सिस सर्वर से झूठ बोलना पड़ा कि हमारे पास अभी भी एक्सिस क्लाइंट था, लेकिन उसे कोई पछतावा नहीं हुआ! ;-)

इसी तरह, आप सीएक्सएफ को बाईपास करने और अपने हस्तलिखित जावा कोड में एसओएपी प्रतिक्रिया उत्पन्न करने में सक्षम होना चाहिए। फिर आप अपने marshalled (unparsed, serialized) एक्सएमएल तारों को कैश करने और इस हॉटस्पॉट को खत्म करने के लिए मानचित्र का उपयोग कर सकते हैं।

आरईएसटी पर ओलाफ के साथ दृढ़ता से सहमत हैं: यदि आप HTTP का पूरी तरह से लाभ उठाते हैं, तो यह सभी कैशिंग आपके सर्वर और आपके ग्राहकों के बीच सभी मध्यवर्ती कैशों में निःशुल्क होती है। यह निश्चित रूप से नई सेवाओं के लिए विचार करने के लिए कुछ है।

अपडेट: सीएक्सएफ में अनुकूलन योग्य interceptor chains की धारणा है। एक प्रकार का आउटबाउंड इंटरसेप्टर मार्शल चरण के लिए है, इसलिए ऐसा लगता है कि आप सीएक्सएफ को कुचलने के बिना वहां इस कैश को जोड़ सकते हैं।शायद एक सीएक्सएफ विशेषज्ञ हमारे लिए यह सत्यापित कर सकता है?

+0

@ जिम फेरन्स - हमारे पास कई विधियां और जटिल वस्तुएं हैं जो हस्तलिखित कोड को असुरक्षित बनाए रखेगी। मैं साबुन संदेश के विधि निकाय घटक को कैश करने के लिए इंटरसेप्टर श्रृंखला का उपयोग करने का उदाहरण ढूंढने की उम्मीद कर रहा था। मुझे अपाचे दस्तावेज़ों में कोई अच्छा उदाहरण नहीं मिला है। – blak3r

0

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

क्या क्लाइंट एप्लिकेशन को तुरंत या जल्द से जल्द Foo में परिवर्तनों की जानकारी होनी चाहिए?

उपभोक्ता/ग्राहक पक्ष पर कैश क्यों न करें? एक डिज़ाइन जहां आप एक ही वेब सेवा विधि को प्रति सेकंड सैकड़ों बार बुला रहे हैं, शायद सबसे अच्छा नहीं है।

+0

हमारे पास हजारों अद्वितीय ग्राहक हैं जो हर 20s में लगभग एक बार GetFoo विधि को बुलाते हैं। इसलिए, हम ग्राहक पक्ष पर कैश नहीं कर सकते हैं। – blak3r

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