SberTech ♄ Open Source, ParallelitĂ€t und zuverlĂ€ssiger Bankbetrieb - Analyse von Lösungen fĂŒr Probleme mit Joker 2018

Dieses Wochenende war Joker 2018 , es war interessant! Die Konferenz war jedoch nicht nur reich an Reden. Alle Sponsorenunternehmen haben versucht, sich vor dem Hintergrund der „Wettbewerber“ abzuheben, und wir sind keine Ausnahme.

Am Stand von Sberbank Technologies gab es viele interessante Dinge, aber ich möchte darĂŒber sprechen, wofĂŒr wir uns auszeichneten. Unser Apache Ignite- Entwicklungsteam bei SberTech bereitete die Aufgaben vor und zog unter denjenigen, die es wagten, sie zu lösen, ein Unentschieden.

Unter dem Schnitt finden Sie in den Kommentaren Aufgaben, Lösungsanalysen und die Möglichkeit, Ihre eigene Lösung zu rechtfertigen.



Wehe Committern


Petya und Kolya legen in Apache Ignite ein Feature pro Tag fest.

Masha testet schnell alle Funktionen und setzt festgeschriebene Commits zurĂŒck.
Jedes dritte anfĂ€ngliche Commit von Petit und jedes fĂŒnfte von Kolya enthĂ€lt einen Fehler.
Petya verbringt zusÀtzliche 2 Tage, um den Fehler zu beheben, Kolya 3, und sie tun es erneut
begehen.

Wie viele Funktionen werden in 86 Arbeitstagen mitgeteilt, wenn Mascha Petja mag?
und sie bemerkt seinen Fehler nur an dem Tag, an dem nur er sich irrt?

Lösung
Ab dem 13. Tag wird ein Zyklus gebildet, der es Petya ermöglicht, nur jeden zweiten Fehler zu beheben.

Die Antwort
64 + 54 = 118;

Villaribo und Villabaggio


Die Verarbeitung einer unzuverlĂ€ssigen Bank wĂ€hrend des Betriebs einer Gruppe von Konten blockiert SchlĂŒssel
Konten in der Reihenfolge ihrer ErklÀrung in der Operation, d.h. von links nach rechts.
Jeder Deadlock wird von den Spezialisten der Bank manuell gelöst und dauert zehnmal lÀnger.
Zeit als normaler Betrieb.
Die Verarbeitung einer zuverlĂ€ssigen Bank blockiert immer die aufsteigenden SchlĂŒssel, gibt jedoch 2 aus
mal mehr als eine normale Transaktion in einer unzuverlÀssigen Bank.
Beide Banken haben 10 Konten, die SchlĂŒssel der Konten sind Zahlen von 1 bis 10.
Die Verarbeitung jeder Bank erfordert 12 Operationen.
Die Operationen werden parallel durchgefĂŒhrt, zwei gleichzeitig. Jede Operation betrifft bis zu 3
Konten:
- Operation Nr. 1 (Konten: A, B, C), wobei A = i, B = A + 1, C = (A + B)% 10,
- Operation Nr. 2 (Konten: D, E, F), wobei D = 11-i, E = D-1, F = (D + E)% 10,
Ich variiere von 1 bis 6.
Die AusfĂŒhrung des nĂ€chsten Operationspaars beginnt erst nach vollstĂ€ndiger Fertigstellung
der vorherige.
Die SchlĂŒssel werden gemĂ€ĂŸ den Richtlinien der Bank gesperrt, wobei jeweils einer der VorgĂ€nge beginnt
von Operation Nummer 1.
Wenn der SchlĂŒssel bereits in einer der Operationen gesperrt ist, aber eine andere ausfĂŒhren muss,
dann ist zuerst die erste Operation abgeschlossen, dann wird die zweite fortgesetzt.
Es wird erwartet, dass die erzwungene AusfĂŒhrung eines Operationspaars im sequentiellen Modus zweimal langsamer als parallel erfolgt.
Welche Bank und wie oft schneller wird der Betrieb abgeschlossen?

Hinweis
Gesamt:
- 6 Iterationen,
- 12 Operationen
- bei allen Operationen außer einer, jeweils 3 Tasten.

Lösung
Wenn alle SchlĂŒssel unterschiedlich sind, ist eine parallele AusfĂŒhrung möglich.
Wenn nicht, dann nein, und Deadlock ist möglich.

Berechnungen
Eine unzuverlĂ€ssige Bank gibt fĂŒr eine Transaktion 1 "Takt", 2 fĂŒr "Schwierigkeiten" und bis zu 10 fĂŒr Deadlocks aus.
Eine zuverlĂ€ssige Bank gibt fĂŒr Transaktion 2 "Maßnahmen" und 4 fĂŒr "Schwierigkeiten" aus. ZuverlĂ€ssige Deadlocks gibt es nicht.

Die Antwort
Zur gleichen Zeit abschließen.

Risiken fĂŒr das öffentliche Repository


Serezha ist ein sehr erfahrener Programmierer, extrem spielend und unendlich gierig.
Einmal fand er den Quellcode seiner Lieblingstasche auf einem Github.
Was ist der Mindesteinsatz, den Seryozha gewinnen kann?

Eine vereinfachte Trageliste ist beigefĂŒgt:

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" -     } 

Tipp 1
- 131072?
- Nein, raus aus der Falle :)
Tipp 2
Was ist der Mindesteinsatz, den Seryozha gewinnen kann?
Tipp 3
 th1{ bid.restricted = true; bid.checked = true; } ... th2{ while (!bid.checked) { sleep(1); } assert bid.restricted; // 99.999% } 

Es gibt keine intuitiv zu erwartenden Sichtbarkeitsgarantien.

Sie können sie wie folgt hinzufĂŒgen:

 volatile boolean checked; 

Tipp 4
Was ist der Mindesteinsatz , den Seryozha gewinnen kann?
Lösung

Die Antwort
 java.lang.Integer#MIN_VALUE 

"0" und sogar "1" wurden jedoch als die richtige Entscheidung angesehen.

Gewinner


Am besten löste das Problem
- Evgeny Zubenko
- Alexander Novikov
- Andrey Golikov

Die Jungs bekamen MarkenrucksĂ€cke, T-Shirts und natĂŒrlich BĂŒcher.

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


All Articles