HighLoad ++ ، Anastasia Tsymbalyuk ، Stanislav Tselovalnikov (Sberbank): كيف أصبحنا MDA

سيُعقد مؤتمر HighLoad ++ التالي يومي 6 و 7 أبريل 2020 في سان بطرسبرغ.
التفاصيل والتذاكر هنا . HighLoad ++ سيبيريا 2019. قاعة "كراسنويارسك". 25 يونيو ، 2 مساءً الملخصات والعرض .

إن تطوير نظام إدارة البيانات الصناعية ونشرها من الصفر ليس بالمهمة السهلة. خاصة عندما يكون هناك تراكم كامل ، وقت العمل هو ربع ، ومتطلبات المنتج هي اضطراب دائم.



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

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

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

Anastasia Tsymbalyuk (فيما يلي - AC): - اسمي Nastya ، وهذا Stas!

Stas Tselovalnikov (فيما يلي - SC): - مرحبًا بالجميع!

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

SC: - Nastya ، ما هو MDA؟

AC: - ستاس ، أعتقد أننا سننتقل بسلاسة إلى هذا الآن. بتعبير أدق ، سأتحدث عن هذا قليلاً في نهاية العرض التقديمي. دعنا نتحدث عنا أولاً:



يمكنني أن أصف نفسي على أنني طالب التآزر في حلول تكنولوجيا المعلومات الصناعية.

SC: - وأنا؟

ماذا يفعل فريق SberData؟


AC: - وأنت مجرد مستودون صناعي ، لأنك جلبت أكثر من حل لحفل التخرج!

SC: - في الواقع ، نحن نعمل معًا في Sberbank في نفس الفريق وندير البيانات الوصفية لـ SberData:



AC: - SberData ، إذا بطريقة بسيطة - هذه منصة تحليلية حيث تتدفق جميع المسارات الرقمية لكل عميل. إذا كنت عميلاً لـ Sberbank ، فإن جميع المعلومات المتعلقة بك تتدفق هناك بالضبط. يتم تخزين الكثير من مجموعة البيانات هناك ، لكننا نتفهم أن كمية البيانات لا تعني جودتها. والبيانات التي لا تحتوي على سياق تكون أحيانًا عديمة الفائدة تمامًا ، لأنه لا يمكننا تطبيقها أو تفسيرها أو حمايتها أو إثرائها.

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

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

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

لذلك ، تخيل: خارج النافذة هو شهر نوفمبر ، طارت جميع الطيور جنوبًا ، نحن حزينون ... وبحلول ذلك الوقت كان لدينا طيار ناجح مع الفريق ، كان هناك عملاء - بقينا جميعًا في منطقة الراحة حتى حدثت نقطة اللاعودة.

نظام إدارة البيانات الوصفية النموذجي




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

  • مستوى مسرد الأعمال.
  • مستوى النموذج المنطقي.
  • مستوى النموذج المادي.
  • حالة البيئة التي تلقيناها بسبب عكس البيئات الصناعية.

وكل هذا يجب أن يكون متسقًا.

AC: - نعم حقا. ولكن هنا سأشرح أيضًا بطريقة أو بأخرى بطريقة بسيطة ، لأنني لا أستبعد أن مجال الموضوع غير واضح وغير مفهوم ...

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

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

يتعلق النموذج المادي عندما يكون دور المبرمجين القاسيين والمهندسين المعماريين الذين يفهمون حقًا كيفية هبوط هذه الأشياء - في أي جدول يتم وضعه ، والحقول التي يتم إنشاؤها ، والفهارس المعلقة ...

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

حالة لوصف البيانات الوصفية


SC: - دعنا نشرح ذلك بمثال ملموس ، على سبيل المثال ، لدينا أربعة من هذه المستويات المعينة. لنفترض أن لدينا هؤلاء الأشخاص الجادين في العلاقات الذين يعملون على مستوى مسرد مصطلحات الأعمال - فهم لا يفهمون على الإطلاق كيف وما هو مرتب في الداخل. لكنهم يفهمون أنهم بحاجة إلى عمل شكل من أشكال التقارير الإلزامية ، ويحتاجون ، على سبيل المثال ، للحصول على متوسط ​​الرصيد في الحسابات الشخصية:



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

يقول: "اسمع ، هنا لديك القصة بأكملها مقسمة إلى حسابات منفصلة ككيانات ، ولها سمة - متوسط ​​الرصيد."

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

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

التسجيل والتخزين على مستوى البيانات الوصفية


AC: - كيف يتم تخزين كل شيء معنا؟ هذا شكل مبسط للغاية من المثال الذي رسمه ستاس في وقت سابق! كيف سيقع كل هذا معنا؟



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

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

SC: - هنا يجب أن يقال أن كل مكعب هو مجرد جدول في نظامنا حيث نقوم بتخزين البيانات الوصفية ، ونطلق عليها اسم عنصر التحكم.

متطلبات البيانات الوصفية


ماذا لدينا عند المدخل؟ عند المدخل تلقينا متطلبات مثيرة للاهتمام للغاية. كان هناك الكثير منهم ، ولكننا نريد أن نعرض هنا ثلاثة



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

  • بشكل افتراضي - الحالة الحالية ؛
  • حسب التاريخ؛
  • برقم المراجعة.

كان المطلب الثاني أكثر إثارة للاهتمام: قيل لنا أنه يمكنهم العمل معنا على الأشياء ، ولكن عليهم أن يبرمجوا كثيرًا في Java ، لكنهم لا يريدون ذلك. اقترحوا أن نخلط 100 كائن (أو 10) في وقت واحد ، ويجب علينا التعامل مع هذا العمل (لأننا نستطيع). ماذا يعني الخلط؟ على سبيل المثال ، جاءت 10 أعمدة. لديهم رابط لمعرف الجدول ، ولكن ليس لدينا الجدول نفسه - لقد جاء في ذيل JSON. "أنت تفكر وتتعامل - من الضروري أن تستطيع"!

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

كان لدينا مثل هذه القصة عند المدخل.

تقديرات تقديرية




AC: - وفقًا لتقديراتنا التقريبية ، من أجل تنفيذ هذا المفهوم بالكامل ، يحتاج كل عنصر تحكم للمشاركة في سبع واجهات: بسيطة (بسيطة) ، لكتابة بواسطة الكتابة / القراءة والحذف ...

ثلاث أخرى - للكتابة / القراءة / الحذف العالمية ، ر بمعنى أنه يمكننا أن نرميها بأي ترتيب وكيفية نقل الحساء إلى النظام ، وستحدد أي ترتيب لحذفه أو وضعه أو قراءته.

شيء آخر - لبناء تسلسل هرمي حتى نتمكن من الإشارة إلى النظام - "أعادونا من كائن إلى آخر" ؛ وتقوم بإرجاع شجرة كائنات متداخلة.

تعقيد التنفيذ


SC: - بالإضافة إلى المتطلبات الفنية التي جاءت إلينا في وقت بدء هذه القصة ، واجهتنا صعوبات إضافية.



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

AC: - هذا هو الاضطراب الذي تم الإعلان عنه في البداية.

SC: - التالي ...

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

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

نهج قياسي


AC: - نعم ، في الواقع 42 APIs في الأسبوع هي مجرد غيض من فيض. نحن ندرك جيدًا أنه من أجل ضمان عمل واجهات برمجة التطبيقات الـ 42 هذه ، نحتاج إلى:

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



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

حتى بعد العمل في هذا الوضع لبضعة أيام (كان لدينا ثلاثة فرق) ، وصلنا إلى درجة حرارة متوهجة ... كان الجميع متوترين ... وأدركنا أننا بحاجة للبحث عن نهج مختلف.

نهج مخصص


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

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



أي أنه يكفي الخلط مرة واحدة - إنشاء قالب ، ثم استخدام كل هذه المعلومات لكل من الكائنات الموجودة والجديدة. نقدم هنا مفهومًا آخر - #META_META. سأشرح لماذا لا ارتبك.

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

آلية لضمان التأريخ والمراجعة


SC: - لقد لخصت بقية خطابنا. سنقول بمزيد من التفصيل.

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

أولاً ، كيف حللنا قضية التأريخ والمراجعة. ربما هذا مشابه لعدد الأشخاص. ضع في اعتبارك استخدام البيانات الوصفية كمثال ، والذي يصف حقلاً واحدًا في جدول الترحيل (كمثال):



يحتوي على معرف - "7" ، واسم - يحمل_note ، ورابط id_table 73 ، وحقل - 255. ندخل في المفتاح الأساسي والبديل حقل (من نوع التاريخ) من النقطة الزمنية التي يصبح هذا الإدخال صالحًا منها - valid_from. وحقل آخر - بأي تاريخ يكون هذا السجل صالحًا (valid_to). في هذه الحالة ، يتم ملؤها بشكل افتراضي - من الواضح أن هذا الإدخال صالح دائمًا من حيث المبدأ. ويحدث هذا حتى نريد تغيير ، على سبيل المثال ، طول الحقل.
بمجرد أن نرغب في القيام بذلك ، نقوم بإغلاق سجل Valid_to (نقوم بإصلاح الطابع الزمني الذي وقع فيه الحدث). في الوقت نفسه ، نحقق رقمًا قياسيًا جديدًا ("300"). من السهل ملاحظة أنه في هذه الحالة ، إذا نظرت إلى قاعدة البيانات من نقطة زمنية من خلال "المعركة" (بين) بين valid_from و valid_to ، فسوف نحصل على سجل واحد ، ولكنه ذو صلة في ذلك الوقت. وفي الوقت نفسه ، احتفظنا في وقت واحد ببعض سجل المراجعة:



قمنا فيه بتسجيل المراجعات التي تزداد في معرف التسلسل (التسلسل) ، والنقطة الزمنية التي تتوافق مع معرف المراجعة هذا. لذا تمكنا من إغلاق الطلب الأول.

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

تحديث دفعة


SC: - كان الشرط الثاني بالنسبة لي أكثر إثارة للاهتمام. بصراحة ، عندما وصل الأمر إلى المدخل ، دخلت في البداية في ذهول. لكن القرار قد حان!

أذكركم ، هذه هي الحالة نفسها عندما ، دعنا نقول ، جاء إلينا JSON مع حزمة لعدد nth من الكائنات التي تحتاج إلى إدراجها في النظام. في الوقت نفسه ، في البداية لدينا 10 أعمدة تشير إلى جدول غير موجود ، والجدول ذهب في ذيل JSON. ماذا أفعل؟



لقد وجدنا طريقة للخروج باستخدام آلية الاستعلامات الهرمية العودية - وهذا بالتأكيد هو الرابط المعروف عن طريق البناء المسبق. لقد فعلنا ذلك على النحو التالي: هنا جزء من رمز الإنتاج لدينا:



عند هذه النقطة (قسم من التعليمات البرمجية محاطة بدائرة بيضاوية حمراء) هي النقطة الرئيسية التي تعطي فكرة. وهنا يرتبط الكائن بعنصر آخر مرتبط بمفتاح خارجي موجود في النظام.

لفهم: إذا كتب شخص ما التعليمات البرمجية في Oracle ، فهناك All_columns ، All_all_ الجداول ، جداول All_constraint - هذا هو القاموس الذي تتم معالجته بواسطة البرامج النصية (مثل تلك المعروضة في الشريحة أعلاه).

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

على سبيل المثال ، حقل - كيف يمكن أن يبدو؟ هذا هو رمز النظام الأساسي: oracle KP.، Production. KP ، my_scheme. KP ، my_table. KP ، وما إلى ذلك ، حيث KP هو رمز الحقل. لذلك سيكون هناك مثل هذا واصف.

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

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

بقدر ما أفسر Stas بشكل صحيح ، يمكننا نقل جميع هذه الكائنات إلى النظام بأي ترتيب ولا داعي للقلق بشأن كيفية إجراء هذا الإدخال - لقد ألقينا فقط مجموعة حساء في النظام ، وتم تحديد كل ذلك في أي ترتيب لإدخاله.
الشيء الوحيد الذي أملكه هو السؤال: ماذا لو أدخلنا الكائن لأول مرة؟ لقد أدخلنا الجدول من قبل ، ولا نعرف معرفه. كيف نشير (مثال افتراضي بحت) أننا بحاجة إلى إدراج جدولين ، يحتوي كل منهما على عمود؟ كيف نشير إلى أن عمود JSON هذا يشير إلى الجدول 1 وليس الجدول 2؟

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



يتم استخدام الواصفات في النظام كنوع من حقول الذاكرة غير الموجودة ، ولكنها تحل محل المعرّف. في تلك اللحظة ، عندما يفهم النظام في البداية أنه من الضروري إدراج الجدول - إدراج ، سيتلقى معرف ؛ وبالفعل في مرحلة إنشاء استعلام SQL للإدراج والعمود ، سيعمل على معرف. لا يمكن للمستخدم أخذ حمام بخار: "امسك المقبض ونفِّذ!". النظام سيفعل.

استعلام عام على مجموعة من الكائنات ذات الصلة


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

السؤال:" كيف؟! "

ذهبنا بالفعل بنفس الطريقة. نفس البناء بالضبط:



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

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

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

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

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

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

  • أولاً ، يعد هذا "التحديث" العالمي نفسه طريقة يمكنها القيام بالتحديث / الإدراج / الحذف (يؤدي الحذف إلى إغلاق سجل) في كائن أو مجموعة من الكائنات المنقولة بترتيب عشوائي.
  • والثاني هو طريقة يمكنها إرجاع المعلومات العامة على كائن واحد فقط ؛
  • والثالث هو نفس الأسلوب الذي يمكنه إرجاع معلومات الانضمام المتصلة بمجموعات من الكائنات.

هذه هي الطريقة التي تحولت بها ، وصنعنا جوهرها. ثم ننتقل إلى الجزء المفضل لديك.

نقطة دخول التطبيق


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



دعنا نعود إلى البداية لإغراقك ... كيف سيتم تقديم البيانات الوصفية في النظام هنا؟



إذا رأينا أن هناك جدولًا في البيئة ، فسيقع في نظامنا كسجل واحد في كائن الجدول وسجلين في كائن الحقل. في الجوهر ، قمنا بتجميع هيكل.

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



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

SC:- عذرا ، ولكن كيف يمكنني أن أنقل إليك في أعمدة إجابة مسطحة ، على سبيل المثال ، والتي لم يتم إنشاؤها بعد ، سيتم إنشاؤها في وقت ما ، والله أعلم ما يمكن أن تكون؟ .. لذلك ، فإن الخيار الوحيد في شروط الكود الديناميكي هو تكوين التفاعل بين الأساسية والتطبيق ، لنقل هذه المعلومات إليك - فقط كما نراها. أعتقد أن هذا القرار كان مبدعًا من وجهة نظري لأنه جاء منك فقط.

AC: - الآن لن نناقش هذا. قبل أسبوعين من نهاية الموعد النهائي ، بقيت مع حقيقة أن لدي هذه الطرق الثلاث في يدي (على اليسار في الشريحة السابقة) التي تعاملت مع الهيكل العالمي (على اليمين في نفس الشريحة).

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



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

بقعة. نهج


ثم اتضح لنا أنه كان من الرائع تقديم مواصفات لخدمتنا. باختصار ، لعمل قائمة بأشياء في نظامنا ، قائمة بالنقاط ، التلاعبات والأشياء التي يتلاعبون بها مع بعضهم البعض. حدث أن شركتنا تستخدم Swagger لهذه الأغراض كنوع من الحلول المعمارية.



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

SC:- ماذا يعني أين؟ أنت وأنا لدي MetaMeta ، التي توفر النواة في وضع الوقت الحقيقي. تعمل النواة في التنفيذ في الوقت الفعلي على إنشاء استعلام SQL يتصل بقاعدة البيانات. كل شيء موجود ، ليس فقط ما تحتاجه. هناك أيضا روابط بين الأشياء.

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

بقعة. OAS + المقاود


لذا ، من السهل ملاحظة ما تتكون منه المواصفات:



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

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

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

كود التطبيق. Swagger Codegen + Handbars


كل هذا قمنا بتشفير وتسجيل وتشكيل المواصفات. كان كل شيء رائعًا وجيدًا. حصلنا على جميع السيناريوهات السبعة الممكنة لكل كائن.

أعطته للمستخدم. قال: "واو! رائع! الآن نريد استخدامه! " ما هي المشكلة مرة أخرى؟

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

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



من أجل وضع كل هذا موضع التنفيذ ، كنا بحاجة إلى تحويلات "رمزية" ...

التحويلات


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

يتم إنشاؤه بشكل ملحوظ: هناك كل أوصاف الصف ، كل أوصاف نقطة النهاية ... - يعمل. يمكنك تشغيله محليًا - سيعمل. المشكلة واحدة: إرجاع بذرة - كل طريقة لا تزداد.

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



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

ربما كانت الحالة الأكثر صعوبة هنا هي إعطاء المستخدم شجرة ، لأن النواة ترجع لنا أيضًا أربعة أسطر - اذهب وانظر إلى أي مستوى يوجد التسلسل الهرمي. استخدمنا آلية العلاقات الخارجية ، الموجودة في IDE ، أي ذهبنا إلى MetaMetu ، ونظرنا في جميع المسارات من واحد إلى آخر ونولد شجرة ديناميكيًا من خلالها. يمكن للمستخدم أن يطلب منا من أي شيء أي شيء يريده - سيتم إرجاع شجرة جميلة إليه عند المخرج ، حيث تم وضع كل شيء بشكل هيكلي بالفعل.

SC: - سوف أوقفك للحظة ، لأنني بدأت بالفعل في الضياع. سأسألك بأسلوب "هل أفهم ذلك بشكل صحيح" ...

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

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

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

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

ضبط MetaMeta


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



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

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

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

نتيجة


SC: - إنه رائع ، ولكن الكثير من النظريات. هل يمكنك إعطاء مثال عملي؟

AC: - نعم ، لقد أعددتها بشكل خاص. قبل مغادرته لحضور المؤتمر ، مساء يوم الجمعة ، قبل 5 دقائق من نهاية يوم العمل ، أخبرني ستاس: "أوه ، انظر! لقد أصدرت رقعة نموذجية - كم هو رائع! سيكون من الرائع تحديث خدمتنا ". احتوى التصحيح على شيئين فقط ، لكنني أفهم أنه مع النهج القديم ، يجب أن أكون مرتبكًا وأكتب أو أضيف 7 واجهات برمجة تطبيقات.

على الفور فقط كان لدي نقرة زر لجعل كل هذا العمل السحري. لقد



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



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







وكلها تعمل! لم أكتب سطرًا واحدًا من التعليمات البرمجية على الإطلاق.

ملخص


SC: - أولاً ، ما هي الحقيقة؟ لقد أدارنا المنطق الأكثر تعقيدًا ، والذي سيستغرق مبرمجينا وقتًا أطول ، لحزم كود نواة ديناميكي بنسبة 100٪ يمكن أن يعمل مع الكائنات - تلك الموجودة والأخرى التي ستكون:



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



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



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



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

نتيجة لذلك ، لدينا أربع نقاط رئيسية ، ويسمى هذا النهج MDA (العمارة مدفوعة بالنموذج). لسبب ما ، يُترجم هذا على أنه "بنية تعتمد على النموذج" ، على الرغم من أنني أسميها "طريقة تطوير البرمجيات".



ماهي النقطة؟ يمكنك إنشاء نموذج ، والاتفاق على قواعد معينة. ثم تقوم بإنشاء أنماط تحويل لهذا النموذج مرة واحدة في بعض لغات البرمجة المتاحة لك. كل هذا يعمل على تغيير الأشياء القديمة ، لإضافة أشياء جديدة. تكتب الرمز مرة واحدة ولم تعد تهتم.

SC: - انتظرت بصدق التقرير بأكمله عند الإجابة على هذا السؤال. دعنا ننتقل إلى الشرائح المفضلة.

القرار. معالجة. قبل


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



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



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

وفقًا للتقديرات ، تم تخفيض جميع تكاليف العمالة لتطوير جميع برامجنا بمقدار 6 مرات.

SC:- من نفسي ، أريد أن أقول بصدق أن الرقم 6 ليس في مهب ، بل إنه محافظ. في الواقع ، الكفاءة أعلى.

خطط مستقبلية


طلبت في نهاية التقرير أن تتحدث عن خططنا. بادئ ذي بدء ، يبدو أننا يجب أن نحقق ليس حلاً كاملاً فحسب ، بل حلًا مغربًا ومعبورًا. يمكن تطبيق هذه التقنيات في مكان قريب ، حيثما كان ذلك مناسبًا. أود أن أحقق منتجًا نهائيًا سيتم تطويره ، والذي سنكون قادرين على تقديمه نيابة عن بنك Sberbank.

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

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



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

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

كل هذه الأدوات موجودة في المجال العام - يمكنك بالفعل البدء في جوجل وفهم كيفية استخدامها. أنا متأكد من أن استخدامها سيجعل حياتك أسهل وأفضل ، ويوفر وقتًا عامًا للمهام الجديدة الطموحة والرائعة. شكرا!

الأسئلة


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

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

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

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

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



ج: - لدي سؤال ثان. وما هو مثال للاستخدام من الحياة؟ أفهم أنه من الناحية النظرية يبدو أنه يمكنك على الأقل وصف العالم كله باستخدام كائن META_META ... ولكن في الحياة ، كيف تستخدمه؟ بالحكم على كيفية تنفيذها (يجب وضع كل شيء في بعضها البعض) ، يجب أن يتباطأ!

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

ج: - كنت أعول على مثال أكثر تحديدًا.

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

SC:- الوصول من خلال REST API ، غالبًا ما يكون Java ، على الرغم من أنه يمكن أن يكون أي لغة. تم نشر خدمتنا (dhttps ، اسأل https - ستستعيد JSON). تلك الأجزاء من التعليمات البرمجية التي عرضناها هي SQL. من أجل فهم الترتيب الذي يجب معالجته ، قمنا ببعض ضبط SQL على قواميس DBMS وقمنا بوضعها في مخطط منفصل في شكل تمثيلات ملموسة. وفقًا لذلك ، عند تحرير تصحيح النموذج ، يتم النقر فوق الزر "تحديث العرض المادي" (تظهر الحقول +). لكن رمزنا حقًا هو Java و Oracle.

AC:- تجدر الإشارة هنا إلى أننا قررنا تقسيم مجالات المسؤولية. قمنا بنقل كل السحر عمداً إلى النواة ، ويقوم التطبيق ببساطة بتفسير هذه الإجابات بشكل صحيح. أي أن آلية الانضمام نفسها تحدث في النواة ، وتقوم Java ببساطة بتفكيكها بالكامل في الشجرة وتعطي المستخدم النتيجة النهائية.

ج: - وماذا يفعل Code Gens - هل تكتب بالفعل منطق الاستفسارات المعقدة هناك؟ أم أنه يتم على جانب العميل؟ نحن بحاجة إلى فهم الجانب الذي يتم وصفه ... لقد قدموا ، اتضح ، Code Gen ، حيث من الضروري أن يصف بدقة في بعض الهياكل: على سبيل المثال ، أريد أن تتعلم API الخاصة بي مثل هذا ومثل هذا الانضمام ، انتقل من خلال القائمة ؛ ثم قل ما إذا كان هناك من الداخل أم لا ... - الاستعلامات المعقدة كافية. في أي مرحلة يتم كتابة هذا؟

SC:- إذا فهمت سؤالك بشكل صحيح ، فهذه هي القصة بالضبط عندما يقول عملاؤنا ، عملائنا (هذا فريق داخل النواة ، المنصة): "اسمع ، لا نريد البرمجة - أعطنا هذا." "هذا كل شيء" تم القيام به في القلب. جوهر - ماذا في الأساس؟ 80 في المائة ، ربما 90 - هذا هو توليد شفرة ديناميكية ، النص الذي سيتم استدعاؤه من تحت PL / SQL ، ولكن تم تحويله إلى قاعدة البيانات. هناك ، حتى في الوقت المناسب ، يتم إنشاء هذا الخط لفترة أطول ، ثم يتم الوصول إلى قاعدة البيانات (على سبيل المثال ، طلب الانضمام) ، وإرجاعها ، ولفها في JSON ، وعرضها رأسًا على عقب. علاوة على ذلك ، تقوم Java بتحويل كل هذا إلى عقد ، والذي يعتمد على البنية.

و:- كشفت عن حل تحديث دفعة. وكيف يتم ضمان التسليم - هل وصلت الحزمة بأكملها أو جزء من الحزمة؟ هل لديهم صائد مؤقت معين؟ وكيف تتأكد من عدم سقوط الخدمة ، أو عدم وجود أي نوع من الترابط في هياكل البيانات ، بحيث لا توجد أخطاء؟

SC: - لدينا بروتوكول - هناك وضعان للتحديث. في أحدها يمكنك تعيين علامة "تطبيق كل ما تستطيع". هناك بعض البرامج التي يحولها Excel إلى JSON - قد يكون هناك 10 آلاف سطر. وأنت ، بشكل دقيق ، يمكن أن يكون خطان غير صالحين (خطأ). وإما أن تقول: "طبق كل ما تستطيع" ؛ أو "تنطبق فقط إذا لم يكن للقصة بأكملها خطأ واحد." هناك ، الحالة التراجعية ستكون التراجع ، على سبيل المثال. في الواقع ، يتم إدراج إدراج في قاعدة البيانات ، ولكن لا يسمى الالتزام.

في حالة وجود خطأ - إنه يدعو إلى التراجع ، فهو موجود في البروتوكول ؛ تحصل على البروتوكول على أي حال. تحصل على حالة في كل سطر ، ولديك معرف في حقل منفصل - إما رقم (معرف كائن) أو مفتاح بديل أو كليهما. يجعل البروتوكول من الممكن فهم ما حدث لطلبي.

AC: - يشير المستخدم نفسه في أي من الخيارات يجب عليه التحرك. نمرر هذه المعلمة إلى جانب النواة ، وينتج النواة بالفعل كل السحر ، ويعطينا الإجابة ، ونفسرها.

و:"لماذا لم تستخدم أي مُجمّع تعبير مُضمن يساعد في تحديد القاعدة؟" لنفترض أن لدينا قالبًا ، فأنا أكتب في بعض اللغات (لغة كتابة مكتوبة / غير مكتوبة) ؛ كتب: "أريد قائمة". تم تمرير هذا المقتطف بحيث يقوم بعض معالج الشفرة بمضغه بالكامل ، ووضعه في قاعدة بيانات NoSQL ، كما هو مقترح في السؤال الأول ... ومع ذلك ، ليس من الواضح لماذا قاعدة البيانات العلائقية ولماذا وكيفية التعامل مع تكرار البيانات؟ يرسل لك الرجل نموذجًا يحتوي على مليار قمامة ... كيف يتم التوصل إلى هذه الاتفاقات عندما يحتاجها الشخص؟



SC:"سأحاول الإجابة كما فهمت السؤال." معظم البرنامج يتواصل معنا الآن. عند إنشاء آلية تفاعل التكامل ، لا يتواصل معنا الكثير من الناس كبرامج. هناك ، بالطبع ، حالات يرسل فيها الأشخاص علامة exelniks للتسرب الأساسي: نقوم بعمل JSONs منهم ، ونقوم بالتحميل ، ولكن هذا هو الإعداد الأساسي.

ولدينا وضع عندما أرسلت 5000 سطر ، عاد منها 4900 سطر بالحالة "لقد قمت بمعالجة ، ولم أجد أي تغييرات ، ولم أفعل شيئًا". ولكن هذا ينعكس في البروتوكول وليس هناك خطأ. هذا من ناحية التكرار.

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

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

لا يتم قياسنا بسبب عدد سطور الشفرة التي كتبناها: "هل حللت مسألة الخدمة واستقرارها أم لا؟" لا يمكنك الكتابة على الإطلاق - الشيء الرئيسي هو أنه يعمل. وبهذا المعنى ، كان الأمر ببساطة أسرع وأكثر ملاءمة بالنسبة لنا للقيام بذلك.

أنا لا أتعامل مع مورد معين ، ولكن قواعد البيانات العلائقية تم تطويرها منذ 20 عامًا! الأمر ليس كذلك. خذ ، على سبيل المثال ، Word أو Excel على Windows - أنت لا تبرمج الكود هناك ، والذي بمساعدة "Assembler" يصل وينقل رؤوس القرص الصلب لكتابة ملف ... نفس الشيء هنا! لقد استخدمنا للتو تلك التطورات التي كانت في RDBMS ، وكانت مريحة.

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

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

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



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

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

ج: - أنا من مركز التكنولوجيا المالية. رأيت كلمة مألوفة هناك - DACUM الرئيسي. منصتنا لديها بيانات التعريف الخاصة بها. كيف حالك أصدقاء - مباشرة مع جداول Oracle أو مع بيانات التعريف الخاصة بنا في هذه الحالة؟ لأنه في حالتنا ، فإن كوننا أصدقاء مع جداول أوراكل ليس إرشاديًا بالكامل.

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


القليل من الدعاية :)


أشكركم على البقاء معنا. هل تحب مقالاتنا؟ هل تريد رؤية مواد أكثر إثارة للاهتمام؟ ادعمنا عن طريق تقديم طلب أو التوصية لأصدقائك VPS القائم على السحابة للمطورين من $ 4.99 ، وهو نظير فريد من نوعه لخوادم مستوى الدخول التي اخترعناها لك: الحقيقة الكاملة عن VPS (KVM) E5-2697 v3 (6 نوى) 10GB DDR4 480GB SSD 1Gbps من $ 19 أو كيفية تقسيم الخادم؟ (تتوفر الخيارات مع RAID1 و RAID10 ، حتى 24 مركزًا و 40 جيجابايت DDR4).

Dell R730xd أرخص مرتين في مركز بيانات Equinix Tier IV في أمستردام؟ فقط لدينا 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV من 199 دولارًا في هولندا!Dell R420 - 2x E5-2430 2.2 جيجا هرتز 6C 128 جيجا بايت DDR3 2x960GB SSD 1Gbps 100TB - من 99 دولار! اقرأ عن كيفية بناء مبنى البنية التحتية الفئة c باستخدام خوادم Dell R730xd E5-2650 v4 بتكلفة 9000 يورو مقابل سنت واحد؟

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


All Articles