2012-03-20 14 views
10

मेरे जावाईई वेब एप्लिकेशन के भीतर, मुझे आने वाले संदेशों को आगमन के क्रम में कड़ाई से संसाधित करने की आवश्यकता है। मुझे लगता है कि मेरे वेबपैप कंटेनर (टॉमकैट 6) संदेश के क्रम को बनाए रखता है क्योंकि वे http पोर्ट पर पहुंचते हैं।सख्त क्रम के साथ संदेशों की समवर्ती प्रसंस्करण

मुझे सिरदर्द का कारण क्या होता है, वैसे ही मैं आंतरिक रूप से इन संदेशों को संसाधित कर रहा हूं। बेहतर वर्कलोड के लिए, मैं प्रत्येक संदेश की प्रसंस्करण को थ्रेडपूल में जोड़ता हूं क्योंकि यहां कई चीजें करने की आवश्यकता है। एक्सएमएल पार्सिंग, कभी-कभी बाहरी वेब सेवाओं का उपयोग कर डेटा का संवर्द्धन। प्रसंस्करण समाप्त होने के बाद, मैंने संदेश के जावा प्रतिनिधित्व को एक जटिल स्ट्रीम प्रसंस्करण इंजन esper.codehaus.org में धक्का दिया, जो थ्रेडसेफ है। यहां, विभिन्न पैटर्न की जांच की जाती है जहां प्रवेश आदेश उच्चतम आवश्यकता है, उदाहरण के लिए किसी घटना की दहलीज सीमा से अधिक है।

मुझे प्रत्येक संसाधित संदेश को प्राथमिकता प्रश्न में डालने का विचार था, जो आगमन के समय प्राप्त प्राथमिकता आईडी (मेरे सर्वलेट में, जहां यह प्रत्येक संदेश के लिए बढ़ाया जाता है)। समस्या निम्न है:

वह धागा जो कतार से तत्वों को मतदान कर रहा है (सबसे कम आईडी कतार का सिर है) इसे एस्पर में डालने के लिए एक आईडी छोड़ सकती है क्योंकि यह गायब वस्तुओं की जांच नहीं करती है। मुझे लगता है कि एक उदाहरण बेहतर बाहर काम करता है:

enter image description here

चरणों के लिए (1) (4) सब कुछ के रूप में इरादा काम करता है। लेकिन चरण (5) पर QueuePoller तत्व 6 को पुनर्प्राप्त करता है और तत्व 4 नहीं (जिसे बाद में चरण (6) में डाला जाता है)। इसका परिणाम संदेश क्रम में होता है: 2; 3; 6; 4.

मैंने जो करने की कोशिश की थी वह कतार के सिर को मतदान के कार्यान्वयन को बदलने के लिए आईडी के सख्त क्रम का पालन करना था। मतलब, यदि अगली आईडी का तत्व अभी तक कतार में डाला नहीं गया है, तो वहां तक ​​बाधा पर प्रतीक्षा करें। यह पहले 10 मिनट के लिए काम करने लग रहा था, लेकिन फिर फांसी, शायद एक तत्व के कारण जो कतार में कभी नहीं डाला गया था।

किसी को भी अतीत में एक ही समस्या है और मेरे लिए कुछ संकेत है?

+0

जैसे ही वे आपके सर्वर पर पहुंचते हैं, आप कतार वस्तुओं को बेहतर बना सकते हैं, फिर उन्हें केवल कतार से लिया जा सकता है और एक बार उनकी प्रक्रिया पूरी हो जाती है। –

+0

जो मुझे समझ में नहीं आता है, अगर आउटपुट कतार में तत्वों के क्रम को इनपुट कतार में ऑर्डर से मेल खाना है, तो उन्हें ऑर्डर करने का क्या अच्छा प्रसंस्करण है? यही है, अगर क्यूईपॉलर को 6 से पहले 4 की आवश्यकता है तो 4 से पहले क्यों करें? – aib

+0

मैंने उन दोनों के बारे में सोचा, लेकिन मुझे लगता है कि यह इसी तरह के परिणाम का कारण बन जाएगा। मान लीजिए, मैं एक ध्वज का उपयोग करता हूं जो इंगित करता है कि प्रसंस्करण समाप्त हो गया है, अगर प्रोसेसिंग में कुछ गड़बड़ हुई है (सर्वर टाइमआउट, इत्यादि जो भी तत्व को सम्मिलित नहीं किया जाता है, तो भी समस्याएं उत्पन्न हो सकती हैं)। इस प्रकार, सूचक ध्वज कभी भी सत्य पर सेट नहीं किया जाएगा। – matthes

उत्तर

3

Disruptor बाहर की जाँच करें - सख्त आदेश के साथ एक उच्च प्रदर्शन कतार (प्रथम प्रवेश - पहले पाओ)

+0

अरे, मैं यह कहने वाला था कि :-) – dty

+0

ऐसा लगता है कि ओपी स्थिति यह है कि आइटम थ्रेड आउट ऑफ़ ऑर्डर प्रोसेसिंग में आ रहे हैं और उन्हें आइटम की कुंजी के अनुसार उन्हें संसाधित करने की आवश्यकता है। विघटनकर्ता इसे कैसे हल करेगा? –

+0

लिंक के लिए धन्यवाद, अगर मैं अपनी समस्याओं का समाधान करता हूं, तो मैं निश्चित रूप से इसे जांच और रिपोर्ट कर दूंगा। एक त्वरित पढ़ने के बाद भी यह गायब तत्वों के इंतजार को हल करने के लिए प्रतीत नहीं होता - या मैंने पर्याप्त नहीं पढ़ा। – matthes

0

वर्ग पुस्तकालय कुछ उपयोगी पूर्वनिर्धारित विन्यास के साथ एक लचीला थ्रेड पूल कार्यान्वयन प्रदान करता है। आप निष्पादकों में स्थिर फैक्ट्री विधियों में से एक को कॉल करके थ्रेड पूल बना सकते हैं:

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

+0

वास्तव में प्रदर्शन की लागत पर ऑर्डरिंग बाधा को पूरा करता है। उपरोक्त टिप्पणियों में उल्लिखित –

+0

यूप, यह आखिरी समाधान है जिसे मैं महसूस करूंगा, अगर सब कुछ काम नहीं करेगा। कई मामलों में संदेशों की प्रसंस्करण बहुत महंगा हो सकती है। – matthes

0

आपकी समस्या से प्रमाणित होने और आरेख की आवश्यकता (इसके लिए +1), प्राथमिकता कतार आपके इच्छित चीज़ों के लिए एक अच्छा निर्माण नहीं है। ऐसा इसलिए है क्योंकि एक कतार एक अनुपलब्ध 4 के लिए प्रतीक्षा करने के बजाय 6 उपलब्ध कराने के लिए पूरी तरह से खुश है।

मुझे लगता है कि यह आपके स्वयं के सिंक्रनाइज़ कंटेनर को रोल करने का समय है।

+0

मुझे यह रोकने की उम्मीद है :(बहुत सारे काम की तरह लगता है :) – matthes

+0

प्राथमिकता कतार का दुरुपयोग करने से कहीं ज्यादा नहीं होना चाहिए: डी – aib

1

आप अपने प्रसंस्करण कतार में इनकमिंग अनुरोधों के लिए तुरंत प्लेसहोल्डर जोड़ सकते हैं। प्लेसहोल्डर को थ्रेड पूल द्वारा पृष्ठभूमि में प्रीप्रोसेस्ड किया जाता है लेकिन मुख्य प्रसंस्करण प्रीप्रोकैसिंग पूर्ण होने की प्रतीक्षा करता है। मेरे मन में निर्माण एक Future है।