
जैसा कि आप जानते हैं, किसी भी कारवां की गति सबसे धीमी ऊंट की गति से ऊपर से सीमित है। प्रोग्रामिंग की दुनिया में, हम लगातार इस सिद्धांत के साथ सामना कर रहे हैं, बातचीत करने वाले मॉड्यूल की एक जटिल, बहु-घटक प्रणाली विकसित कर रहे हैं। हमारे आंतरिक एल्गोरिदम को अनुकूलित करने के बाद, हमें ऊंट ड्राइवरों की सीमाओं का सामना करना पड़ता है, जो हमें तृतीय-पक्ष सेवाओं के लिए एक इंटरफ़ेस प्रदान करता है: डेटाबेस, संदेश कतार प्रबंधक, आदि।
दुर्भाग्य से, नोड.जेएस के समुदाय में, इस समय ऐसी स्थिति है कि सामान्य सेवाओं के लिए ड्राइवरों के विशाल बहुमत में कई महत्वपूर्ण कमियां हैं जो अनुप्रयोगों को दक्षता और स्थिरता की अच्छी तरह से योग्य ऊंचाइयों को प्राप्त करने से रोकती हैं। आपने शायद इन सभी भयानक कहानियों को सुना है कि "नोड.जेस बह रही है", यह "खिलौना" है, जो वास्तविक उच्च लोड वाले वातावरण में उपयोग के लिए नहीं है। हालांकि, जैसा कि हमने अपने स्वयं के अनुभव से देखा है, नोड के लिए बुद्धिमानी से लिखा गया सॉफ़्टवेयर शानदार मुकाबला वास्तविकताओं के सभी परीक्षणों के साथ शानदार ढंग से मुकाबला करता है। और यहां हम मुख्य प्रश्न पर आते हैं: क्या औसत नोड। जेएस चालक को सामान्य रूप से काम करने से रोकता है?
इन बाधाओं की पूरी समीक्षा एक अलग लेख के लिए समर्पित की जा सकती है, हालांकि, अब हम किसी समस्या उत्पाद के सबसे विशिष्ट संकेतों को अलग कर सकते हैं:
- सुस्ती (v8 सुविधाओं पर विचार की कमी)
- आने वाली चूजों की गलत प्रसंस्करण (टीसीपी विभाजन के प्रभावों की कमी)
- मेमोरी लीक (घटना संचालकों और उनके समय पर सफाई)
- फेलोवर और अन्य उपयोगी बन्स की कमी।
पहले हम PosgreSQL डेटाबेस के लिए एक ड्राइवर की जरूरत थी। उपलब्ध समाधानों के साथ प्रयोग करने के बाद, हम इस निष्कर्ष पर पहुंचे कि अपने ड्राइवर को लिखना अधिक उचित होगा। भविष्य में, बड़ी संख्या में सेवाओं के साथ बातचीत करने की आवश्यकता का सामना करना पड़ा, हम अनिवार्य रूप से उसी समाधान पर लौट आए।
तो, हमने अपने बहु-थ्रेडेड ड्राइवर को PosgreSQL के लिए c + में लिखा, जिसमें हमने विफलता तंत्र को लागू किया। जब सर्वर से कनेक्शन टूट जाता है, तो हम अब इस बारे में नहीं सोचते हैं कि क्या अनुरोध खो जाएगा। हमारा ड्राइवर उन्हें रैम में संग्रहीत करता है और पुन: कनेक्ट होने पर अनुरोध फिर से शुरू करता है।
इंटरफ़ेस डिज़ाइन करते समय, हमें "केवल व्यापार पर और कुछ नहीं" के सिद्धांत द्वारा निर्देशित किया गया था।
अनुरोध को पूरा करने के लिए, आपको पहले कनेक्शन पूल को इनिशियलाइज़ करना होगा। यह बहुत आसानी से pg.init फ़ंक्शन का उपयोग करके किया जाता है, जिसमें आपको एक साथ कनेक्शन और कनेक्शन सेटिंग्स की संख्या को स्थानांतरित करने की आवश्यकता होती है:
pg.init(20, { 'user': 'postgres', 'dbname': 'postgres', 'hostaddr': '127.0.0.1', 'password': '123' });
तब आप अनुरोध को निष्पादित कर सकते हैं और परिणाम की प्रक्रिया कर सकते हैं:
var query = "SELECT 1 AS value"; pg.exec(query, function(table) { console.log('Result table:', table); }, console.error);
आप पूर्व-तैयार अनुरोध को भी निष्पादित कर सकते हैं:
var preparedQuery = "SELECT $word1 AS word1, $word2 AS word2"; pg.execPrepared(preparedQuery, { 'word1': 'hello', 'word2': 'world' }, function(table) { console.log('Result table:', table); }, console.error);
सभी आवश्यक कार्यों को पूरा करने के बाद, आप बस pg.destroy () फ़ंक्शन को कॉल करके ड्राइवर का उपयोग कर डिस्कनेक्ट कर सकते हैं;
जैसा कि आप देख सकते हैं, सब कुछ बहुत सरल और पारदर्शी है। आप, ड्राइवर इंटरफ़ेस के साथ खुद को परिचित करने में बहुत समय खर्च किए बिना, विकसित करना शुरू कर सकते हैं।
हमने गति तुलना परीक्षण भी लिखा है और हमारे ड्राइवर की तुलना सबसे लोकप्रिय में से एक है, अर्थात् नोड-पोस्टग्रेज। हमने 1byte और 1Kbyte में डेटा पैकेट के लिए अनुरोध किया और समय और स्मृति की तुलना की। नीचे दिए गए परिणाम अर्ध-लघुगणकीय पैमाने पर प्रस्तुत किए गए हैं:

जैसा कि आप ग्राफ से देख सकते हैं, 100,000 अनुरोधों के बाद, परिणाम के लिए प्रतीक्षा समय तेजी से बढ़ रहा है। 500,000 अनुरोधों पर, आपको 25 मिनट से अधिक इंतजार करना होगा! हमारा ड्राइवर आधे मिनट में इस संख्या को संसाधित करता है।
जैसा कि नीचे दिए गए ग्राफ से देखा जा सकता है, अनुरोधों की संख्या 10000 - 100000 के साथ, प्रसंस्करण समय में अंतर महत्वपूर्ण है।

एक समान स्थिति 1KB डेटा पैकेट के साथ होती है। नीचे दिए गए परिणाम अर्ध-लघुगणकीय पैमाने पर प्रस्तुत किए गए हैं।


हमने मेमोरी खपत पर परिणामों की तुलना भी की। जैसा कि रेखांकन से देखा जा सकता है, यहां हमारा ड्राइवर भी जीतता है। इसके अलावा, सभी रेखांकन अर्ध-लघुगणकीय पैमाने पर प्रस्तुत किए जाते हैं।


नतीजतन, हमने फेलओवर सुविधा के साथ एक सरल, तेज चालक विकसित किया।
कंसोल में कमांड चलाकर आप इसे npm का उपयोग करके स्थापित कर सकते हैं:
npm install livetex-node-pg
और अपने आवेदन में इसे जोड़ने:
var pg = require('livetex-node-pg');
आप गिथुब पर परियोजना को रोक सकते हैं, चारों ओर खेल सकते हैं, अपने बदलाव सुझा सकते हैं:
https://github.com/LiveTex/Node-Pg