2011-08-14 7 views
23

साथ निर्माता प्रदर्शन मैं वसंत, jms और ActiveMQ के आधार पर एक सरल निर्माता उपभोक्ता अनुकरण बनाया, मैं,jms वसंत

कनेक्शन सेटिंग्स दोनों पक्षों, उत्पादकों और उपभोक्ताओं से उच्च प्रदर्शन तक पहुँचने के लिए कोशिश कर रहा हूँ:

<tx:annotation-driven /> 
<bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
</bean> 

<amq:connectionFactory id="amqConnectionFactory" brokerURL="failover:(tcp://${broker.url}:61616)" /> 

<bean id="connectionFactory" 
    class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="targetConnectionFactory" ref="amqConnectionFactory" /> 
</bean> 

<amq:queue id="queue" physicalName="queue" /> 

<beans:bean id="jsonMessageConverter" class="XXXXX.converter.JsonMessageConverter" /> 

उपभोक्ता सेटिंग्स:

<jms:listener-container concurrency="10" 
    acknowledge="auto" prefetch="1" message-converter="jsonMessageConverter" transaction-manager="transactionManager" 

    > 
    <jms:listener id="queueListener_1" destination="ooIntegrationQueue" 
     ref="myMessageListenerAdapter" /> 
</jms:listener-container> 


<beans:bean id="myMessageListenerAdapter" 
    class="org.springframework.jms.listener.adapter.MessageListenerAdapter" > 
    <beans:property name="delegate" ref="consumer"/> 
</beans:bean> 


<beans:bean id="consumer" class="XXX.ConsumerImpl"/> 

निर्माता सेटिंग्स:

<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate" 
    p:connectionFactory-ref="connectionFactory" p:messageConverter-ref="jsonMessageConverter" 
    p:defaultDestination-ref="ooIntegrationQueue" p:sessionTransacted="true" /> 

उपभोक्ता के साथ शुरू, मैं प्रति सेकंड के बारे में 25 संदेश उपभोग करने के लिए जो बेहद धीमी गति से है में कामयाब रहे, मैं टोंटी की खोज की तथ्य यह है कि मैं लेनदेन का उपयोग कर रहा, थोड़ा के लिए googling के बाद, और के साथ खेल होना करने के लिए कॉन्फ़िगरेशन, मैं पता चला कि DefaultMessageListenerContainer autowiring और CacheLevel बदलने के बाद

प्रति सेकंड लगभग 1500 संदेशों में मेरे प्रदर्शन बढ़ जाती है
listenerContainer.setCacheLevelName("CACHE_SESSION") 

अभी भी लेन-देन करते हुए।

मेरी समस्या निर्माता जो अभी भी प्रति सेकंड के बारे में 25 आपरेशन पर अटक गया है के साथ अब है, मेरी निर्माता परीक्षण सरल है:

int numOfMessages = getNumberOfMessages(); 


double startTime = System.currentTimeMillis(); 

for (int i = 1; i <= numOfMessages; i++) { 
    jmsTemplate.convertAndSend("HelloWorld" + i); 
} 

double endTime = System.currentTimeMillis(); 

double totalTime=(endTime-startTime)/1000; 
System.out.println("Time - "+totalTime+" seconds"); 
System.out.println("EPS - "+numOfMessages/totalTime); 

मैं कैसे निर्माता के साथ समान प्रदर्शन तक पहुँचने के लिए सोच रहा हूँ के बाद से, अब यह पूरी प्रणाली को बाधित करता है।

उत्तर

14

क्षमा करें अगर यह उत्तर मूल पोस्टर की सहायता के लिए देर से आता है। मैंने हाल ही में JmsTemplate प्रदर्शन की जांच की। यहां तक ​​कि एक ही वितरण और स्वीकृति मोड के साथ, मूल JMS कोड JmsTemplate से बहुत तेज़ लग रहा था। समस्या यह साबित हुई कि ActiveMQ सामान्य रूप से एसिंक भेजने के लिए डिफ़ॉल्ट है, लेकिन जब आप JmsTemplate का उपयोग करते हैं तो यह सिंक भेजने का उपयोग करता है।यह नाटकीय रूप से प्रदर्शन को कम करता है। एसिंक भेजने के लिए आप ActiveMQConnectionFactory की useAsyncSend संपत्ति true पर सेट कर सकते हैं। यहां अधिक जानकारी: JmsTemplate is not evil

0

ActiveMQ के लिए डिफ़ॉल्ट वितरण मोड क्या है? क्या यह एक सतत कतार है? यदि हां, तो यह कैसे कॉन्फ़िगर किया गया है? ब्रोकर कितना रिमोट है? ये उत्तर कतार में भेजने की मूल लागत निर्धारित करेंगे कि यह कितने समय तक सर्वर को भेजने के लिए लेता है (यानी नेटवर्क आरटीटी + डिस्क को सिंक्रनाइज़ करने के लिए संदेश को स्थायी रखने की संभावित लागत)।

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

+0

अच्छी तरह से संदेश लगातार नहीं हैं, मैंने jms टेम्पलेट डीबग किया है और सत्र और निर्माता कैश किए गए हैं, मैंने वसंत के बिना मूल उदाहरण का प्रयास करने का निर्णय लिया है, और जैसा कि यह निकलता है (जो समझ में आता है) प्रति संदेश सत्र, एक ही प्रदर्शन में परिणाम, केवल कुछ निश्चित संदेशों को उछालते हैं और फिर लेनदेन करने से मुझे वांछित परिणाम मिलते हैं। – Matan

+1

यदि एक सादा वेनिला परीक्षण और वसंत आधारित परीक्षण में एक ही प्रदर्शन होता है तो आप ब्रोकर पर बाधा डाल सकते हैं। 25/एस प्रति संदेश 40ms के बराबर है। ब्रोकर एक्स (और चाहे भेज एसिंक है या नहीं) के आधार पर यह काफी उचित हो सकता है और इस पर निर्भर करता है कि यह संदेश को कैसे प्रबंधित करता है और यह किस हार्डवेयर पर चलता है। डिफ़ॉल्ट वितरण मोड क्या है? मेरा अनुमान 'PERSISTENT' है, यदि ऐसा है तो' NON_PERSISTENT' पर स्विच करने का प्रयास करें और आपको थ्रूपुट ऊपर जाना चाहिए। आपको एसिंक भेजना भी देखना चाहिए यदि यह पहले से ही डिफॉल्ट नहीं है। – Matt

5

जेएमस्टेम्प्लेट कनेक्शन की फैक्ट्री -> कनेक्शन -> सत्र -> संदेश उत्पादक, प्रत्येक भेजने के बाद प्रत्येक ऑब्जेक्ट को बंद करता है। इसके आस-पास पहुंचने के लिए, अपने amqConnectionFactory बीन को org.apache.activemq.pool.PooledConnectionFactory के साथ लपेटें, और कैशिंगकनेक्शन फ़ैक्टरी के बजाय टेम्पलेट के नीचे इसका उपयोग करें।

+0

ने पहले से ही कोशिश की है, कैशिंगकनेक्शन फैक्ट्री 1 के पूल आकार में डिफ़ॉल्ट रूप से बदलती है, यह मान बदलता है कि पूल वैनेक्शन फैक्ट्री (जो कि 500 ​​के पूल आकार में डिफ़ॉल्ट है) का भी उपयोग करता है, वही प्रदर्शन देता है – Matan

+1

वहां निश्चित रूप से कुछ चल रहा है - एक प्रोफाइलर चिपकाएं परीक्षण के ऊपर और देखें कि क्या आप हॉटस्पॉट की पहचान कर सकते हैं। जिज्ञासा से बाहर, जब आप समीकरण से कनवर्टर लेते हैं तो प्रदर्शन क्या होता है? अर्थात। सरल परीक्षण संदेश भेजें। दूसरी बात यह है कि आप एक धागे में रैखिक प्रदर्शन का परीक्षण कर रहे हैं; शायद यह नहीं है कि इसका इस्तेमाल लाइव किया जाएगा। कन्वर्ट करने के लिए कॉल को लपेटकर और एक रननेबल में भेजकर और इसे निष्पादक सेवा में पास करके एक और उपयोगी परीक्षण क्षैतिज भार से संतृप्त करना होगा। –

+0

नीचे वोट, वास्तव में? मै मैट के जवाब पर आपकी प्रतिक्रिया नहीं देखी, लेकिन मुझे लगता है कि एक वैध सवाल था। मुझे लगता है कि आपका निर्माता कोड जुनीट परीक्षण में है, हालांकि वहां पर्याप्त जानकारी नहीं है। एक समान कॉन्फ़िगरेशन के साथ मैं प्रति सेकेंड 1000 संदेश देख रहा हूं। –

1

ऑटो से CLIENT_ACKNOWLEDGE तक स्वीकृति विधि को बदलने का प्रयास करें। अधिक जानकारी के लिए Specification देखें।