
هل أنت مستعد لمواجهة تحديات جديدة؟ ندعو جميع الهواة والمهنيين إلى البطولة لتصميم وإدارة الخدمات المحملة للغاية
HighLoad Cup # 2 !
بدأت المنافسة في العام الماضي. ثم علمنا أن كأس HighLoad هو بالضبط البطولة التي كانت مفقودة في عدد من مشاريع مجموعة Mail.Ru. حضر المسابقة التجريبية الأولى 449 شخصًا. كان هناك الكثير من الكود والكثير من العرق من المنظمين والمشاركين (8789 حل مختلف). كانت هناك فروق دقيقة في التنفيذ التقني ، ولكن الأهم من ذلك ، أن الجميع أعجبوا به! قضى المنظمون عدة ليال في مركز البيانات ، عدة أيام في المكتب. جاهز لذلك مرة أخرى! في نهاية المقال ، ستجد مواد مفيدة منا ومن المشاركين ، مما سيساعدك على فهم الميكانيكا وإيجاد بعض الحلول لأفضل الممارسات.
هذه المرة حاولوا أن يعدوا لك عملًا أكثر صعوبة. بالإضافة إلى ذلك ، قمنا بتوسيع الجمهور ، والآن يمكن للمستخدمين الناطقين باللغة الإنجليزية المشاركة في المسابقة. انضم إلى مجتمع الناطقين بالروسية في
Telegram . هناك سوف تحصل على الكثير من الأفكار حول المسابقة :)

مرحبا بك على متن!
الميكانيكا
مقارنة بالعام الماضي ، لم يتغير شيء من الناحية النظرية في المنافسة.
يتم إعطاء المشاركين مهمة إنشاء خدمة ويب صغيرة تعمل مع بيانات بنية معينة وتنفذ واجهة برمجة تطبيقات لهذه البيانات. يتم تحميل حاوية (Docker) مع الخدمة المنفذة على خوادمنا ، حيث نطلقها ونبدأ في قصفها بطلبات HTTP.
يتم إرسال الحلول إلينا باستخدام عميل Docker المثبت محليًا في مستودع خاص (كل واحد له ملكه). ثم يتم فحص الخدمة المرسلة إلينا تلقائيًا بواسطة نظام CodeHub-CodeRunner الذي تم تطويره من قبل موظفي Mail.Ru Group Technopark Laboratory.
ثم نبدأ في "طرح" الحاوية على جهاز اختبار باستخدام معالج Intel Core i7. سيتم تخصيص 4 نوى بتردد 2.4 جيجا هرتز و 2 جيجابايت من ذاكرة الوصول العشوائي و 10 جيجابايت من مساحة القرص الثابت. باختصار ، يتم إطلاق "دبابة" باستخدام المحرك الوهمي ، الذي يطلق النار على تيارات متعددة مع ملف تعريف الحمل المتزايد خطيًا. قبل بدء القصف ، يحتوي حل المستخدم على عدة دقائق (يعتمد المبلغ الدقيق على المهمة) من أجل معالجة البيانات من ملف JSON المستلم. العمل الصحيح مع هذه البيانات هو شرط ضروري لتحقيق النصر. قصف اثنين فقط ، قصيرة وطويلة.
بناءً على نتائج مثل هذه الهجمات ، نحسب عدد الإجابات الصحيحة وغير الصحيحة و RPS وسرعة الاستجابة ، ونشكل جدول تصنيف لمقياس معين. سيكون مؤلف الخدمة الأسرع والأكثر تسامحًا مع الخطأ هو الفائز.

استخدم أي تقنية ويب يمكنك العثور عليها أو الخروج بها. اختيار لغة البرمجة الخاصة بك والإطار. يمكن أن يكون C ++ أو Java + Tomcat أو Python + Django أو Ruby + RoR أو GoLang أو JavaScript + NodeJs أو Haskell أو على الأقل Assembler أو أي شيء آخر حسب تقديرك. لتخزين البيانات: MySQL ، PostgreSQL ، Redis ، MongoDB ، مخابئ. الحرية الكاملة!
نتيجة القصف ، يتم الحصول على السجلات والمقاييس ، والتي ستظهر بعد ذلك للمشاركين في شكل رسوم بيانية على صفحة القرار. تتبع بشكل منفصل:
- المقاييس الأساسية
- الإجابة الصحيحة
- سرعة الاستجابة لطلب
- عدد الردود في الثانية الواحدة.

يتم احتساب تصنيف الحل على النحو التالي: نحن نأخذ وقت جميع الإجابات الصحيحة التي تمكن API من تقديمها أثناء القصف ، ونضيف فترة عقوبة لكل إجابة أو طلب غير صحيح لم نتمكن من تلقي رد عليه (وقت الجزاء يساوي دائمًا إجمالي وقت انتهاء الطلب). المشارك ، الذي يكون إجمالي وقته أقل من غيره ، أعلى في قائمة المتصدرين ولديه فرصة ليصبح الفائز في البطولة.
التحدي
اعتقد فريقنا لفترة طويلة ما مهمة لإعطاء هذا العام. لقد أرادوا شيئًا من شأنه مساواة فرص الأغلبية (بحيث لا تفوز بعض الدراجات المصنّعة في C / C ++).
الصياغة هي كما يلي:
في واقع بديل ، قررت البشرية إنشاء وإطلاق نظام بحث عالمي لـ "النصف الثاني". إنه مصمم لتقليل عدد الأفراد في العالم والمساعدة في تكوين أسر قوية.
في كل من البيانات التجريبية و "القتالية" لمختلف عمليات القصف ، توجد إدخالات حول كيان واحد: الحساب. فهو يصف جميع المعلومات المعروفة عن المستخدم - اسمه ، وجهات الاتصال ، والمصالح ، وكشف التعاطف مع المستخدمين الآخرين. دقة البيانات المقدمة مضمونة وفقًا للأنواع والقيود الموضحة أدناه. تم إنشاء جميع البيانات واختراعها من قبلنا وفقًا لقوانين معينة.
البيانات الشخصية التالية موجودة في سجل حساب واحد:
- معرف - معرف خارجي فريد للمستخدم. يتم تثبيته بواسطة نظام الاختبار ومن ثم استخدامه للتحقق من ردود الخادم. النوع هو عدد صحيح 32 بت.
- البريد الإلكتروني - عنوان البريد الإلكتروني للمستخدم. النوع - سلسلة أحرف Unicode يصل طولها إلى 100 حرف. التفرد مضمون.
- الاسم والشهرة - الاسم الأول واسم العائلة ، على التوالي. النوع - سلاسل يونيكود يصل طولها إلى 50 حرفًا. الحقول اختيارية وقد لا تكون موجودة في سجل معين.
- الهاتف - رقم الهاتف المحمول. النوع عبارة عن سلسلة يونيكود يصل طولها إلى 16 حرفًا. الحقل اختياري ، لكن التفرد مضمون للقيم المحددة. تملأ نادرا جدا.
- الجنس عبارة عن سلسلة يونيكود ، و "م" تعني الذكور ، و "و" تعني الأنثى.
- تاريخ الميلاد - تاريخ الميلاد ، يتم تسجيله كعدد الثواني من بداية عصر UNIX في UTC (بمعنى آخر ، هذا طابع زمني). محدود من 01/01/1950 ، من 01/01/2005 أعلاه.
- بلد - بلد الإقامة. النوع عبارة عن سلسلة يونيكود يصل طولها إلى 50 حرفًا. الحقل اختياري.
- مدينة - مدينة الإقامة. النوع عبارة عن سلسلة يونيكود يصل طولها إلى 50 حرفًا. الحقل اختياري ونادراً ما يتم تحديده. تقع كل مدينة في بلد معين.
أيضًا ، في سجل حساب واحد ، هناك حقول خاصة بمحرك البحث للنصف الثاني:
- انضم - تاريخ التسجيل في النظام. النوع - الطابع الزمني مع قيود: من 01.01.2011 أدناه ، من 01.01.2018 أعلاه.
- الحالة - الحالة الحالية للمستخدم في النظام. اكتب - سطر واحد من الخيارات التالية: "مجاني" ، "مشغول" ، "كل شيء معقد." لا تولي اهتماما لنهايات غريبة :)
- المصالح - مصالح المستخدم في الحياة اليومية. اكتب - مجموعة من سلاسل يونيكود ، ربما فارغة. لا يتجاوز طول الخطوط 100 حرف.
- العلاوة - بداية ونهاية الفترة الممتازة في النظام (عندما أراد المستخدمون حقًا العثور على "رفيق الروح" ودفعوا مقابل الخدمة). في JSON ، يتم تمثيل هذا الحقل بواسطة كائن متداخل مع حقول البداية والنهاية ، حيث يتم تسجيل الطوابع الزمنية ذات الحدود الدنيا في 01/01/2018.
- الإعجابات - مجموعة من الإعجابات المعروفة للمستخدم ، ربما تكون فارغة. تختلف جميع التعاطفات ويمثل كل كائن من الحقول التالية:
- معرف - معرف حساب آخر يحب المستخدم. يمكن دائمًا العثور على الحساب في البيانات المصدر حسب المعرف. يرجى ملاحظة أنه في البيانات قد يكون هناك العديد من الإعجابات بنفس المعرف.
- ts - الوقت ، أي الطابع الزمني ، عندما تم تسجيل التعاطف في النظام.
تحتاج إلى تطبيق API.
- الحصول على قائمة المستخدمين: / accounts / filter /
تم التخطيط لاستخدام طريقة API هذه للبحث عن المستخدمين في الحقول المعروفة أو المرغوبة سابقًا. على سبيل المثال ، أراد شخص ما رؤية جميع الأشخاص من عمر معين ونوع الجنس يعيشون في مدينة معينة. - تجميع المستخدمين: / accounts / group /
تم التخطيط لاستخدام طريقة واجهة برمجة التطبيقات هذه لإنشاء تقارير عن تشغيل النظام. يتم تمرير الحقول المستخدمة للتجميع في مفاتيح معلمات GET مفصولة بفواصل. فهي ليست كثيرة كما في طلب تصفية المستخدم. لا يوجد سوى خمسة مجالات للتجميع - الجنس ، والوضع ، والمصالح ، والبلد ، والمدينة. - توصيات التوافق: / accounts / id / recommend /
يستخدم هذا الاستعلام للبحث عن "النصف الثاني" في بيانات المستخدم المحددة. يمر الطلب بمعرف المستخدم الذي يتم البحث عن الأشخاص الأكثر ملاءمة له حسب الحالة والعمر والاهتمامات. يجب أن يتحقق القرار من التوافق مع الجنس الآخر فقط (نحن لسنا ضد الأقليات الجنسية وندين التمييز ، لقد حدث فقط :)). إذا تم إرسال البلد أو المدينة مع مفاتيح البلد والمدينة ، على التوالي ، في طلب GET ، فأنت بحاجة إلى البحث فقط بين أولئك الذين يعيشون في المكان المحدد. - مطابقة الإعجابات المتشابهة: / accounts / id / suggest /
يشبه هذا النوع من الاستعلامات البحث السابق في البحث عن "أصدقاء الروح". يتم إرسال معرف المستخدم الذي نبحث عنه عن صديق الروح ، ويتم استخدام المعلمة GET الحد. الاختلافات في التنفيذ: نحن نبحث عن أشخاص مثل نفس الجنس مع "أمثال" مماثلة ونقدم لأولئك الذين أحبوا أنفسهم مؤخرًا. إذا تلقى الطلب معلمة GET للبلد أو المدينة ، فأنت بحاجة إلى البحث عن "تعاطف مماثل" في موقع معين فقط.
لقول كل شيء في مقال واحد غير ممكن. سيتم نشر القواعد التفصيلية في يوم الإطلاق (اليوم) على موقع البطولة وعلى مستودع
GitHub ، لكنك الآن تعرف ما ينتظرك.
الجدول الزمني
نعم ، نحن نعرف أن الأعياد (مع المقبلة) ، وبالتالي فإن البطولة ستكون طويلة جدا :)
- اختبار النسخة التجريبية (لا تؤخذ النتائج في الاعتبار): تبدأ في 13 ديسمبر الساعة 19:00 ، وتنتهي في 21 ديسمبر الساعة 19:00.
- جولة التصفيات: من 21 ديسمبر ، 19:00 حتى 31 يناير ، 19:00.
- الجولة النهائية: حتى 5 فبراير.
أثناء الاختبار التجريبي ، قد تتغير قواعد وشروط المهمة (في وجود أخطاء ولأسباب أخرى).
جولة التصفيات - القواعد لا تتغير.
الجولة النهائية تلقائية تمامًا ، ولكن قبلها ، يختار الفائزون النهائيون (مستخدمو N الذين اجتازوا نتائج الجولة التصفيات و 50 شخصًا على الأقل) حلاً سيتم إطلاقه في عدة موجات. تتشكل النتيجة من خلال أفضل نتيجة لجميع الموجات.
يعرض
المركز الأول هو MacBook Air الجديد.
المركز الثاني والثالث - أبل أي باد.
المرتبة الرابعة والخامسة والسادسة - Samsung Gear S3.
يحق للمشارك أن يطلب هدية أخرى ذات قيمة معادلة في المقابل. جميع المشاركين الذين تأهلوا للنهائيات سيحصلون على قمصان تحمل علامات تجارية في بطولتنا.
المجتمع
إذا ذهبت إلى غرفة الدردشة في
Telegram ، فمن غير المرجح أن تتركها بالفعل. نحن في انتظاركم ونتمنى لك التوفيق!
شكر وتقدير
لا تتناول هذه المقالة مشكلات تحديث النظام. لقد قمنا بالكثير من العمل للقضاء على أخطاء البنية التحتية ، واستعرضنا جميع
المشكلات من المشاركين في GitHub ، ونفذنا بالفعل شيئًا ما ووضعناه في قائمة TODO للعام المقبل. أود أن أعرب عن
عميق امتناني لمكسيم
@ xammi- كيسلنكو ، وإيليا
@ أليوفز ليبيديف ، ويوجين
@ جونيتورن إيفانوف ،
وإرينا @ إيثيل لوكيانوفا ، وفاسيلي
@ فاسيدمي ديميترييف ، والفريق بأكمله الذي شارك في المسابقة ، بما في ذلك مجتمع البطولة بأكمله. شكرا لك
أدب مفيد عن نتائج HighLoad Cup 2017