हम विभिन्न सेवाओं के माध्यम से संदेशों को संसाधित करते हैं (एक संदेश शायद 9 सेवाओं को छूने से पहले होगा, प्रत्येक एक विशिष्ट IO- संबंधित फ़ंक्शन कर रहा है)। अभी हमारे पास प्रदर्शन के लिए सबसे खराब स्थिति (XML डेटा अनुबंध क्रमांकन) और सर्वश्रेष्ठ-केस (इन-मेमोरी MSMQ) का संयोजन है।
संदेश की प्रकृति का अर्थ है कि हमारा क्रमबद्ध डेटा लगभग 12-15 किलोबाइट समाप्त हो जाता है, और हम प्रति सप्ताह लगभग 4 मिलियन संदेशों को संसाधित करते हैं। MSMQ में लगातार संदेश हमारे लिए बहुत धीमे थे, और जैसे-जैसे डेटा बढ़ता है हम MSMQ की मेमोरी मैप की गई फाइलों से दबाव महसूस कर रहे हैं। सर्वर 16GB मेमोरी के उपयोग और बढ़ते हुए, सिर्फ कतार के लिए है। मेमोरी का उपयोग अधिक होने पर प्रदर्शन भी प्रभावित होता है, क्योंकि मशीन स्वैप करना शुरू कर देती है। हम पहले से ही MSMQ स्व-सफाई व्यवहार कर रहे हैं।
मुझे लगता है कि एक हिस्सा है जो हम यहाँ गलत कर रहे हैं। मैंने मेसेज को जारी रखने के लिए रैवेनडीबी का उपयोग करने की कोशिश की और सिर्फ एक पहचानकर्ता को कतार में खड़ा किया, लेकिन वहां प्रदर्शन बहुत धीमा था (1000 संदेश प्रति मिनट, सबसे अच्छा)। मुझे यकीन नहीं है कि अगर यह विकास संस्करण या क्या उपयोग करने का परिणाम है, लेकिन हमें निश्चित रूप से उच्चतर थ्रूपुट [1] की आवश्यकता है। सिद्धांत में अवधारणा ने बहुत अच्छा काम किया लेकिन प्रदर्शन कार्य तक नहीं था।
उपयोग पैटर्न में एक राउटर के रूप में एक सेवा कार्य होता है, जो सभी को पढ़ता है। अन्य सेवाएं अपने तृतीय पक्ष हुक के आधार पर जानकारी संलग्न करेंगी, और राउटर पर वापस भेज देंगी। अधिकांश वस्तुओं को 9-12 बार छुआ जाता है, हालांकि लगभग 10% को इस प्रणाली में थोड़ी देर के लिए लूप करने के लिए मजबूर किया जाता है जब तक कि 3 पार्टियां उचित रूप से जवाब नहीं देती हैं। अभी सेवाएं इसके लिए जिम्मेदार हैं और इसमें उपयुक्त नींद का व्यवहार है, क्योंकि हम इस कारण से संदेश के प्राथमिकता वाले क्षेत्र का उपयोग करते हैं।
तो, मेरा सवाल यह है कि सी # / विंडोज वातावरण में असतत-लेकिन-लान्ड मशीनों के बीच गुजरने वाले संदेश के लिए एक आदर्श स्टैक क्या है? मैं सामान्य रूप से XML क्रमांकन के बजाय BinaryFormatter के साथ शुरू करूंगा, लेकिन यह एक खरगोश छेद है अगर एक बेहतर तरीका दस्तावेज़ संग्रह के लिए क्रमांकन को ऑफ़लोड करना है। इसलिए, मेरा सवाल।
[१]: हमारे व्यवसाय की प्रकृति का अर्थ है जितनी जल्दी हम संदेशों को संसाधित करते हैं, उतने ही अधिक पैसे कमाते हैं। हमने अनुभवजन्य रूप से साबित कर दिया है कि सप्ताह में बाद में एक संदेश को संसाधित करने का मतलब है कि हम उस पैसे को बनाने की संभावना कम है। जबकि "1000 प्रति मिनट" का प्रदर्शन बहुत तेज़ लगता है, हमें वास्तव में 10k / मिनट के ऊपर की संख्या की आवश्यकता होती है। सिर्फ इसलिए कि मैं प्रति सप्ताह संदेशों में नंबर दे रहा हूं इसका मतलब यह नहीं है कि हमारे पास उन संदेशों को संसाधित करने के लिए एक पूरा सप्ताह है।
=============== संपादित करें:
अतिरिक्त जानकारी
टिप्पणियों के आधार पर, मैं कुछ स्पष्टीकरण जोड़ूंगा:
मुझे यकीन नहीं है कि क्रमबद्धता हमारी अड़चन है। मैंने एप्लिकेशन को बेंचमार्क किया है, और जबकि सीरियलाइज़ेशन हीट ग्राफ में दिखाई देता है, यह केवल सेवा के CPU उपयोग के 2.5-3% के लिए जिम्मेदार है।
मैं ज्यादातर अपने संदेशों की स्थायित्व और MSMQ के संभावित दुरुपयोग के बारे में चिंतित हूं। हम गैर-ट्रांजेक्शनल, गैर-निरंतर संदेशों का उपयोग कर रहे हैं ताकि हम कतारबद्ध प्रदर्शन को बनाए रख सकें, और मैं वास्तव में कम से कम लगातार संदेश देना चाहूंगा ताकि वे एक रिबूट से बचे रहें।
अधिक रैम जोड़ना एक स्टॉपगैप उपाय है। मशीन पहले से ही 4GB -> 16GB RAM से जा चुकी है और इसे और अधिक जोड़ना जारी रखने के लिए इसे लेना कठिन और कठिन होता जा रहा है।
आवेदन के स्टार रूटिंग पैटर्न के कारण, एक वस्तु के आधे समय पॉप होने के बाद एक कतार में धकेल दिया जाता है जो बिल्कुल भी नहीं बदलता है। यह खुद को फिर से (IMO) उधार देता है और इसे किसी प्रकार के कुंजी-मूल्य स्टोर में कहीं और संग्रहीत करता है और केवल संदेश पहचानकर्ता को पास करता है।
स्टार रूटिंग पैटर्न एप्लिकेशन का अभिन्न अंग है और यह परिवर्तित नहीं होगा। हम इसे सेंटीपीड नहीं कर सकते, क्योंकि हर टुकड़ा रास्ते में अतुल्यकालिक रूप से (एक पोलिंग फैशन में) संचालित होता है और हम एक ही स्थान पर रिट्रीट व्यवहार को केंद्रीकृत करना चाहते हैं।
अनुप्रयोग तर्क C # में लिखा गया है, ऑब्जेक्ट अपरिवर्तनीय POCOs हैं, लक्ष्य परिनियोजन वातावरण Windows Server 2012 है, और हमें अतिरिक्त मशीनों को खड़ा करने की अनुमति दी जाती है यदि किसी विशेष सॉफ़्टवेयर का केवल लिनक्स में समर्थन किया जाता है।
मेरा लक्ष्य स्मृति पदचिह्न को कम करते हुए और पूंजी के न्यूनतम परिव्यय के साथ दोष सहिष्णुता को बढ़ाते हुए वर्तमान थ्रूपुट को बनाए रखना है।