टारनटूल डेटा ग्रिड की वास्तुकला और क्षमताएं

टारनटूल डेटा ग्रिड की वास्तुकला और क्षमताएं

2017 में, हमने अल्फ़ा-बैंक के निवेश व्यवसाय के लेनदेन संबंधी कोर को विकसित करने के लिए एक प्रतियोगिता जीती और काम शुरू किया (हाईलोड++ 2018 में निवेश व्यवसाय के मूल पर एक रिपोर्ट के साथ) अभिनय किया व्लादिमीर ड्रिनकिन, अल्फ़ा बैंक के निवेश व्यवसाय के लेनदेन कोर के प्रमुख)। इस प्रणाली को विभिन्न स्रोतों से लेनदेन डेटा को विभिन्न स्वरूपों में एकत्रित करना, डेटा को एकीकृत रूप में लाना, संग्रहीत करना और उस तक पहुंच प्रदान करना था।

विकास प्रक्रिया के दौरान, सिस्टम विकसित हुआ और कार्यक्षमता हासिल की, और कुछ बिंदु पर हमें एहसास हुआ कि हम कार्यों की एक कड़ाई से परिभाषित सीमा को हल करने के लिए बनाए गए एप्लिकेशन सॉफ़्टवेयर से कहीं अधिक कुछ क्रिस्टलीकृत कर रहे थे: हम सफल हुए लगातार भंडारण के साथ वितरित अनुप्रयोगों के निर्माण के लिए प्रणाली. हमने जो अनुभव प्राप्त किया वह एक नए उत्पाद का आधार बना - टारनटूल डेटा ग्रिड (टीडीजी)।

मैं टीडीजी आर्किटेक्चर और विकास प्रक्रिया के दौरान हमारे सामने आए समाधानों के बारे में बात करना चाहता हूं, आपको मुख्य कार्यक्षमता से परिचित कराना चाहता हूं और दिखाना चाहता हूं कि कैसे हमारा उत्पाद संपूर्ण समाधान बनाने का आधार बन सकता है।

वास्तुकला की दृष्टि से हमने सिस्टम को अलग-अलग भागों में विभाजित किया है भूमिकाएँ, जिनमें से प्रत्येक एक निश्चित श्रेणी की समस्याओं को हल करने के लिए जिम्मेदार है। एक एकल चल रहा एप्लिकेशन इंस्टेंस एक या अधिक भूमिका प्रकारों को लागू करता है। एक क्लस्टर में एक ही प्रकार की कई भूमिकाएँ हो सकती हैं:

टारनटूल डेटा ग्रिड की वास्तुकला और क्षमताएं

योजक

कनेक्टर बाहरी दुनिया के साथ संचार के लिए जिम्मेदार है; इसका कार्य अनुरोध को स्वीकार करना, उसे पार्स करना और यदि यह सफल हो जाता है, तो डेटा को इनपुट प्रोसेसर को प्रोसेसिंग के लिए भेजना है। हम HTTP, SOAP, काफ्का, FIX प्रारूपों का समर्थन करते हैं। आर्किटेक्चर आपको नए प्रारूपों के लिए समर्थन जोड़ने की अनुमति देता है, आईबीएम एमक्यू के लिए समर्थन जल्द ही आने वाला है। यदि अनुरोध को पार्स करना विफल हो गया, तो कनेक्टर एक त्रुटि लौटाएगा; अन्यथा, यह जवाब देगा कि अनुरोध सफलतापूर्वक संसाधित किया गया था, भले ही इसकी आगे की प्रक्रिया के दौरान कोई त्रुटि हुई हो। यह विशेष रूप से उन प्रणालियों के साथ काम करने के लिए किया गया था जो अनुरोधों को दोहराना नहीं जानते - या, इसके विपरीत, इसे बहुत लगातार करते हैं। डेटा न खोने के लिए, एक मरम्मत कतार का उपयोग किया जाता है: वस्तु पहले इसमें आती है और सफल प्रसंस्करण के बाद ही इसे इससे हटाया जाता है। व्यवस्थापक मरम्मत कतार में शेष वस्तुओं के बारे में अलर्ट प्राप्त कर सकता है, और सॉफ़्टवेयर त्रुटि या हार्डवेयर विफलता को समाप्त करने के बाद पुनः प्रयास कर सकता है।

इनपुट प्रोसेसर

इनपुट प्रोसेसर प्राप्त डेटा को विशिष्ट विशेषताओं के अनुसार वर्गीकृत करता है और उपयुक्त प्रोसेसर को कॉल करता है। हैंडलर लुआ कोड हैं जो सैंडबॉक्स में चलते हैं, इसलिए वे सिस्टम के कामकाज को प्रभावित नहीं कर सकते हैं। इस स्तर पर, डेटा को आवश्यक रूप में कम किया जा सकता है, और यदि आवश्यक हो, तो मनमानी संख्या में कार्य लॉन्च किए जा सकते हैं जो आवश्यक तर्क को लागू कर सकते हैं। उदाहरण के लिए, टारनटूल डेटा ग्रिड पर निर्मित एमडीएम (मास्टर डेटा मैनेजमेंट) उत्पाद में, एक नया उपयोगकर्ता जोड़ते समय, अनुरोध के प्रसंस्करण को धीमा न करने के लिए, हम एक अलग कार्य के रूप में एक गोल्डन रिकॉर्ड का निर्माण शुरू करते हैं। सैंडबॉक्स डेटा को पढ़ने, बदलने और जोड़ने के अनुरोधों का समर्थन करता है, आपको भंडारण प्रकार और परिणाम के एकत्रीकरण (मानचित्र/कम) की सभी भूमिकाओं पर कुछ कार्य करने की अनुमति देता है।

हैंडलर को फाइलों में वर्णित किया जा सकता है:

sum.lua

local x, y = unpack(...)
return x + y

और फिर, कॉन्फ़िगरेशन में घोषित किया गया:

functions:
  sum: { __file: sum.lua }

लुआ क्यों? लुआ एक बहुत ही सरल भाषा है. हमारे अनुभव के आधार पर, इसे जानने के कुछ घंटों बाद, लोग कोड लिखना शुरू कर देते हैं जो उनकी समस्या का समाधान करता है। और ये न केवल पेशेवर डेवलपर्स हैं, बल्कि, उदाहरण के लिए, विश्लेषक भी हैं। इसके अलावा, जिट कंपाइलर के लिए धन्यवाद, लुआ बहुत तेज़ी से चलता है।

भंडारण

स्टोरेज लगातार डेटा को स्टोर करता है। सहेजने से पहले, डेटा को डेटा स्कीमा के विरुद्ध सत्यापित किया जाता है। सर्किट का वर्णन करने के लिए हम एक विस्तारित प्रारूप का उपयोग करते हैं अपाचे एवरो. उदाहरण:

{
    "name": "User",
    "type": "record",
    "logicalType": "Aggregate",
    "fields": [ 
        { "name": "id", "type": "string"}, 
        {"name": "first_name", "type": "string"}, 
        {"name": "last_name", "type": "string"} 
    ], 
    "indexes": ["id"] 
}

इस विवरण के आधार पर, टारेंटयुला डीबीएमएस के लिए डीडीएल (डेटा डेफिनिशन लैंग्वेज) स्वचालित रूप से उत्पन्न होता है GraphQL डेटा एक्सेस के लिए स्कीमा।

एसिंक्रोनस डेटा प्रतिकृति समर्थित है (सिंक्रोनस डेटा प्रतिकृति जोड़ने की योजना है)।

आउटपुट प्रोसेसर

कभी-कभी बाहरी उपभोक्ताओं को नए डेटा के आगमन के बारे में सूचित करना आवश्यक होता है; इस उद्देश्य के लिए, आउटपुट प्रोसेसर की भूमिका होती है। डेटा को सहेजने के बाद, इसे संबंधित हैंडलर को भेजा जा सकता है (उदाहरण के लिए, इसे उपभोक्ता द्वारा आवश्यक फॉर्म में लाने के लिए) - और फिर भेजने के लिए कनेक्टर को पास किया जा सकता है। यहां एक मरम्मत कतार का भी उपयोग किया जाता है: यदि किसी ने ऑब्जेक्ट स्वीकार नहीं किया है, तो व्यवस्थापक बाद में पुनः प्रयास कर सकता है।

स्केलिंग

कनेक्टर, इनपुट प्रोसेसर और आउटपुट प्रोसेसर भूमिकाएँ स्टेटलेस हैं, जो हमें वांछित भूमिका प्रकार सक्षम होने के साथ नए एप्लिकेशन इंस्टेंस जोड़कर सिस्टम को क्षैतिज रूप से स्केल करने की अनुमति देती हैं। भंडारण का उपयोग क्षैतिज स्केलिंग के लिए किया जाता है एक प्रस्ताव वर्चुअल बकेट का उपयोग करके क्लस्टर को व्यवस्थित करना। एक नया सर्वर जोड़ने के बाद, पुराने सर्वर से कुछ बकेट को पृष्ठभूमि में नए सर्वर पर ले जाया जाता है; यह उपयोगकर्ताओं के लिए पारदर्शी रूप से होता है और पूरे सिस्टम के संचालन को प्रभावित नहीं करता है।

डेटा गुण

वस्तुएँ बहुत बड़ी हो सकती हैं और उनमें अन्य वस्तुएँ भी हो सकती हैं। हम एक वर्चुअल बकेट में सभी निर्भरताओं के साथ एक ऑब्जेक्ट को संग्रहीत करके डेटा जोड़ने और अपडेट करने की परमाणुता सुनिश्चित करते हैं। यह ऑब्जेक्ट को कई भौतिक सर्वरों में "फैलने" से रोकता है।

संस्करणीकरण समर्थित है: किसी ऑब्जेक्ट का प्रत्येक अद्यतन एक नया संस्करण बनाता है, और हम हमेशा समय का टुकड़ा ले सकते हैं और देख सकते हैं कि दुनिया तब कैसी दिखती थी। उस डेटा के लिए जिसके लिए लंबे इतिहास की आवश्यकता नहीं है, हम संस्करणों की संख्या सीमित कर सकते हैं या यहां तक ​​कि केवल एक - नवीनतम - संग्रहीत कर सकते हैं, अर्थात, एक निश्चित प्रकार के लिए अनिवार्य रूप से संस्करण अक्षम कर सकते हैं। आप इतिहास को समय के अनुसार भी सीमित कर सकते हैं: उदाहरण के लिए, 1 वर्ष से अधिक पुरानी किसी निश्चित प्रकार की सभी वस्तुओं को हटा दें। संग्रह करना भी समर्थित है: हम निर्दिष्ट समय से अधिक पुरानी वस्तुओं को अनलोड कर सकते हैं, जिससे क्लस्टर में जगह खाली हो जाएगी।

कार्य

दिलचस्प विशेषताओं के बीच, यह उपयोगकर्ता के अनुरोध पर, या सैंडबॉक्स से प्रोग्रामेटिक रूप से कार्यों को लॉन्च करने की क्षमता पर ध्यान देने योग्य है:

टारनटूल डेटा ग्रिड की वास्तुकला और क्षमताएं

यहां हम एक और भूमिका देखते हैं - धावक। यह भूमिका स्टेटलेस है, और इस भूमिका के साथ अतिरिक्त एप्लिकेशन इंस्टेंस को आवश्यकतानुसार क्लस्टर में जोड़ा जा सकता है। धावक की जिम्मेदारी कार्यों को पूरा करना है। जैसा कि उल्लेख किया गया है, सैंडबॉक्स से नए कार्य उत्पन्न करना संभव है; उन्हें भंडारण पर एक कतार में सहेजा जाता है और फिर रनर पर निष्पादित किया जाता है। इस प्रकार के कार्य को जॉब कहा जाता है। हमारे पास एक कार्य प्रकार भी है जिसे टास्क कहा जाता है - ये उपयोगकर्ता-परिभाषित कार्य हैं जो शेड्यूल पर (क्रॉन सिंटैक्स का उपयोग करके) या मांग पर चलते हैं। ऐसे कार्यों को लॉन्च करने और ट्रैक करने के लिए, हमारे पास एक सुविधाजनक कार्य प्रबंधक है। इस कार्यक्षमता को उपलब्ध कराने के लिए, आपको शेड्यूलर भूमिका को सक्षम करना होगा; इस भूमिका की एक स्थिति होती है, इसलिए इसका कोई पैमाना नहीं होता है, हालाँकि, इसकी आवश्यकता नहीं होती है; साथ ही, अन्य सभी भूमिकाओं की तरह, इसमें एक प्रतिकृति हो सकती है जो मास्टर के अचानक मना करने पर काम करना शुरू कर देती है।

लकड़हारा

एक अन्य भूमिका को लकड़हारा कहा जाता है। यह क्लस्टर के सभी सदस्यों से लॉग एकत्र करता है और वेब इंटरफ़ेस के माध्यम से उन्हें अपलोड करने और देखने के लिए एक इंटरफ़ेस प्रदान करता है।

सेवाएं

उल्लेखनीय है कि यह सिस्टम सेवाएँ बनाना आसान बनाता है। कॉन्फ़िगरेशन फ़ाइल में, आप निर्दिष्ट कर सकते हैं कि कौन से अनुरोध सैंडबॉक्स में चलने वाले उपयोगकर्ता-लिखित हैंडलर को भेजे जाते हैं। उदाहरण के लिए, इस हैंडलर में आप किसी प्रकार की विश्लेषणात्मक क्वेरी चला सकते हैं और परिणाम लौटा सकते हैं।

सेवा कॉन्फ़िगरेशन फ़ाइल में वर्णित है:

services:
   sum:
      doc: "adds two numbers"
      function: sum
      return_type: int
      args:
         x: int
         y: int

ग्राफक्यूएल एपीआई स्वचालित रूप से उत्पन्न होती है और सेवा कॉलिंग के लिए उपलब्ध हो जाती है:

query {
   sum(x: 1, y: 2) 
}

यह हैंडलर को कॉल करेगा sumजो परिणाम लौटाएगा:

3

क्वेरी प्रोफ़ाइलिंग और मेट्रिक्स

सिस्टम के संचालन और प्रोफाइलिंग अनुरोधों को समझने के लिए, हमने ओपनट्रेसिंग प्रोटोकॉल के लिए समर्थन लागू किया। सिस्टम मांग पर उन उपकरणों को जानकारी भेज सकता है जो इस प्रोटोकॉल का समर्थन करते हैं, जैसे ज़िपकिन, जो आपको यह समझने की अनुमति देगा कि अनुरोध कैसे निष्पादित किया गया था:

टारनटूल डेटा ग्रिड की वास्तुकला और क्षमताएं

स्वाभाविक रूप से, सिस्टम आंतरिक मेट्रिक्स प्रदान करता है जिसे प्रोमेथियस का उपयोग करके एकत्र किया जा सकता है और ग्राफाना का उपयोग करके देखा जा सकता है।

तैनात करना

टारनटूल डेटा ग्रिड को वितरण या एन्सिबल से उपयोगिता का उपयोग करके आरपीएम पैकेज या संग्रह से तैनात किया जा सकता है, कुबेरनेट्स के लिए भी समर्थन है (टारनटूल कुबेरनेट्स ऑपरेटर).

व्यावसायिक तर्क (कॉन्फ़िगरेशन, हैंडलर) को लागू करने वाला एप्लिकेशन यूआई के माध्यम से एक संग्रह के रूप में या हमारे द्वारा प्रदान की गई एपीआई के माध्यम से एक स्क्रिप्ट का उपयोग करके तैनात टारनटूल डेटा ग्रिड क्लस्टर में लोड किया जाता है।

नमूना अनुप्रयोग

टारनटूल डेटा ग्रिड का उपयोग करके कौन से एप्लिकेशन बनाए जा सकते हैं? वास्तव में, अधिकांश व्यावसायिक कार्य किसी न किसी तरह डेटा प्रवाह के प्रसंस्करण, भंडारण और पहुंच से संबंधित होते हैं। इसलिए, यदि आपके पास डेटा की बड़ी धाराएं हैं जिन्हें सुरक्षित रूप से संग्रहीत और एक्सेस करने की आवश्यकता है, तो हमारा उत्पाद आपको विकास का बहुत सारा समय बचा सकता है और आपके व्यावसायिक तर्क पर ध्यान केंद्रित कर सकता है।

उदाहरण के लिए, हम रियल एस्टेट बाज़ार के बारे में जानकारी एकत्र करना चाहते हैं, ताकि भविष्य में, उदाहरण के लिए, हमारे पास सर्वोत्तम ऑफ़र के बारे में जानकारी हो। इस मामले में, हम निम्नलिखित कार्यों पर प्रकाश डालेंगे:

  1. खुले स्रोतों से जानकारी एकत्र करने वाले रोबोट हमारे डेटा स्रोत होंगे। आप तैयार समाधानों का उपयोग करके या किसी भी भाषा में कोड लिखकर इस समस्या को हल कर सकते हैं।
  2. इसके बाद, टारनटूल डेटा ग्रिड डेटा को स्वीकार करेगा और सहेजेगा। यदि विभिन्न स्रोतों से डेटा प्रारूप भिन्न है, तो आप लुआ में कोड लिख सकते हैं जो एकल प्रारूप में रूपांतरण करेगा। उदाहरण के लिए, प्री-प्रोसेसिंग चरण में, आप डुप्लिकेट ऑफ़र को फ़िल्टर करने या डेटाबेस में बाज़ार में काम करने वाले एजेंटों के बारे में अतिरिक्त जानकारी अपडेट करने में भी सक्षम होंगे।
  3. अब आपके पास क्लस्टर में पहले से ही एक स्केलेबल समाधान है जिसे डेटा से भरा जा सकता है और डेटा चयन किया जा सकता है। फिर आप नई कार्यक्षमता लागू कर सकते हैं, उदाहरण के लिए, एक सेवा लिखें जो डेटा के लिए अनुरोध करेगी और प्रति दिन सबसे लाभप्रद ऑफ़र देगी - इसके लिए कॉन्फ़िगरेशन फ़ाइल में कुछ पंक्तियों और थोड़ा लुआ कोड की आवश्यकता होगी।

आगे क्या है?

हमारी प्राथमिकता विकास के उपयोग में आसानी में सुधार करना है टारनटूल डेटा ग्रिड. उदाहरण के लिए, यह सैंडबॉक्स में चलने वाले प्रोफाइलिंग और डिबगिंग हैंडलर के लिए समर्थन वाला एक आईडीई है।

हम सुरक्षा मुद्दों पर भी बहुत ध्यान देते हैं। अभी हम उच्च स्तर की सुरक्षा की पुष्टि करने और व्यक्तिगत डेटा सूचना प्रणालियों और सरकारी सूचना प्रणालियों में उपयोग किए जाने वाले सॉफ़्टवेयर उत्पादों के प्रमाणीकरण की आवश्यकताओं को पूरा करने के लिए रूस के FSTEC द्वारा प्रमाणीकरण से गुजर रहे हैं।

स्रोत: www.habr.com

एक टिप्पणी जोड़ें