मेरे सिस्टम में दो अलग-अलग प्रकार के संदेश हैं - टाइप ए और बी। प्रत्येक संदेश में एक अलग संरचना होती है - प्रकार ए में एक int सदस्य होता है और टाइप बी में एक डबल सदस्य होता है। मेरे सिस्टम को कई प्रकार के संदेशों को कई व्यावसायिक तर्क धागे में पारित करने की आवश्यकता है। विलंबता को कम करना बहुत महत्वपूर्ण है इसलिए मैं मुख्य थ्रेड से संदेशों को यांत्रिक तर्कसंगत तरीके से व्यावसायिक तर्क धागे में संदेश पास करने के लिए एक विघटनकर्ता का उपयोग करके जांच कर रहा हूं।एकाधिक संदेश प्रकारों के साथ एक विघटनकर्ता का उपयोग कैसे करें
मेरी समस्या यह है कि विघटनकर्ता केवल अंगूठी बफर में एक प्रकार की वस्तु स्वीकार करता है। यह समझ में आता है क्योंकि विघटनकर्ता अंगूठी बफर में वस्तुओं को पूर्व-आवंटित करता है। हालांकि, यह विघटनकर्ता के माध्यम से मेरे व्यापार तर्क धागे में दो अलग-अलग प्रकार के संदेशों को पार करना मुश्किल बनाता है।
कॉन्फ़िगर disruptor एक तय आकार बाइट सरणी (के रूप में How should one use Disruptor (Disruptor Pattern) to build real-world message systems? द्वारा सिफारिश की) युक्त वस्तुओं का उपयोग करने के: से मैं क्या बता सकते हैं, मैं चार विकल्प हैं। इस मामले में, मुख्य थ्रेड को विघटनकर्ता को प्रकाशित करने से पहले संदेशों को बाइट एरे में एन्कोड करना होगा और प्रत्येक व्यवसाय तर्क धागे को बाइट एरे को रसीद पर वस्तुओं में वापस डीकोड करना होगा। इस सेटअप का नकारात्मक पक्ष यह है कि व्यापार तर्क धागे वास्तव में विघटनकर्ता से स्मृति साझा नहीं कर रहे हैं - इसके बजाय वे विघटनकर्ता द्वारा प्रदान किए गए बाइट सरणी से नई वस्तुओं (और इस प्रकार कचरा बना रहे हैं) बना रहे हैं। इस सेटअप का उछाल यह है कि सभी व्यावसायिक तर्क धागे एक ही विघटनकर्ता से कई अलग-अलग प्रकार के संदेशों को पढ़ सकते हैं।
एक प्रकार के ऑब्जेक्ट का उपयोग करने के लिए विघटनकर्ता को कॉन्फ़िगर करें लेकिन प्रत्येक ऑब्जेक्ट प्रकार के लिए एकाधिक विघटनकर्ता बनाएं। उपर्युक्त मामले में, दो अलग-अलग विघटनकर्ता होंगे - एक प्रकार की वस्तुओं के लिए एक और दूसरे प्रकार की वस्तुओं के लिए बी। इस सेटअप का उल्टा यह है कि मुख्य धागे को ऑब्जेक्ट को बाइट सरणी में एन्कोड करने की आवश्यकता नहीं होती है और व्यवसाय कम तर्क धागे विघटन में उपयोग की जाने वाली वही वस्तुओं को साझा कर सकते हैं (कोई कचरा नहीं बनाया गया)। इस सेटअप का नकारात्मक पक्ष यह है कि किसी भी तरह से प्रत्येक व्यवसाय तर्क धागा को कई विघटनकर्ताओं के संदेशों की सदस्यता लेनी होगी।
"सुपर" वस्तु कि दोनों संदेश एक के सभी क्षेत्रों में शामिल है और बी यह बहुत OO शैली के खिलाफ है एक प्रकार का उपयोग करने के लिए disruptor कॉन्फ़िगर है, लेकिन # 1 विकल्प और # के बीच एक समझौता के लिए अनुमति देगा 2।
ऑब्जेक्ट संदर्भ का उपयोग करने के लिए विघटनकर्ता को कॉन्फ़िगर करें। हालांकि, इस मामले में मैं ऑब्जेक्ट प्रीलोकेशन और मेमोरी ऑर्डरिंग के प्रदर्शन लाभ खो देता हूं।
इस स्थिति के लिए आप क्या सलाह देते हैं? मुझे लगता है कि विकल्प # 2 सबसे साफ समाधान है, लेकिन मुझे नहीं पता कि उपभोक्ता तकनीकी रूप से कई विघटनकर्ताओं के संदेशों की सदस्यता कैसे ले सकते हैं या नहीं। यदि कोई विकल्प # 2 को कार्यान्वित करने के लिए एक उदाहरण प्रदान कर सकता है, तो इसकी सराहना की जाएगी!
माइकल बार्कर Disruptor Google समूह में मेरे प्रश्न का उत्तर प्रकाशित करते हैं। नीचे उसकी प्रतिक्रिया देखें: https://groups.google.com/d/msg/lmax-disruptor/clUkJaFMsZg/54fKplz21MwJ –
यदि यह आपके प्रश्न का उत्तर देता है तो इसे यहां एक उत्तर में परिवर्तित करने पर विचार करें और उस उत्तर को स्वीकृत के रूप में चिह्नित करें। – cic