DHH ने अभी "सिटाडेल" शब्द गढ़ा है, जो अंततः हमें AppSignal पर हम टेक से कैसे संपर्क करते हैं, इसका संदर्भ देने का एक उत्कृष्ट तरीका देता है। हमने कहा, "अरे, यह हम हैं! हमारी चीज़ का अब नाम है"।
मेजेस्टिक मोनोलिथ के अलावा, किसी को सिटाडेल के पैटर्न को लिखना चाहिए: एक मेजेस्टिक मोनोलिथ ऐप के अधिकांश द्रव्यमान को पकड़ता है, कुछ सहायक आउटपोस्ट ऐप्स के साथ अत्यधिक विशिष्ट और भिन्न आवश्यकताओं के लिए।
— DHH (@dhh) April 7, 2020
यह समझाने के लिए कि AppSignal सिटाडेल पैटर्न का उपयोग कैसे करता है, हम इस बारे में थोड़ा साझा करेंगे कि हमारा सिस्टम कैसे काम करता है। AppSignal एक मॉनिटरिंग उत्पाद है जिसमें एक उपयोगकर्ता-सामना करने वाला एप्लिकेशन और एक API है जिसे मॉनिटरिंग एजेंट डेटा भेजता है। इस डेटा को फिर संसाधित किया जाता है और ग्राफ़ और अंतर्दृष्टि में बदल दिया जाता है।
मोनोलिथ
वह एप्लिकेशन जिससे हमारे ग्राहक इंटरैक्ट करते हैं, एक मोनोलिथिक रेल्स ऐप है, जिसके फ्रंट-एंड के कुछ हिस्से React में लिखे गए हैं। बैकएंड पूरी तरह से रूबी में लिखा गया है और कुछ डेटाबेस से बात करता है (हम स्केलिंग कारणों से विभिन्न ग्राहकों के डेटा को अलग-अलग क्लस्टर में विभाजित करते हैं)। यह रेल्स ऐप अलर्ट को बाहरी सेवाओं में भेजने जैसे कई अन्य कार्यों को भी संभालता है।
जब हमने शुरू किया तो यह रेल्स ऐप हमारे मॉनिटरिंग एजेंट से आने वाले डेटा को भी संसाधित करता था, हमने पूर्वाभास किया कि डेटा अंतर्ग्रहण एक बॉटलनेक बन जाएगा। इसलिए हमने एक सबडोमेन पर चलने वाले सिनाट्रा ऐप का उपयोग किया जो डेटा को अंतर्ग्रहण करता था और साइडकिक जॉब्स बनाता था जिन्हें रेल्स ऐप द्वारा संसाधित किया जाता था।
बढ़ते दर्द
यह आर्किटेक्चर वर्षों तक अच्छा काम करता था। जैसे-जैसे हमारा व्यवसाय बढ़ा, यह स्पष्ट हो गया कि एजेंटों से आने वाले डेटा को संसाधित करने का विशिष्ट कार्य विशेष उपचार की मांग करने वाला था। जब आप अरबों और अरबों अनुरोधों की निगरानी कर रहे होते हैं, तो आप कठिन सीमाओं में चलते हैं। मुख्य सीमित कारक यह नहीं था कि रूबी धीमा है (हम सभी जानते हैं कि यह नहीं है 😉), बल्कि यह कि हमने चीजों को कैसे आर्किटेक्ट किया था, इसने हमारे डेटाबेस में बहुत अधिक लॉकिंग का कारण बना।
एक आउटपोस्ट
हमने कई संभावनाओं को देखा और फिर फैसला किया कि Kafka हमारी स्थिति के लिए सबसे उपयुक्त था। हमारे पास Rust के साथ कुछ अनुभव था और सोचा कि इसकी गति और विश्वसनीयता इस सिस्टम के लिए बहुत उपयुक्त होगी। हमने अपने डेटा अंतर्ग्रहण और प्रसंस्करण सिस्टम को Rust में फिर से लिखा, Kafka का उपयोग कतार और स्टोरेज सिस्टम के संयोजन के रूप में किया।
हमने केवल रेल्स ऐप के आने वाले डेटा प्रसंस्करण भाग को इस आउटपोस्ट सर्विस में स्थानांतरित किया। बाकी सिस्टम मोनोलिथिक ऐप के रूप में अच्छी तरह से काम करता है। हम इसे गहराई से समझते हैं, और हम चीजों को सरल रखना पसंद करते हैं। मोनोलिथ अभी भी अधिकांश तर्क को संभालता है और Kafka के साथ भारी इंटरैक्ट करता है। हमारे मोनोलिथ को बनाए रखने की इच्छा ने हमें एक Kafka जेम लिखने के लिए प्रेरित किया, ताकि मुख्य ऐप आउटपोस्ट के साथ आसानी से संवाद कर सके।
यदि आप AppSignal पर Kafka कैसे काम करता है, इसके बारे में अधिक जानना चाहते हैं, तो मैंने इसके बारे में दिए गए Railsconf टॉक को देखें।
सिटाडेल में जीवन
यह हमें वर्तमान स्थिति में लाता है जहां हम अपने सिटाडेल में बहुत खुश हैं। जैसा कि DHH ने कहा:
एक मेजेस्टिक मोनोलिथ ऐप के अधिकांश द्रव्यमान को कुछ सहायक आउटपोस्ट ऐप्स के साथ अत्यधिक विशिष्ट और भिन्न आवश्यकताओं के लिए पकड़ता है।
हमारे मामले में, हमारे अत्यधिक विशिष्ट आवश्यकताओं के लिए एक सिंगल आउटपोस्ट सर्विस है। यदि इस वर्ष RailsConf होता, तो हम DHH को कुछ अतिरिक्त स्ट्रॉपवाफेल्स देते इसके लिए नाम देने की सराहना के रूप में। 🍪