2012-10-01 17 views
5

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

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

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

शायद मुझे अपने श्रोताओं में प्रसंस्करण कई सेवाओं और हार्ड कोड का विचार छोड़ना होगा।

कोई सुझाव? धन्यवाद!

उत्तर

1

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

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

मैं यहां सेवाओं पर नहीं छोड़ूंगा, आपको जो निर्णय मिल रहा है वह महान है, मुझे अनुभव से पता चला है। चूंकि इस मॉडल में सेवा श्रोताओं के पास RabbitMQ पर कोई निर्भरता नहीं है, आप आसानी से उनका परीक्षण कर सकते हैं और/या किसी अन्य कतार प्रौद्योगिकी पर स्विच कर सकते हैं।

फिर से, इन मामलों में सबसे आसान बात यह है कि आप सबसे सरल समाधान कर सकते हैं। यदि आपके पास प्रदर्शन की समस्या है, तो बाधाओं को मापें और ठीक करें। समयपूर्व समाधानों पर प्रयास की एक पागल राशि बर्बाद हो जाती है ... मैं आपको कुछ समय पहले बेवकूफ समयपूर्व अनुकूलन बता सकता हूं जिस पर मैंने अपना समय बर्बाद कर दिया है।

+0

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

+0

मैंने इक्विनोक्स के संस्करण की जांच की है जो मैं चला रहा हूं, और मुझे समन्वयक सेवा नहीं दिखाई दे रही है। क्या ऐसा कुछ खास है जिसे मुझे चलाने के लिए करना है? मुझे लगता है कि मैं रिलीज 4 संस्करण 4.3 का उपयोग कर रहा हूं। –

+0

मेरा मानना ​​है कि * समन्वयक सेवा * * कोड के एक टुकड़े को संदर्भित करता है [वह] आपकी सेवाओं के लिए कतार भेजता है "*। मैंने किसी भी मानक ओएसजीआई-सेवा के बारे में कभी नहीं सुना है जिसे * समन्वयक * कहा जाता है। –

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