बड़े मोनोलिथिक अनुप्रयोगों में, स्पष्ट स्वामित्व की कमी के कारण त्रुटि ट्रैकिंग और निगरानी अक्सर अप्रभावी हो जाती है। यह मार्गदर्शिका डोमेन एनोटेशन के माध्यम से जवाबदेही सौंपने के लिए एक संरचित दृष्टिकोण का प्रस्ताव करके इस मुद्दे को संबोधित करती है।
कई टीमों वाले बड़े मोनोलिथिक के लिए प्रभावी निगरानी स्थापित करना चुनौतीपूर्ण हो सकता है। स्पष्ट स्वामित्व के बिना, त्रुटि ट्रैकिंग सामान्य हो जाती है और अक्सर अनदेखा कर दी जाती है। एक समाधान यह है कि ऑन-कॉल इंजीनियरों को यह पहचानने के लिए कहा जाए कि किस टीम को निगरानी अलार्म का जवाब देना चाहिए। हालाँकि, अधिक कुशल दृष्टिकोण प्रत्येक लॉग और डेटाडॉग स्पैन में डोमेन और टीम की जानकारी शामिल करना है।
हमारे एप्लिकेशन के विभिन्न भागों के लिए कौन सी टीम जिम्मेदार है, इसका ट्रैक रखने के लिए, हम डोमेन एनोटेशन नामक एक सिस्टम का उपयोग करते हैं। डोमेन एनोटेशन आपके एप्लिकेशन के कोड के हर हिस्से को लेबल करता है, जो स्पष्ट रूप से दर्शाता है कि कौन किसके लिए जिम्मेदार है। यह जिम्मेदारियों के प्रबंधन में स्पष्ट संगठन और जवाबदेही प्रदान करता है।
डोमेन एनोटेशन एक मोनोलिथिक एप्लिकेशन के भीतर टीम की जिम्मेदारियों को ट्रैक करने के लिए एक स्पष्ट और संगठित विधि प्रदान करते हैं। डोमेन एनोटेशन के साथ अपने कोड के कुछ हिस्सों को टैग करके, आप यह कर सकते हैं:
कुशल निगरानी और पता लगाने की क्षमता सुनिश्चित करने के लिए, प्रत्येक वेब अनुरोध को उचित डोमेन जानकारी के साथ टैग किया जाता है। यह कई घटकों के सहयोग से प्राप्त किया जाता है: DomainProvider
, DomainSpanService
, DomainMdcProvider
, और DomainHandlerInterceptor
।
निम्नलिखित चित्र में इस प्रक्रिया का उच्च-स्तरीय अवलोकन दर्शाया गया है:
इन घटकों का विस्तृत कार्यान्वयन एक साझा लाइब्रेरी में समाहित किया जाएगा, जो बड़े मोनोलिथिक अनुप्रयोगों में वेब अनुरोधों को टैग करने और निगरानी करने के लिए एक पुन: प्रयोज्य समाधान प्रदान करेगा।
डोमेन एनोटेशन के साथ क्लास स्तर पर स्वामित्व को परिभाषित करना सीधा है। मुख्य कक्षाओं में शीर्ष-स्तरीय एनोटेशन लागू करने से, स्वामित्व उन कक्षाओं के भीतर सभी विस्तृत संसाधनों तक फैल जाता है। प्रत्येक टीम उचित डोमेन एनोटेशन के साथ उन कक्षाओं को लेबल कर सकती है जो उनके स्वामित्व में हैं, जिससे हर एक विधि को चिह्नित करने की आवश्यकता के बिना स्पष्टता और जवाबदेही सुनिश्चित होती है।
ऐसे मामलों में जब एक क्लास में कई टीमें कोड रखती हैं और तत्काल रीफैक्टरिंग उचित नहीं है, तो आप अलग-अलग डोमेन एनोटेशन के साथ अलग-अलग विधियों को चिह्नित कर सकते हैं, जो क्लास-लेवल एनोटेशन पर प्राथमिकता लेते हैं। यह अलग-अलग टीमों को विशिष्ट विधियाँ असाइन करने की अनुमति देता है, जो समग्र संरचना को जटिल किए बिना लचीलापन प्रदान करता है।
जबकि डोमेन एनोटेशन अविश्वसनीय रूप से उपयोगी हैं, ऐसे दुर्लभ मामले हैं जहाँ उनका उपयोग नहीं किया जा सकता है। उदाहरण के लिए, हमें क्वार्ट्ज जॉब क्रिएशन के साथ समस्याओं का सामना करना पड़ा, जो क्वार्ट्ज के AOP लॉजिक और डोमेन एनोटेशन के लिए उपयोग किए जाने वाले AOP लॉजिक के बीच टकराव के कारण डोमेन एनोटेशन के साथ सहजता से काम नहीं करता था।
उन नौकरियों और प्रक्रियाओं के लिए जिन्हें सीधे एनोटेट नहीं किया जा सकता है, हमने नौकरी कार्यान्वयन में सीधे डोमेनटैग्स सेवा का उपयोग किया। इस दृष्टिकोण ने हमें नौकरी के निष्पादन तर्क के भीतर मैन्युअल रूप से डोमेन टैग जोड़ने की अनुमति दी।
यहाँ एक उदाहरण दिया गया है कि हमने DomainTagsService को क्वार्ट्ज़ जॉब में कैसे एकीकृत किया:
final override fun execute(context: JobExecutionContext) { domainTagsService.invoke(domain) { withLoggedExecutionDetails(context, ::doExecute) } }
जबकि प्रत्येक टीम के लिए अलग-अलग सेवाएँ होने से निगरानी और स्वामित्व में महत्वपूर्ण लाभ मिलते हैं, यह मोनोलिथ को विभाजित करने के लिए उच्च लागत और प्रयासों के साथ-साथ संभावित अतिरिक्त विकास व्यय के साथ आता है। जब मोनोलिथ को मॉड्यूल में विभाजित किया जाता है तो ग्रैडल के साथ बिल्ड समय में सुधार की संभावना को ध्यान में रखते हुए, कई मामलों में मोनोरेपो बनाए रखना सबसे कुशल समाधान हो सकता है।
डेटाडॉग में प्रत्येक टीम की गतिविधियों की निगरानी को सरल बनाने के लिए, आप विभिन्न टीमों के लिए कृत्रिम सेवा नाम निर्दिष्ट कर सकते हैं। यह दृष्टिकोण सुनिश्चित करता है कि डेटाडॉग के निगरानी उपकरणों में प्रत्येक टीम का अपना समर्पित अनुभाग हो। यदि आपके पास प्रबंधित करने के लिए कई सेवाएँ हैं, तो कृत्रिम सेवा नामों का उपयोग करना भ्रामक हो सकता है, लेकिन सीमित संख्या में बैकएंड सेवाओं के साथ यह प्रबंधनीय हो जाता है। इन कृत्रिम सेवा नामों में उपसर्ग जोड़ने से आपके डेटाडॉग सेटअप में संगठन और स्पष्टता बनाए रखने में मदद मिलती है, जिससे विभिन्न टीमों और उनकी जिम्मेदारियों के बीच अंतर करना आसान हो जाता है।
स्क्रीनशॉट के बजाय आरेख का उपयोग करें?? कार्यकर्ता/वेबऐप का यहाँ कोई मतलब नहीं है
लॉग के लिए कृत्रिम सेवा नामों का उपयोग करने से भ्रम की स्थिति पैदा हो सकती है, क्योंकि एक ही लॉग प्रविष्टि विभिन्न सेवाओं के अंतर्गत दिखाई दे सकती है।
उदाहरण के लिए, एक ही प्रमाणीकरण सेवा का उपयोग करने वाले दो एंडपॉइंट पर विचार करें। यदि इन एंडपॉइंट को अलग-अलग डोमेन के साथ एनोटेट किया जाता है, तो प्रमाणीकरण तर्क विभिन्न कृत्रिम सेवाओं के तहत लॉग का उत्पादन करेगा। जब कोई लॉग एक्सप्लोर कर रहा होता है, तो यह भ्रम पैदा कर सकता है, क्योंकि वे कई सेवा नामों के तहत दिखाई देते हैं। इस समस्या से बचने के लिए, कृत्रिम सेवा नामों को केवल उन स्पैन पर लागू करना बेहतर है जो ट्रेस में एक साथ एकत्रित होते हैं ताकि भ्रम कम हो
क्या इसका कोई मतलब है? मुझे नहीं लगता कि इसका कोई मतलब है।
इस समस्या का दृश्यात्मक प्रतिनिधित्व इस प्रकार है:
कृत्रिम सेवाओं का उपयोग करने से आप न केवल एपीएम ट्रेस के साथ काम कर सकते हैं, बल्कि डेटाडॉग मेट्रिक्स में सेवा द्वारा फ़िल्टर भी कर सकते हैं, जो एक विस्तारित अवधि के लिए संग्रहीत होते हैं, जिससे लंबे समय तक परिवर्तनों को ट्रैक करना संभव हो जाता है।
नीचे डेटाडॉग में एक मॉनिटर का स्क्रीनशॉट है जो क्वेरी में कृत्रिम सेवा नाम konsus-assets
उपयोग करता है:
नीचे डेटाडॉग में डैशबोर्ड का स्क्रीनशॉट दिया गया है जो फ़िल्टर में कृत्रिम सेवा नाम konsus-assets
उपयोग करता है:
अपनी निगरानी रणनीति में नकली सेवाओं का उपयोग करके, आप एक अखंड अनुप्रयोग के भीतर प्रत्येक टीम की गतिविधियों की दृश्यता और जवाबदेही को बढ़ा सकते हैं। यह दृष्टिकोण टीम-विशिष्ट मॉनिटर और डैशबोर्ड बनाने और बनाए रखने की प्रक्रिया को सरल बनाता है, जिससे डेटाडॉग में अधिक प्रभावी और संगठित निगरानी होती है।
डोमेन एनोटेशन डेटाडॉग में मोनोलिथिक अनुप्रयोगों की निगरानी को सरल बनाने के लिए एक सीधा दृष्टिकोण प्रदान करते हैं। इस रणनीति को लागू करके, आप लॉग, स्पैन और मेट्रिक्स की प्रबंधन क्षमता को बढ़ा सकते हैं, अपने मॉनिटरिंग सेटअप को विशिष्ट टीमों के लिए तैयार किए गए टूल में बदल सकते हैं। यह जवाबदेही और संगठन को बेहतर बनाता है और आपके पूरे एप्लिकेशन में अधिक प्रभावी और कुशल समस्या निवारण और प्रदर्शन विश्लेषण की सुविधा देता है।
DomainTagsService
जैसी सेवाओं का उपयोग करना सुनिश्चित करता है कि डोमेन-विशिष्ट निगरानी अभी भी बनाए रखी जा सकती है।डोमेन और टीम परिभाषित करें
यह lib के साथ बदल जाएगा!!!
अपने एप्लिकेशन में विभिन्न डोमेन और टीमों का प्रतिनिधित्व करने वाले enums बनाएँ:
@Domain
एक एनोटेशन है जिसे क्लासों या फंक्शनों पर लागू किया जा सकता है, तथा उन्हें एक विशिष्ट डोमेन मान के साथ चिह्नित किया जा सकता है।DomainValue
एक सूची है जो विभिन्न डोमेन का प्रतिनिधित्व करती है, प्रत्येक डोमेन एक टीम से संबद्ध होता है।Team
एक सूची है जो अनुप्रयोग पर काम करने वाली विभिन्न टीमों का प्रतिनिधित्व करती है। @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) annotation class Domain(val value: DomainValue) enum class DomainValue(val team: Team) { USER_MANAGEMENT(Team.TEAM_A), PAYMENT_PROCESSING(Team.TEAM_B), NOTIFICATIONS(Team.TEAM_C) } enum class Team { TEAM_A, TEAM_B, TEAM_C }
कक्षाओं (और यदि आवश्यक हो तो विधियों) पर टिप्पणी करें
@Domain(DomainValue.USER_MANAGEMENT) class UserService { @Domain(DomainValue.PAYMENT_PROCESSING) fun processPayment() { ... } }
असमर्थित मामलों को संभालें
ऐसे मामलों के लिए जिन्हें सीधे एनोटेट नहीं किया जा सकता है, तर्क को लपेटने के लिए सीधे DomainTagsService
उपयोग करें
fun executeNotSupportedByAnnotationsLogic() { domainTagsService.invoke(domain) { executeLogic() } }
डेटाडॉग से निगरानी करें
मॉनिटर, डैशबोर्ड और APM ट्रेस फ़िल्टरिंग के लिए कृत्रिम सेवा फ़िल्टर का उपयोग करें
इन चरणों का पालन करके, आप अपने मोनोलिथिक एप्लिकेशन में डोमेन एनोटेशन को प्रभावी ढंग से लागू कर सकते हैं, जिससे बेहतर निगरानी, जवाबदेही और समग्र दक्षता सुनिश्चित हो सकेगी।