entspannte nebenläufigkeit 12.03.2014 andi scharfstein, ben romberg entwicklertag 2012
TRANSCRIPT
Entspannte Nebenläufigkeit
11.04.23
Andi Scharfstein, Ben Romberg
Entwicklertag 2012
11.04.23
Quelle: Air Force Weather Agency
11.04.23
Quelle: Air Force Weather Agency
Blackout USA (14.08.2003)
11.04.23
Ursache: Race Condition
“We test exhaustively, we test with third parties, and we had in excess of three million online operational hours in which nothing had ever exorcised that bug. I'm not sure that more testing would have revealed that.”
— Mike Unum, GE Energy
Das Versprechen
11.04.23
Nie wieder Race Conditions!
Zur Erinnerung: Race Condition
11.04.23
a = 1
Thread 1
a = a + 1
Zur Erinnerung: Race Condition
11.04.23
a = 2
Thread 1
Zur Erinnerung: Race Condition
11.04.23
a = 1
Thread 1
a = a + 1
Thread 2
a = a + 1
Zur Erinnerung: Race Condition
11.04.23
a = 3?
a = 2?
Thread 1 Thread 2
Zur Erinnerung: Race Condition
11.04.23
a = 3?
a = 2?
Thread 1 Thread 2
Problem: Zugriff auf globale Ressourcen!
Eine Alternative
11.04.23
Und wenn wirnur mit lokalenRessourcenarbeiten?
Nebenläufigkeit: Aktoren-Sicht
11.04.23
Aktor 1 Aktor 2
Nachrichtenaustausch
LokaleRessourcen
LokaleRessourcen
Ressourcenin Nachricht
Aktoren-Paradigma
11.04.23
Datenfluss findet ausschließlich in wohldefinierten, gekapselten Einheiten statt
Was bringt mir das?
11.04.23
Race Conditions
Threads Aktoren
Aktorentheorie
11.04.23
Erstmals durch Carl Hewitt (1973)
Motivation: Hunderte vonvernetzten Maschinen effizientparallelisieren
Weiterentwicklung u.a.durch Gul Agha (1986)
Was ist ein Aktor?
11.04.23
Name(Adresse)
Was ist ein Aktor?
11.04.23
Verhalten(Code)
Name(Adresse)
Was ist ein Aktor?
11.04.23
Verhalten(Code)
Zustand(Daten)
Name(Adresse)
Was ist ein Aktor?
11.04.23
Verhalten(Code)
Zustand(Daten)
Mailbox / Message Queue
Name(Adresse)
Was kann ein Aktor?
11.04.23
1. Nachrichten verschicken
Was kann ein Aktor?
11.04.23
1. Nachrichten verschicken
2. Eigenen Zustand/Verhalten ändern
Was kann ein Aktor?
11.04.23
1. Nachrichten verschicken
2. Eigenen Zustand/Verhalten ändern
3. Neue Aktoren erstellen
In welcher Welt leben Aktoren?
11.04.23
• Alle Aktoren laufen immer parallel zueinander
In welcher Welt leben Aktoren?
11.04.23
• Alle Aktoren laufen immer parallel zueinander
• Die Aktoren-Theorie macht keine Aussage über Nachrichtenverhalten
In welcher Welt leben Aktoren?
11.04.23
• Alle Aktoren laufen immer parallel zueinander
• Die Aktoren-Theorie macht keine Aussage über Nachrichtenverhalten
• Nachrichten dürfen Reihenfolge tauschen oder sogar komplett verloren gehen
Zeit für ein Beispiel
11.04.2311.04.23
MainActor
Zeit für ein Beispiel
11.04.2311.04.23
MainActor SoccerActor
int home = 0;int guest = 0;
Zeit für ein Beispiel
11.04.2311.04.23
MainActor SoccerActor
• GoalForHome• GoalForGuest• GameOver int home = 0;
int guest = 0;
Akka
11.04.23
• Aktoren-Framework, unterstützt Scala und Java
• Gründer: Jonas Bonér (Typesafe)
• Bereits im Einsatz bei Amazon, AutoDesk, Credit Suisse, vmware
Demo
11.04.23
Akka – Aktoren Performance
11.04.23
• Reaktives Modell (eventbasiert)
• Thread Pool mit eigenem Scheduler für leichtgewichtige Aktoren-Threads
Sehr gute Performance (Zahl von Aktoren im Millionenbereich, 50 Mio. Nachrichten / sec.)
ask() statt tell()
11.04.23
• Ebenfalls asynchron, aber mit Rückgabewert
• Rückgabewert ist eine Future
• Futures können– synchron (blockierend) abgefragt werden– mit internen Datenstrukturen weiterverarbeitet
werden– einen Callback aufrufen
Scaling
11.04.23
• Dank Location Transparency können Aktoren beliebig verteilt werden („Remoting“)
• Umverteilung im lokalen Hauptspeicher
• Andere Kerne der gleichen Maschine (scaling up)
• Andere Maschinen im gleichen Netz (scaling out)
Monitoring
11.04.23
• Aktoren haben immer einen „Supervisor“
• Sie formen untereinander eine Baumhierarchie
• Fehler werden eskaliert und an der richtigen Stelle gefangen
• Riskante Operationen werden in eigenem Aktor isoliert („error kernel pattern“)
Aktoren – Do‘s and Don‘ts
11.04.23
• Kommunikation zwischen Aktoren sollte ausschließlich über Nachrichten stattfinden
• Nachrichten sollten nur aus Immutable Objects bestehen
„Nie wieder Race Conditions“
Komplexeres Beispiel: Crawler für Wikipedia-API
11.04.23
Sehr einfach zu realisieren und äußerst performant
Thread-Pool mit z.B. 10 Threads
Crawler
Artikel-ID Artikel-Detailsstartet
Kategorie-ID Kategorie-Detailsstartet
startet
DB Cache
(Batch Insert)
startet
Fazit
11.04.23
“I'm not sure that more testing would have revealed that.”
— Mike Unum, GE Energy
Fazit
11.04.23
“I'm not sure that more testing would have revealed that.”
— Mike Unum, GE Energy
Besser umdenken anstatt „more of the same“
…dann klappt‘s auch mit dem Strom
11.04.23
Quellen
11.04.23
• Rajesh K. Karmani, Gul Agha: Actors (2011)
• Philipp Haller, Frank Sommers: Actors in Scala (2012)
• Akka Dokumentation (http://akka.io, 2012)
• Ben Romberg: Intopedia: Personalisierte Beitragsempfehlungen für die Wikipedia (2010)
Zur Erinnerung: Deadlock
11.04.23
Gleichzeitiger Zugriffauf globale Ressourcen
Threads vs. Aktoren
11.04.23
Race Conditions
Deadlocks
Threads + Locks Actors