रूसी में बिजनेस इंटेलिजेंस - क्विंट्स

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


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




हमने अपने मौजूदा वाणिज्यिक उत्पाद को एक संदर्भ के रूप में लिया, इसलिए जब भी संभव हो हम इसके साथ तुलना करेंगे।


कार्य निम्नलिखित घटकों को बनाना था:


  • डेटा मौसा और सेवा की जानकारी (उपयोगकर्ता, सेटिंग्स, आदि) के भंडारण के लिए एक डेटाबेस;
  • सिस्टम और उसके ओआरएम का वेब इंटरफेस;
  • BI कार्यक्षमता - डेटा लोडिंग, कस्टम रिपोर्ट, ग्राफ़, पिवट टेबल।

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


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


डेटा संरचना बनाने में हमें अधिक समय नहीं लगा: मंच प्रकार संपादक आपको व्यावसायिक वस्तुओं को बनाने और उनका वर्णन करने की अनुमति देता है, जैसे कि उपयोगकर्ता की आवश्यकताओं को पर्यावरण की बारीकियों (डेटा प्रकार और आयाम, चाबियाँ, प्रतिबंध, डेटा फ़ील्ड नाम, पहचानकर्ता, आदि) के अनुकूल करने की आवश्यकता नहीं है। यह पंचक का पहला प्लस है जिसे हम ठीक कर सकते हैं।


यह डेटा संरचना कैसे बनाया जाता है - हम आवश्यक शब्दों को परिभाषित करते हैं, और उनमें से हम अपने विषय क्षेत्र की वस्तुओं को बनाते हैं:



कॉपी / पेस्ट प्रारूप में कई मिनट की गतिविधि के बाद, हमें एक फॉर्म के लिए आवश्यक डेटा संरचना और इसके लिए कई सहायक निर्देशिकाएं मिलीं। प्रपत्र डेटा की संरचना (विश्लेषक द्वारा अपघटन के बाद) इस तरह दिखाई देती है:




यहां प्रस्तुत आंकड़ों की व्यावसायिक समझ से परिचित एक विश्लेषक निम्नलिखित पढ़ता है: प्रत्येक F110 उदाहरण (सीबी शब्दावली में फॉर्म 110) की एक सटीकता है (यह "सटीक" या "गोल") हो सकता है और इसमें प्रत्येक के लिए कोड का एक सेट शामिल है। रूबल और मुद्रा में मात्रा का संकेत दिया जाता है।


डेटा नेविगेटर में, जहां डेटा को निर्दिष्ट संरचना के अनुसार प्रस्तुत किया जाता है, हम सिस्टम में मौजूद फॉर्म इंस्टेंस के बारे में ऐसी तालिका देखते हैं:




प्रपत्र की पहचान मूल्य इसकी रिपोर्टिंग तिथि है, रिपोर्टिंग कोड एक अधीनस्थ सरणी के रूप में संग्रहीत किए जाते हैं, जिसका आकार हम कोष्ठक में देखते हैं।


जैसा कि उल्लेख किया गया है, हमने डेटा को थोड़ा विघटित किया, यदि मूल संरचना के साथ तुलना की जाए, ताकि डेटाबेस में मूल्यों को दोहराने की लंबी पंक्तियों को संग्रहीत न किया जाए, जैसे कि प्रोग्रामर या डेटाबेस व्यवस्थापक क्या देखता है:


संदर्भ प्रणाली में डेटा के साथ तालिका:


वैसे, यही कारण है कि हम मंच की स्थिति की स्थिति में हैं (बाद में हम इसे इंटीग्रल कहेंगे) विश्लेषक के लिए एक विकास उपकरण के रूप में, न कि प्रोग्रामर के लिए।


सहायक डेटा संरचना incommensurably बड़ा है, क्योंकि यह सभी प्रारंभिक डेटा, रिपोर्ट सेटिंग्स, रिपोर्ट के अंदर डेटा की अखंडता की जाँच के लिए नियम और संबंधित रिपोर्ट में, गणना और सामंजस्य के इतिहास, साथ ही रिपोर्ट के निर्माण के दौरान डेटा व्यापार परिवर्तन के कुछ नियमों को संग्रहीत करता है:



(संरचना इसकी संपूर्णता में नहीं दी गई है)


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


फ़ाइल देखें

नीचे दिए गए उदाहरण में, फ़ाइल की पहली 3 पंक्तियाँ प्रपत्र की संरचना का वर्णन करती हैं (यदि यह सिस्टम में नहीं है, तो इसे बनाया जाएगा), और फिर स्वयं डेटा - प्रपत्र के पैरामीटर और रिपोर्ट के पैरामीटर इसके अधीनस्थ होते हैं।


268:110:DATE;277;270; 277::SHORT; 270:  :SHORT;  :SIGNED;   :SIGNED; 268::20121231;281;; 270::A/5.2;1233682389.47;; 277:281:; 270::A/5.3;622836720.22;; 270::A/6.4;19800;; 270::A/9.2;27125165.14;; 270::S16203/1.2;608607846.309999;; 270::S16305/4;2727510994.84;; 270::S16305/4.1;32049069.51;; 270::S16305/14;2737711.65;; 270::S25302/4;2725748122.98999;; 270::S25302/4.1;40952511.36;; 270::IL/2;87429694.5699999;62717458.21; 270::IL/4;33517212.95;; 270::IL/9;1423281.69;8278.24; 270::IL/11;86433534.5699999;519956.63; 270::IA/1;147792224.509999;4517060.94; 270::IA/2;737704.92;; 270::IA/3;27099836.07;2637.79; 270::IA/6;5607868.86;408410.4; 270::IA/8;103837028.49;48841202.69; 270::IA/10;112302573.56;; 268::20121231;280;; 270::A/5.2;1233682;; 277:280:; 270::A/5.3;622837;; 270::A/6.4;20;; 270::A/9.2;27125;; 270::S16203/1.2;608608;; 

इस फॉर्म के लिए, डेटाबेस में 4470 रिपोर्टिंग तिथियां हैं, जो एक फ्लैट फ़ाइल में अनलोड होने पर, 1 एमबी से थोड़ा अधिक लेती हैं। मूल डेटाबेस (ओरेकल) में, वे एक सामान्यीकृत रूप में 3.1 एमबी (अनुक्रमित के बिना) पर कब्जा कर लेते हैं और एक विकृत स्टोरफ्रंट में 4.2 एमबी, जिसे हम पंचक के रूप में दोहराने की कोशिश कर रहे हैं। क्विंट को अनुक्रमित और सामान्यीकृत किया जाता है, और उनके प्रारूप में ये डेटा पहले से ही 10 एमबी पर कब्जा कर लेते हैं।


तुलना के लिए डेटा की मात्रा तालिका में (मेगाबाइट में) संक्षेपित है:
टेक्स्टआरडीबीएमएसquintets
डेटा1.13.15.1
denormalized4.2
सूचकांक6.25.1
डेटा + इंडेक्स9.310.2

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


संदर्भ आधार:


quintets:


इसके अलावा, इंटीग्रल में, हमने तुरंत तालिका के सभी क्षेत्रों को अनुक्रमित किया, और संदर्भ प्रणाली में - केवल तारीख, कोड और राशि में रूबल, जो नई आवश्यकताएं आने पर अतिरिक्त लागतों की आवश्यकता होगी।


संदर्भ के लिए: डेटाबेस में, सहायक रिपोर्ट और सेटिंग्स सहित इस फॉर्म का कुल आकार लगभग 400 एमबी है (यह अपेक्षाकृत छोटा है)।


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


उनकी भूमिकाओं वाले उपयोगकर्ताओं की सूची इस प्रकार है:




यदि आप भूमिका नाम पर क्लिक करते हैं (ऊपर चित्र में लाल अंडाकार के साथ चिह्नित), तो आप इसकी सामग्री देख सकते हैं:




भूमिका वस्तुओं को 3 एक्सेस स्तरों पर सेट किया जा सकता है; मास्क का उपयोग किया जा सकता है:




बुनियादी इंटरफ़ेस के माध्यम से डेटा संपादन भी किया जाता है। यहाँ, उदाहरण के लिए, एक उपयोगकर्ता संपादन फ़ॉर्म है:




हमने अपने एप्लिकेशन और उसके कार्यस्थलों के विशिष्ट मेनू को एक कॉम्पैक्ट फ़ाइल में रखा है, क्योंकि वे सभी एक ही प्रकार के हैं: 2-3 तत्वों का एक अनुरोध फ़ॉर्म और अनुरोधों के परिणामों के साथ एक तालिका।




आर्किटेक्चर बहुत सरल निकला: हमने बहुत सारे डेटा अनुरोध (विचार) बनाए और इन विचारों में शामिल तालिकाओं और क्षेत्रों के भीतर डेटा नमूनों के मनमाने ढंग से कार्यान्वयन में प्लग-इन लिखा।


उदाहरण के लिए, हमारे पास 110 बनाने के लिए एक तथाकथित डिक्रिप्शन रिपोर्ट है, इसमें गैर-एकत्रित डेटा है, जिस पर इसे बनाया गया है। यह रिपोर्ट इस तरह दिखती है:




प्रपत्र की शुद्धता को सत्यापित करने के लिए, उपयोगकर्ता को किसी भी चयन, छंटाई, फ़िल्टरिंग, समूहन, ट्रांसपोज़िंग के साथ-साथ अपने स्वयं के परिकलित फ़ील्ड बनाने में सक्षम होना चाहिए। हमारे प्लगइन को तालिका के शीर्ष पर "क्रियाएँ" बटन द्वारा बुलाया जाता है।




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




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




हम एक नया कॉलम ऑर्डर सेट करते हैं और "लागू करें" पर क्लिक करते हैं और हमारी रिपोर्ट को आवश्यकतानुसार संशोधित किया जाता है - 7 बेस कॉलमों के बजाय, हम तीन देखते हैं, जिनमें से दो हमने अभी बनाए हैं:




यह हुड के तहत कैसे काम करता है?

प्लगइन एपी के माध्यम से एप्लिकेशन की वेब सेवा के साथ संचार करता है, इसने निम्नलिखित अनुरोध किया:


 api/neo/report/1392573?FR_date=20181231&FR_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB=&FR_%D0%9A%D0%BE%D0%B4_%D0%BE%D0%B1%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F=&SELECT=LEFT(\:1392578\:\,5),SUBSTRING(\:1392578\:\,6\,3),1392617:SUM&ORDER=1392617&FR_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB=1&TOTALS=1392617:SUM&LIMIT=10 

और मुझे यह जवाब मिला:


 { «columns»: [ «LEFT(:1392578:,5)», «SUBSTRING(:1392578:,6,3)», «1392617» ], «formats»: [ «SHORT», «SHORT», «SIGNED» ], «data»: { «LEFT(:1392578:,5)»: [ «60324», «40817», «47425», «47404», «60302», «47404» ], «SUBSTRING(:1392578:,6,3)»: [ «810», «810», «810», «840», «810», «978» ], «  »: [ «153 825.71», «527 901.11», «2 415 189.23», «3 000 000.02», «5 588 330.88», «58 000 000.00» ] }, «totals»: [ «„, “», «69 685 246.95» ] } 

यदि किसी को इस बात में दिलचस्पी है कि पंचक डेटाबेस में वास्तविक एसक्यूएल क्वेरी को क्या निष्पादित किया गया था, तो यहां यह है:


एसक्यूएल देखें

विश्लेषक इस एसक्यूएल को नहीं देखता है; वह नीचे वर्णित क्वेरी बिल्डर का उपयोग करता है।


 SELECT LEFT(a182088.val, 5) v13, SUBSTRING(a182088.val, 6, 3) v14, SUM(round(a182090.val, 2)) '  ' FROM neo a182081 LEFT JOIN neo a182083 ON a182083.up=a182081.id AND a182083.t=182083 LEFT JOIN neo a182088 ON a182088.up=a182083.id AND a182088.t=182088 LEFT JOIN neo a182090 ON a182090.up=a182083.id AND a182090.t=182090 LEFT JOIN neo a182091 ON a182091.up=a182083.id AND a182091.t=182091 LEFT JOIN neo a182092 ON a182092.up=a182083.id AND a182092.t=182092 LEFT JOIN neo a299 ON a299.t=299 AND a182083.val=a299.val LEFT JOIN neo a328 ON a328.up=a299.id AND a328.t=328 LEFT JOIN neo a303 ON a303.up=a299.id AND a303.t=303 LEFT JOIN neo a304 ON a304.up=a299.id AND a304.t=304 LEFT JOIN neo a182089 ON a182089.up=a182083.id AND a182089.t=182089 WHERE a182081.up!=0 AND length(a182081.val)!=0 AND a182081.t=182081 AND a182081.val='20181231′ AND a328.val ='1AND a303.val>='19000101′ AND a303.val<='20181231AND a304.val>='20181231′ AND a304.val<='20991231GROUP BY v13, v14 ORDER BY CAST(SUM(round(a182090.val, 2)) AS SIGNED) LIMIT 10 

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




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


क्वेरी तीन तालिकाओं को जोड़ती है, उनमें से निम्नलिखित डेटा फ़ील्ड्स चुनती हैं (अपेक्षित "कॉलम कॉलम")।



(पूर्ण आकार की तस्वीर)

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



समूहों के साथ चयनों के अलावा, उपयोगकर्ता धुरी तालिकाओं के तंत्र का उपयोग कर सकता है। हमने अपने प्लगइन में लोकप्रिय pivottable.js.org टेबल टूल को जोड़ा है।
हमारे लिए रुचि के कॉलम चुनें और पिवट टेबल मोड पर जाएँ:




यहाँ, drag'n'drop का उपयोग करके, हम अपने मनमाने क्षेत्रों सहित, हमारे द्वारा कॉन्फ़िगर किए गए नमूने द्वारा प्राप्त डेटा का विश्लेषण कर सकते हैं। इसके अलावा, यहां आप किसी भी क्षेत्र के डेटा को फ़िल्टर कर सकते हैं।




हमने रेखांकन बनाने के लिए मुफ्त उत्पाद www.amcharts.com का उपयोग किया। इसके साथ, चंचलता के साथ, सब कुछ काफी सरल है: हम चार्ट के प्रकार का चयन करते हैं और इंटीग्रल से प्राप्त हमारे डेटा सरणी के साथ घटक को इनिशियलाइज़ करते हैं:




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



तो उड़ गया या नहीं?


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


हमने एक परीक्षण स्क्रिप्ट में 20 उपयोगकर्ता क्रियाएं दर्ज कीं और इसे loadimpact.com सेवा पर चलाया। यह 27 अलग-अलग अनुरोधों को निकला, क्योंकि कुछ क्रियाएं सर्वर के लिए 2 अनुरोधों में की जाती हैं (उदाहरण के लिए, पृष्ठ प्रदर्शन का निर्माण)।


परीक्षा की पटकथा इस प्रकार निकली
 import { group, sleep } from 'k6′; import http from 'k6/http'; // Version: 1.3 // Creator: Load Impact URL test analyzer export let options = { stages: [ { «duration»: «3m0s», «target»: 25 } ], maxRedirects: 0, discardResponseBodies: true, }; export default function() { group("page_1 — https://*****.ru/neo/dict«, function() { let req, res; req = [{ «method»: «get», «url»: «https://*****.ru/neo/info», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «upgrade-insecure-requests»: «1», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8» } } }]; res = http.batch(req); sleep(0.62); req = [{ «method»: «get», «url»: «https://*****.ru/neo/info», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «upgrade-insecure-requests»: «1», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392573?FR_date=20181231&LIMIT=10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392573?FR_date=20181130&ORDER=1392617&LIMIT=10&RECORD_COUNT», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392573?FR_date=20181031», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392573?FR_date=20180930&RECORD_COUNT», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «*/*», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1387723?&LIMIT=10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «*/*», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1387723?&LIMIT=10&RECORD_COUNT», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «*/*», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392741?», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392757?&LIMIT=10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392768?&LIMIT=10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/download/neo/img/nav_dropdown_arrow.svg», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/download/neo/img/nav_detailed_report.svg», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/download/neo/img/nav_classifiers.svg», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/download/neo/img/nav_launch_report.svg», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/download/neo/img/nav_manage_form_status.svg», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/download/neo/img/nav_quality_management.svg», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/download/neo/img/nav_download.svg», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «image/webp,image/apng,image/*,*/*;q=0.8», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/download/neo/css/variables.css», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392779?&LIMIT=10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392538?&LIMIT=10&RECORD_COUNT», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/edit_obj/1392129», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/edit_obj/1390552», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/object/18», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1387723?&LIMIT=140,10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1387723?&LIMIT=140,10&RECORD_COUNT», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392573?FR_date=20180731&FR_%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB=&FR_%D0%9A%D0%BE%D0%B4_%D0%BE%D0%B1%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F=&SELECT=1392576,1392617:SUM,1392589&LIMIT=100», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392678?FR_date=20180831&FR_section=1&SELECT=1392698,1392685,1392690&LIMIT=10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392678?FR_date=20180630&FR_section=1&SELECT=1392698,1392685,1392690&LIMIT=10&RECORD_COUNT», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392678?FR_date=20180531&FR_section=1&SELECT=1392698,1392685,1392690&LIMIT=500», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392678?FR_date=20181231&FR_section=2&SELECT=1392698,1392685,1392690&LIMIT=500», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392678?FR_date=20181231&FR_section=4&SELECT=1392698,1392685,1392690,1392694&LIMIT=20», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/report/1392678?FR_date=20181231&FR_section=4&SELECT=1392698,1392685,1392690,1392694&LIMIT=20&RECORD_COUNT», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/neo/info», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/api/neo/report/1392678?FR_date=20190131&FR_section=1&FR_precision=280&SELECT=1392698,1392685,1392715&LIMIT=50», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/api/neo/report/1392678?FR_date=20190131&FR_section=1&FR_precision=280&SELECT=1392698,1392685,1392715&LIMIT=50&RECORD_COUNT», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/api/neo/report/1392573?FR_date=20190131&FR_section=1&FR_precision=280&FR_%D0%9A%D0%BE%D0%B4_%D0%BE%D0%B1%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F=A60302/9&LIMIT=10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://*****.ru/api/neo/report/1392573?FR_date=20190131&FR_section=1&FR_precision=280&ORDER=1392617&FR_%D0%9A%D0%BE%D0%B4_%D0%BE%D0%B1%D0%BE%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F=A60302/9&LIMIT=10», «params»: { «headers»: { «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «text/css,*/*;q=0.1», «referer»: «https://*****.ru/neo/dict» } } },{ «method»: «get», «url»: «https://fonts.gstatic.com/s/roboto/v19/KFOmCnqEu92Fr1Mu4mxP.ttf», «params»: { «headers»: { «origin»: «https://*****.ru», «accept-encoding»: «gzip, deflate», «accept-language»: «en-US», «user-agent»: «Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3183.0 Safari/537.36», «accept»: «*/*», «referer»: «https://fonts.googleapis.com/css?family=Roboto» } } }]; res = http.batch(req); // Random sleep between 5s and 10s sleep(Math.floor(Math.random()*5+5)); }); } 


यहां हमने देखा कि जब हमने स्क्रिप्ट चलाई थी - लोड जनरेटर ने हमारे आवेदन को प्रति सेकंड अनुरोधों की संख्या बढ़ा दी, तो हमें अधिकतम / शिखर प्रदर्शन खोजने के लिए एक क्लासिक सीढ़ी मिली:




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


:




, - SQL-. , , 8 33 SQL- : , -, SQL- ( , ) .


, 20-25 ( 20 ), — 1 . , : 1 2.4 1 .


( 10 ) 0.1-0.3 , .


, .

Source: https://habr.com/ru/post/hi451218/


All Articles