ذكاء الأعمال باللغة الروسية - الخماسيات

في إحدى ملاحظات المدونة الخاصة بنا ، قمنا بتغطية النهج المتبع في تخزين البيانات ومعالجتها ، والذي تلقينا بشأنه العديد من الأسئلة المتوقعة تمامًا بشأن مثل هذه الخطة: "بشكل عام ، نحن في انتظار التنفيذ ، والآن تطير ...". بناءً على نتائج العديد من التطبيقات ، سأتحدث عن إيجابيات وسلبيات هذا النهج باستخدام أحد تطوراتنا كمثال.


عادة ما نقدم لعملائنا أداة BI قوية ومرنة إلى حد ما يمكنها حل جميع مشاكلهم ، ولكن هذا منتج تجاري أجنبي ، ويزداد اهتمام العملاء بموضوع استبدال الواردات. كجزء من استكشاف آفاقنا في هذا الصدد ، بدأنا في اختبار مجموعة أدوات استقصاء المعلومات الخاصة بنا باستخدام حلول مفتوحة المصدر ومنصة تطوير قائمة على الخماسي.




أخذنا منتجنا التجاري الحالي كمرجع ، لذلك سنقوم بإجراء مقارنة معه كلما أمكن ذلك.


كانت المهمة لإنشاء المكونات التالية:


  • قاعدة بيانات لتخزين علامات البيانات ومعلومات الخدمة (المستخدمون ، الإعدادات ، إلخ) ؛
  • واجهة الويب للنظام و ORM ؛
  • وظيفة BI - تحميل البيانات والتقارير المخصصة والرسوم البيانية والجداول المحورية.

كأساس ، اتخذنا منصة تطوير تتضمن نموذج البيانات ، مصمم الاستعلام ، محرك القالب ، ويدعم نموذج الدور للتحكم في وصول المستخدم.


موضوع الأمر هو تسوية البيانات المصرفية وتحليل بياناتها المتراكمة على مدار السنوات السبع الماضية. يتم تخزين البيانات المصدر في HDFS ، ويتم احتساب التقارير نفسها في نفس المكان ، ثم تندرج نتائجها في نافذة قاعدة البيانات العلائقية. تحتوي واجهات المتاجر على حوالي 300 جيجابايت من البيانات لعشرات نماذج التقارير المختلفة وعدة مئات من التقارير ذات الصلة. يجب أن يخدم النظام 20 مستخدمًا في ذروة الحمل ، ويجب أن يكون وقت استجابة الواجهة في حدود 1 ثانية.


لم يستغرق إنشاء بنية بيانات وقتًا طويلاً: يتيح لك محرر نوع النظام الأساسي إنشاء ووصف كائنات الأعمال كما هي ، دون الحاجة إلى تكييف متطلبات المستخدم مع تفاصيل البيئة (أنواع البيانات والأبعاد ، والمفاتيح ، والقيود ، وأسماء حقول البيانات ، والمعرفات ، وما إلى ذلك). هذه هي الإضافة الأولى للخماسات التي يمكننا إصلاحها.


هذه هي الطريقة التي يتم بها إنشاء بنية البيانات - نحدد المصطلحات اللازمة ، ومن خلالها نقوم بتكوين كائنات مجال موضوعنا:



بعد عدة دقائق من النشاط بتنسيق نسخ / لصق ، حصلنا على بنية البيانات المطلوبة لنموذج واحد والعديد من الدلائل المساعدة لذلك. تبدو بنية بيانات النموذج (بعد التحلل من قبل المحلل) كما يلي:




يقرأ أحد المحللين المطلعين على المعنى التجاري للبيانات المقدمة هنا ما يلي: كل نسخة من F110 (نموذج 110 في مصطلحات CB) لها دقة معينة (يمكن أن تكون "دقيقة" أو "مدورة") وتتضمن مجموعة من الرموز ، لكل منها يشار إلى المبالغ بالروبل والعملة.


في متصفح البيانات ، حيث يتم تقديم البيانات وفقًا للهيكل المحدد ، نرى مثل هذا الجدول حول مثيلات النموذج الموجودة في النظام:




القيمة المحددة للنموذج هي تاريخ الإبلاغ الخاص به ، ويتم تخزين رموز التقارير في شكل صفيف تابع ، وحجمه نراه بين قوسين.


كما ذكرنا ، قمنا بتحليل البيانات قليلاً ، إذا ما قورنت بالهيكل الأصلي ، حتى لا يتم تخزين صفوف طويلة من القيم المكررة في قاعدة البيانات ، مثل ما يراه مبرمج أو مسؤول قاعدة البيانات:


الجدول مع البيانات في النظام المرجعي:


بالمناسبة ، هذا هو السبب في أننا نضع النظام الأساسي (وسنطلق عليه فيما بعد "التكامل") كأداة تطوير للمحلل ، وليس للمبرمج.


هيكل البيانات المساعدة أكبر بشكل غير متوقع ، لأنه يخزن جميع البيانات الأولية وإعدادات التقرير وقواعد التحقق من سلامة البيانات داخل التقرير وفي التقارير ذات الصلة ، ومحفوظات الحسابات والتسويات ، وكذلك بعض قواعد تحويل عمل البيانات أثناء إنشاء التقرير:



(لم يتم إعطاء الهيكل في مجمله)


عندما تكون بنية البيانات جاهزة ، يمكنك تحميل البيانات فيها. أسهل طريقة هنا هي تحميل ملف تم إعداده بتنسيق Integral (مشابه لـ .csv ، ولكن مع ترميز الكتابة). يحتوي هذا التنسيق على وصف للبيانات والبيانات نفسها.


عرض الملف

في المثال أدناه ، تصف الأسطر الثلاثة الأولى من الملف هيكل النموذج (إذا لم يكن موجودًا في النظام ، فسيتم إنشاؤه بعد ذلك) ، ثم البيانات نفسها - معلمات النموذج ومعلمات كائنات التقرير التابعة له.


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 ميغابايت عند إلغاء تحميلها في ملف ثابت. في قاعدة البيانات الأصلية (Oracle) ، يشغلونها 3.1 ميغابايت (بدون فهارس) في شكل عادي و 4.2 ميغابايت في واجهة متجر غير طبيعية ، والتي نحاول تكرارها كخماسيات. تتم فهرسة الخماسيات وتطبيعها ، وتشغل هذه البيانات بالفعل بتنسيقها 10 ميغابايت.


يتم تلخيص كميات البيانات للمقارنة في الجدول (بالميغابايت):
نصRDBMSخماسيات
معطيات1.13.15.1
لم تتم تسويته4.2
مؤشرات6.25.1
فهارس البيانات +9.310.2

في هذه المرحلة ، يجب الانتباه إلى الحجم الذي تشغله القواعد للنُهج المقارنة. نظرًا للتطبيع الإضافي للخماسيات والمصاريف الخاصة بالمؤشرات المركبة في القاعدة المرجعية ، فإن الحجم الإجمالي الذي تشغله قواعد البيانات هو نفسه تقريبًا.


قاعدة مرجعية:


خماسيات:


علاوة على ذلك ، في Integral ، قمنا على الفور بفهرسة جميع حقول الجدول ، وفي النظام المرجعي - فقط التاريخ والرمز والمبلغ بالروبل ، الأمر الذي سيتطلب تكاليف إضافية عندما تنشأ احتياجات جديدة.


كمرجع: في قاعدة البيانات ، يبلغ الحجم الإجمالي لهذا النموذج ، بما في ذلك التقارير والإعدادات الداعمة ، حوالي 400 ميجابايت (وهو صغير نسبيًا).


لذلك ، يتم تحميل البيانات ويظل الجزء الأصعب من المشروع أمامنا - إنشاء واجهة. تسمح لك واجهة النظام المرجعي بعرض بيانات النماذج والتقارير الداعمة والإعدادات ودورة حياة النماذج. لإدارة الوصول والتواصل مع قاعدة البيانات ، استخدمنا القدرات الأساسية لمنصتنا - نموذج القدوة ومصمم التقارير.


تبدو قائمة المستخدمين الذين لديهم أدوارهم كما يلي:




إذا قمت بالنقر فوق اسم الدور (الذي تم وضع علامة بيضوية حمراء في الشكل أعلاه) ، فيمكنك الاطلاع على محتوياته:




يمكن ضبط كائنات الدور على 3 مستويات وصول ؛ يمكن استخدام القناع:




يتم أيضًا تحرير البيانات عن طريق الواجهة الأساسية. هنا ، على سبيل المثال ، نموذج تحرير مستخدم:




لقد وضعنا القائمة المحددة لتطبيقنا وأماكن العمل الخاصة بها في ملف مضغوط واحد ، نظرًا لأنها جميعها من نفس النوع: نموذج طلب مكون من 2-3 عناصر وجدول مع نتائج الطلبات.




تبين أن البنية بسيطة للغاية: لقد أنشأنا العديد من استعلامات البيانات (طرق العرض) وكتبنا مكونًا إضافيًا ينفذ نماذج بيانات عشوائية في الجداول والحقول المضمنة في طرق العرض هذه.


على سبيل المثال ، لدينا تقرير يسمى فك التشفير لتكوين 110 ، ويحتوي على بيانات غير مجمعة تم إنشاؤها عليه. هذا ما يبدو عليه هذا التقرير:




من أجل التحقق من صحة النموذج ، يجب أن يكون المستخدم قادرًا على إجراء أي تحديدات أو فرز أو تصفية أو تجميع أو نقل أو إنشاء حقول محسوبة خاصة بهم. يسمى البرنامج المساعد لدينا من خلال زر "الإجراءات" في الجزء العلوي من الجدول.




يكرر المكون الإضافي وظيفة منشئ الاستعلام Integral ، ولكن بالإضافة إلى جلب البيانات ، يمكنه رسم الرسوم البيانية والجداول المحورية. على سبيل المثال ، نحتاج إلى التصفية حسب القسم وإضافة زوج من الأعمدة المحتسبة واختيار مجموعة من المبالغ التي تم تجميعها بواسطتها. وضعنا كل هذا:




تتم إضافة أعمدة جديدة إلى القائمة بواسطة رابط يحمل نفس الاسم. بواسطة زر "الحسابات" ، قمنا بتعيين الصيغ لهم باستخدام مُنشئ بسيط:




قمنا بتعيين ترتيب عمود جديد وانقر فوق "تطبيق" ويتم تعديل تقريرنا كما هو مطلوب - بدلاً من 7 أعمدة أساسية ، نرى ثلاثة ، اثنان منها أنشأنا للتو:




كيف يعمل تحت غطاء محرك السيارة؟

يتصل المكون الإضافي بخدمة الويب الخاصة بالتطبيق عبر api ، وقد أدى الطلب التالي:


 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» ] } 

إذا كان أي شخص مهتمًا بما تم تنفيذ استعلام SQL الحقيقي في قاعدة بيانات الخماسي ، فهو هنا:


عرض SQL

لا يرى المحلل هذا SQL ، فهو يستخدم أداة إنشاء الاستعلام الموضحة أدناه.


 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 

قد يبدو الطلب أكثر تعقيدًا مما كان متوقعًا ، لأنه يحدد البيانات الحالية لرموز التقارير استنادًا إلى صلاحيتها. في منشئ التقرير المتكامل ، يتكون هذا الاستعلام من أعمدة التقرير والمعلمات وشروط ربط الجدول ، إذا لزم الأمر.




يمكن للتكامل نفسه إنشاء شروط ربط الجدول ، حيث يتم تحديدها جميعًا من خلال العلاقات الخماسية ، ومع ذلك ، في حالة الإصدار ، كان علينا دمج الجداول يدويًا وتحديد شرط JOIN صراحة. الرموز في جملة ON هي معرفات لكائنات العمود والاستعلام.


يجمع الاستعلام بين ثلاثة جداول ، ويختار منها حقول البيانات التالية (مطلوب "أعمدة الاستعلام"):



(الصورة بالحجم الكامل)

يتم سرد أعمدة التقرير والحقول المحسوبة والمرشحات وما إلى ذلك ، والتي تشكل استعلام SQL ، هنا. يسمح لك Report Builder بتنفيذ أي تصميم تقريبًا للغة SQL ، بما في ذلك الانضمام إلى الاستعلامات والاستعلامات المتداخلة.



بالإضافة إلى التحديدات مع المجموعات ، يمكن للمستخدم استخدام آلية الجداول المحورية. لقد أضفنا أداة الجدول pivottable.js.org الشعبية إلى البرنامج المساعد لدينا.
حدد الأعمدة التي تهمنا وانتقل إلى وضع الجدول المحوري:




هنا ، باستخدام drag'n'drop ، يمكننا تحليل البيانات التي تلقتها العينة التي قمنا بتكوينها ، بما في ذلك حقولنا التعسفية. بالإضافة إلى ذلك ، هنا يمكنك تصفية البيانات بالإضافة إلى أي حقل.




استخدمنا المنتج المجاني www.amcharts.com لرسم الرسوم البيانية. مع ذلك ، كما هو الحال مع pivottable ، كل شيء بسيط للغاية: نقوم باختيار نوع المخطط وتهيئة المكون من خلال مجموعة البيانات الخاصة بنا التي تم الحصول عليها من Integral:




مع هذا ، في الواقع ، أكملنا المهمة إلى حد يرضي مستخدمي المنتج الحالي. الآن لدينا نظام يلبي متطلبات استبدال الواردات: جميع المنتجات مجانية وقابلة للاستبدال. نعم ، لقد أدركنا بعيدًا كل الاحتمالات التي يوفرها النظام الحالي ، ولكن فقط تلك الإمكانيات الضرورية لهذا العميل. لكن بدأنا للتو!



طار أم لا؟


يجب أن نناقش أيضا أداء النظام الناتج. في هذه المشكلة ، مع وجود كمية كبيرة بما فيه الكفاية من البيانات (مئات غيغا بايت) ، تؤثر العينات على أجزاء صغيرة ، يتم دائمًا تجميع الخماسيات باستخدام فهارس. يؤدي هذا إلى حقيقة أنه في أي حجم من قاعدة البيانات ، تتم معالجة الاستعلامات بسرعة مقبولة ، دون أن يؤدي ذلك إلى تدهور في الأداء يشبه الانهيار الجليدي.


قمنا بتسجيل 20 إجراء من إجراءات المستخدم في برنامج نصي للاختبار وقمنا بتشغيلها على خدمة loadimpact.com . لقد تم إيقاف 27 طلبًا مختلفًا ، نظرًا لأن بعض الإجراءات يتم تنفيذها في طلبين إلى الخادم (لبناء عرض صفحة ، على سبيل المثال).


تحول اختبار البرنامج النصي من هذا القبيل
 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/ar451218/


All Articles