حكاية الأخطبوط



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

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

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

الجزء الأول: "Cthulhu ، تعال"


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

لماذا الأخطبوط؟ لأنه يبدو كل شيء مثل الأخطبوط. الأخطبوط هو نظام حقل عام يصف:

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

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

  • حقول الإدخال
  • حقول الاختيار
  • التجمعات الميدانية؛
  • حقول النص.

شيء مثل ترميز HTML ، حيث توجد علامات ، والعلامات لها معلمات وقيم يدخلها المستخدم أو يختارها من قائمة محددة مسبقًا.

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

الجزء الثاني: الهيكل


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

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

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

الجزء الثالث: العرض


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

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

كيف يتم تنفيذ هذا؟

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

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

الجزء الرابع: البحث


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

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

الجزء الخامس: التكامل


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

من خلال كافكا ننظم قناة تواصل مع شريك ونحصل على:

  • تحديث تخطيط المجال للمنتجات الشريكة ؛
  • البضائع أنفسهم والتلاعب معهم.

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

الجزء السادس: المشاكل


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

قررنا تقسيم إصدار الخلفية من مخططات الأخطبوط إلى مرحلتين:

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

هذا النهج حل مشكلة ذاكرة التخزين المؤقت ، وتقليل وقت عودة الحقول.

الجزء السابع: اختبار A / B


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

كيف فعلنا هذا؟

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

قدمنا ​​أيضًا اختبارات A / B على مستويات الأخطبوط الأخرى: في مخالب والقواميس.

الجزء الثامن: من أين تقدم؟


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

الجزء التاسع: مثال


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

مثال JSON من فئة شقة للبيع - شقة المعلمات
 { "title":" ", "widget":"group", "order":17, "params":{ "required":false }, "subfields":[ { "title":"", "widget":"section", "order":18, "params":{ "required":false }, "subfields":[ { "title":"  ", "widget":"select", "order":19, "slug":"komnat_v_kvartire", "type":"tag_id", "attribute_id":1374, "values":[ { "id":1, "value":"1 ", "order":1 }, { "id":2, "value":"2 ", "order":2 }, { "id":3, "value":" ", "order":3 }, { "id":4, "value":"", "order":4 } ], "params":{ "required":true } }, { "title":"", "widget":"input_int", "order":20, "slug":"realty_etaj", "type":"int", "attribute_id":1543, "params":{ "required":true, "min_value":1, "max_value":500 } } ] }, { "title":"", "widget":"section", "order":21, "params":{ "required":false }, "subfields":[ { "title":" ", "widget":"input_float", "order":22, "slug":"realty_obshaya_ploshad", "type":"float", "attribute_id":1541, "params":{ "required":true, "unit":"²", "min_value":1, "max_value":100000 } } ] }, { "title":"", "widget":"section", "order":25, "params":{ "required":false }, "subfields":[ { "title":" ", "widget":"input_float", "order":25, "slug":"building_flat_ceiling_height", "type":"float", "attribute_id":1518, "params":{ "required":false, "min_value":1, "max_value":10, "unit":"" } } ] } ] } 


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

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


الجزء العاشر: الأخطبوط التبعيات


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

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

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

يتم تنفيذها مثل هذا:

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


في الختام


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

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


All Articles