SberTech ♥ عمليات مفتوحة المصدر ومتزامنة وعمليات مصرفية موثوقة - تحليل الحلول لمشاكل Joker 2018

في نهاية هذا الأسبوع كان جوكر 2018 ، كان مثيرًا للاهتمام! لكن المؤتمر كان غنياً ليس فقط بالخطابات. حاولت جميع الشركات الراعية التميز على خلفية "المنافسين" ونحن لسنا استثناء.

كان هناك الكثير من الأشياء المثيرة للاهتمام في منصة Sberbank Technologies ، لكني أريد أن أتحدث عما كنا نتميز به. قام فريق تطوير Apache Ignite في SberTech بإعداد المهام وعقد التعادل بين أولئك الذين تجرأوا على حلها.

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



المذنبون ويل


تقوم Petya و Kolya بتنفيذ ميزة واحدة يوميًا في Apache Ignite .

يختبر ماشا بسرعة كل ميزة ويتراجع عن عمليات احتواء الأخطاء.
كل التزام أولي ثالث من بيتي والخامس من كوليا يحتوي على خطأ.
تنفق Petya يومين إضافيين لإصلاح الخطأ ، Kolya 3 ، ويقومون بذلك مرة أخرى
ارتكاب.

كم عدد الميزات التي سيتم توصيلها في 86 يوم عمل إذا كانت Masha تحب Petya ،
وتلاحظ خطأه فقط في ذلك اليوم عندما يكون مخطئا فقط؟

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

الجواب
64 + 54 = 118 ؛

فيلاريبو وفيلاباجيو


تؤدي معالجة مصرف غير موثوق به أثناء العمليات على مجموعة من الحسابات إلى حظر المفاتيح
الحسابات بترتيب إعلانها في العملية ، أي من اليسار الى اليمين.
يتم حل كل حالة جمود يدويًا من قبل متخصصي البنك وتستغرق 10 مرات أكثر.
الوقت من العملية العادية.
تؤدي معالجة مصرف موثوق دائمًا إلى حظر المفاتيح تصاعديًا ، ولكنها تنفق 2
أكثر من المعاملة العادية في بنك غير موثوق به.
لكل من البنكين 10 حسابات ، مفاتيح الحسابات هي أرقام من 1 إلى 10.
تتطلب معالجة كل بنك 12 عملية.
تجرى العمليات بالتوازي ، اثنتان في كل مرة. تؤثر كل عملية على ما يصل إلى 3
الحسابات:
- العملية رقم 1 (الحسابات: أ ، ب ، ج) ، حيث أ = ط ، ب = أ + 1 ، ج = (أ + ب)٪ 10 ،
- العملية رقم 2 (الحسابات: D ، E ، F) ، حيث D = 11-i ، E = D-1 ، F = (D + E)٪ 10 ،
أنا يختلف من 1 إلى 6.
يبدأ تنفيذ زوج العمليات التالي فقط بعد اكتماله بالكامل
سابقتها.
يتم حظر المفاتيح وفقًا لسياسة البنك ، حيث يبدأ واحد في كل من العمليات
من العملية رقم 1.
إذا كان المفتاح مقفلاً بالفعل في إحدى العمليات ، ولكنه مطلوب لإجراء آخر ،
ثم تكتمل العملية الأولى ، ثم تستمر الثانية.
من المتوقع أن يحدث التنفيذ القسري لزوج من العمليات في الوضع المتسلسل مرتين أبطأ مما هو عليه في موازاة ذلك.
أي بنك وكم مرة أسرع في إكمال العمليات؟

تلميح
المجموع:
- 6 تكرارات ،
- 12 عملية
- في جميع العمليات باستثناء مفتاح واحد لكل 3 مفاتيح.

الحل
إذا كانت جميع المفاتيح مختلفة ، فمن الممكن التنفيذ المتوازي.
إذا لم يكن الأمر كذلك ، فلا ، والمأزق ممكن.

الحسابات
ينفق بنك غير موثوق به على المعاملة "براعة" ، 2 في حالة "الصعوبات" وما يصل إلى 10 في حالة الجمود.
ينفق بنك موثوق على "إجراءات" المعاملة 2 و 4 في حالة "صعوبات". الجمود موثوق بها لا وجود لها.

الجواب
أكمل في نفس الوقت.

مخاطر المستودعات العامة


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

يتم إرفاق قائمة حمل مبسطة:

class Bid { //  int amount; boolean checked; boolean restricted; Bid(int amount) {this.amount = amount;} } ~~~ AtomicReference<Bid> ref = new AtomicReference<>(); volatile boolean winner = false; ~~~ Thread validator = new Thread(() -> { //  ! while (true) { Bid bid = ref.get(); if (bid == null) continue; if ((((bid.amount << 5) ^ 1_000_000) >>> 6) < (2 << 15)) bid.restricted = true; bid.checked = true; } }); Thread payer = new Thread(() -> { //  ! while (true) { Bid bid = ref.get(); if (bid == null) continue; if (bid.checked) { if (!bid.restricted) winner = true; // ! ref.set(null); } } }); ~~~ synchronized boolean makeMeRich(int amount){ //    ? if (winner) return false; //    -    ref.set(new Bid(amount)); while(ref.get() != null) sleep(1); return winner; //   "true" -     } 

نصيحة رقم 1
- 131072؟
- لا ، اخرج من الفخ :)
نصيحة رقم 2
ما هو الحد الأدنى للرهان الذي يمكن أن يفوز به سيروزا؟
نصيحة رقم 3
 th1{ bid.restricted = true; bid.checked = true; } ... th2{ while (!bid.checked) { sleep(1); } assert bid.restricted; // 99.999% } 

لا توجد ضمانات الرؤية المتوقعة بشكل حدسي.

يمكنك إضافتها كما يلي:

 volatile boolean checked; 

نصيحة رقم 4
ما هو الحد الأدنى للرهان الذي يمكن أن يفوز به سيروزا؟
الحل

الجواب
 java.lang.Integer#MIN_VALUE 

ومع ذلك ، تم اعتبار "0" وحتى "1" القرار الصحيح.

الفائزون


أفضل حل المشكلة
- إيفجيني زوبينكو
- الكسندر نوفيكوف
- أندري جوليكوف

حصل الرجال على حقائب تحمل على الظهر ، وقمصان ، وبالطبع كتب.

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


All Articles