en
de

Akka: Es funktioniert immer noch!

16 August 2016
| |
Lesezeit: 3 Minutes

Eines Tages arbeitete ich im Zug an einigen Tests für unsere Akka-basierte Anwendung. Wie üblich wechselte der Status der Tests von Rot nach Grün und wieder zurück, während ich arbeitete. Aber irgendetwas störte mich – und dann merkte ich, dass der Laptop auf meinen Knien ungewöhnlich heiss war.

System brennt – Alles grün

Verwundert suchte ich nach dem Grund dafür, dass mein Laptop versuchte, meine Oberschenkel zu kochen. Der Taskmanager zeigte mir nichts Spezielles. Erst als ich die Tests laufen liess, sah ich zu meinem Erstaunen, dass alle meine 8 Cores für die Dauer der Testdurchführung auf 100% stiegen! Aber die Tests funktionierten doch wie gewünscht. Meine Protokolle wurden korrekt abgearbeitet und die Antworten kamen wie gewünscht an. Und das brauchte niemals 800% CPU Leistung. Was könnte das Problem sein?

Genaueres Debuggen förderte dann den Grund zu Tage: Meine Tests hatten im Rest des Systems eine unendliche Kaskade von Nachrichten ausgelöst und Akka verteilte die vorhandenen Ressourcen in dem Versuch, alle diese Nachrichten abzuarbeiten. Soweit ist das nichts Spezielles – einfach ein Fehler eines Entwicklers, wie sie täglich passieren. Nur waren in diesem Fall die Konsequenzen etwas unerwartet. Denn obwohl durch diesen Fehler der Computer wirklich maximal ausgenutzt wurde, blieb die eigentliche Funktion erhalten. Es gab keine Abstürze oder Blockaden des OS, überhaupt war nichts speziell – nur arbeitete die Maschine härter.

Wenn ich mir nun vorstelle, dass ein solcher Fehler in einem nicht-Akka System passiert wäre… Ich denke der Test wäre nicht durchgelaufen, denn dieser bewertete einen asynchronen Ablauf und eine verspätete Antwort wäre als Fehler gewertet worden. Doch die Antwort kam nur wenig später. Und obwohl Unmengen von Nachrichten im System unterwegs waren, wurde der getestete Code verlässlich abgearbeitet – der Test war noch immer grün.

 


Akka? – Kurz erklärt

Akka ist ein Toolkit für die JVM, das den Bau von stark nebenläufigen, verteilten und fehlertoleranten Anwendungen erlaubt. Die Grundlage für diese Eigenschaften ist das Konzept von Aktoren – isolierte Programmteile, welche ausschliesslich mittels Nachrichten miteinander kommunizieren. Aktoren sind nichts Neues, sondern ein bewährtes Konzept, das von 1973 datiert, die Grundlage bildet für spektakulär verlässliche Systeme wie den AXD 301 ATM Switch von Ericsson.


 

Aber der Test sollte fehlschlagen!

Im beschriebenen Fall ist dieses Verhalten umstritten, denn ein Test sollte Fehler anzeigen. Das hätte er auch, wenn das Zeitfenster für die Antwort klein genug gewesen wäre. Doch für die wenigsten Systeme ist dieses Zeitfenster kleiner als einige oder einige Dutzend Millisekunden. Genau das war hier der Fall.

Dennoch – für den produktiven Betrieb will ich genau dieses hartnäckige Verhalten. Da soll nicht ein Fehler dem Kunden den Service blockieren. Da soll auch kein Angriff (zum Beispiel ein DOS, Denial-of-Service) den Service lahmlegen.

 

Wann braucht man so etwas?

Dieses Beispiel ist mir bei einem Projekt passiert, das darauf angewiesen ist, dass das System immer weiterläuft: eine zentrale Kontrollanwendung für die Beleuchtung und den Tisch eines Operationssaals. Da muss eine Anfrage beantwortet werden, auch wenn irgendein Subsystem nicht mehr funktioniert. Sonst könnte die nächste Operation unangenehm werden.

Aber es muss nicht immer so dramatisch sein. Auch eine Webplattform für Nachrichten soll möglichst verlässlich Anfragen beantworten – denn davon lebt die Firma!

 

Will ich haben, denn…

  • Das Aktoren Modell in der Form von Akka erlaubt es, alles aus ihren Rechnern herauszuholen ohne das Risiko von ausbleibenden Antworten einzugehen.
  • Die Modellierung von Prozessen mittels Aktoren lässt sich über die Metapher von über Zettel kommunizierenden Personen überraschend intuitiv angehen.
  • Aktoren vereinfachen nebenläufige Programmierung, indem sie einzelne Zustände kapseln und diese mittels Nachrichten interagieren lassen – jeder Aktor ist eine isolierte, lineare Welt. Die Nebenläufigkeit wird durch das Toolkit organisiert.
  • Akka hat nützliche Erweiterungen wie zum Beispiel die Akka Streams. Diese erlauben es, eine begrenzte Menge von Arbeitsspeicher maximal auszunutzen, indem ein Druck (Backpressure) erzeugt wird, der via TCP den Nutzern weitergegeben wird und sie veranlasst, weniger Daten zu senden. Dadurch schützt sich das System davor, beliebig viel Arbeitsspeicher zu benötigen und lässt sich preiswerter betreiben.

Was sind Ihre Erfahrungen mit Akka? Fallen Ihnen weitere Vorteile (oder auch Nachteile) ein?

 


Unter den folgenden Links erfahren Sie mehr zum Aktoren Modell und Akka:

Oder besuchen Sie unseren Kurs Fast Track to Akka with Scala, in dem Sie lernen skalierbare und fehlertolerante Anwendungen mit Akka zu erstellen.


Kommentare (0)

×

Updates

Schreiben Sie sich jetzt ein für unsere zwei-wöchentlichen Updates per E-Mail.

This field is required
This field is required
This field is required

Mich interessiert

Select at least one category
You were signed up successfully.