Ein altes Kind für hochverfügbare Anwendungen
Eine hochverfügbare Anwendung soll es werden. Nun soweit stimmen die meisten Pläne für neue Softwaresysteme überein. Viele Entwickler und Architekten entwickeln mit dem Ziel, eine hochverfügbare und skalierbare Anwendung zu kreieren. Am bestem mit keiner Downtime, Continuous Integration und weiteren netten Annehmlichkeiten des Entwicklerndaseins. Doch wie beginnt man? Welche Architektur ist die richtige für mein Vorhaben? Wie erreiche ich mein Ziel in diesen wolkigen und immer nebulöser werdenden Zeiten?
Diese Frage lässt sich natürlich nicht einheitlich und generisch beantworten. Denn die Implementierung des Systems hängt immer von einer Reihe von Randbedingungen ab. Es muss und sollte immer genau untersucht werden, welche Systeme und Komponenten für meine Anwendung benötigt werden und überhaupt geeignet sind. Es gibt auf dem “Markt” momentan eine Menge guter OpenSource-Softwareprojekte, die gute Vorraussetzungen haben spezifische Probleme zu adressieren und diese auch zu lösen. Jedoch wie findet man die richtige? Man muss seine Anforderungen gut kennen und jederzeit im Blick haben. Facebook hat z.B. nicht ohne Grund Thrift² entwickelt, obwohl es bereits gute mögliche Kandidaten für multi-plattform Ansätze gab, wie etwa CORBA und SOAP. Doch mit dem festen Focus auf seine Anforderungen, gelangt man das ein oder andere Mal doch an die Grenzen bestehender Systeme.
Erlang. Der dänischer Mathematiker und Ingenieur? Die Großgemeinde Erlang des Stadtbezirks Hechuan in der chinesischen Stadt Chongqing? Oder soll es hier doch um die Programmiersprache Erlang gehen? Genau. Es geht in diesem Artikel um eben einen dieser alten Hasen der IT, der in Zeiten moderner dynamischer System wieder an das Licht der Programmierwelt vorstößt. Denn verschollen war Erlang nie. Es gab und gibt immer Systeme, die unter der Oberfläche eine breite Masse von anderen System unterstützen und mit Erlang erbaut sind.
Begeben wir uns in die Vergangenheit von Erlang, um zu erfahren, was Erlang ist und warum es so wertvoll sein kann für die Cloud bzw. moderne Systemarchitekturen. Die Ericsson language oder auch nach dem dänischer Mathematiker und Ingenieur Agner Krarup Erlang benannte Sprache und Laufzeitumgebung erblickte in den Laboren von Ericsson die Welt. Geburtshelfer und Vater war Joe Armstrong im Jahre 1986³. In den Laboren von Ericsson suchte man damals nach einer Möglichkeit die folgenden Anforderungen zu erfüllen.
• Parallelität
• hohe Verfügbarkeit
• Fehlertoleranz
• Effizienz
• Auswechseln von Modulen zur Laufzeit
Wie man bereits in dieser Liste sehen kann, scheint Erlang ein geeigneter Kandidat für viele heutige Systeme zu sein. Doch es hängt sehr davon ab, was man denn eigentlich bauen möchte. Für Number Crunching oder auch graphik-intensive Anwendungen ist Erlang sicherlich nicht die beste Wahl mit diesen Design-Anforderungen. Wenn man hingegen ein verteiltes, robustes, skalierendes, Multi-core fähiges und interoperable Anwendung im Focus hat, dann ist Erlang sicherlich im Kreise der engsten Kandidaten für dieses System.
1993 wurde ein weiterer Meilenstein in der Geschichte von Erlang gesetzt. Verteilung wurde dem System hinzugefügt, was es ermöglicht homogene Programme auf heterogener Hardware laufen zu lassen.
Doch ist Erlang wirklich den Anforderungen seiner Entwickler gewachsen? Werfen wir doch einmal einen Blick auf die heutigen Systeme und picken uns ein paar Beispiele heraus. Viele Firmen nutzen Erlang in ihren Produktivsystemen ¹ ³
• Amazon nutzt Erlang für die Implementierung von SimpleDB
• Yahoo! nutzte Erlang für ihren Social Bookmarking Dienst Delicious (jetzt AVOS Systems, Inc.), welcher mehr als 5 Millionen Nutzer und mehr als 150 Millionen URLs beheimatet
• Facebook nutzt Erlang für den hauseignenen Chat, hit mehr als 100 Millionen aktiver Nutzer
• T-Mobile nutzt Erlang für sein SMS und Authentifizierungssystem
• CouchDB
• RabbitMQ
Es lassen sich sicherlich noch viele weitere Beispiele finden, die für Erlang sprechen und die Robustheit und Skalierbarkeit deutlich belegen können.
Doch was macht Erlang so besonders? Nun Erlang ist in erster Linie nicht nur eine Programmiersprache, sondern auch ein Laufzeitsystem mit umfangreiche Bibliothek. Erlang kommt zudem mit besonders leistungsfähigen VMs daher. Das System Erlang/OTP (The Open Telecom Platform) ist somit geradezu ideal geeignet für verteilte, hochverfügbare Systeme. Die Erlang VM hat auch eine lange Entwicklung hinter sich. Sie machte Stationen bei JAM, VEE (Virding’s Erlang Engine), Strand88 und über TEAM kam man dann endlich bei Bogdan’s Erlang Abstraft Machine (BEAM) an⁴.
BEAM ist implementiert eine Registermaschine und keine Stackmaschine. Es gibt keine Manipulationsmöglichkeiten für Stacks. In BEAM ist es z.B möglich über einfache Instruktionen Speicher zu allokieren oder Tutel zu initialisieren. Dies ist bei anderen VMs, wie beispielsweise die von Java nicht möglich, da hier in Objekten gedacht und operiert wird. Dadurch ist der Zugriff nur über die Erzeugung eines Objektes möglich, welcher die Details der Speicherallokierung verbirgt. Ebenso ist die Erzeugung neuer Prozesse anders aufgebaut, als es bei der JVM der Fall ist. Die Entscheidung, wann ein weiterer Prozess gestartet wird, erfolgt bei der Erlang VM nicht über Synchronisationsinstruktionen. Betrachten wir einmal die wichtigste Vorteile der Erlang VM ein wenig genauer⁵.
Leicht gewichtige Prozesserzeugung. In nebenläufigen Systemen ein klarer Bonus und Vorteil auch und gerade in Hinblick auf die Komplexität einer Architektur. Man verliert sich während der Entwicklung nicht in Threads. Kurz: Erlang erledigt das System Thread Management. Dies ermöglicht die Fokussierung auf die eigentliche Arbeit, das Entwickeln der Anwendung. Man benutzt während der Entwicklung einfach die Ressourcen, die man benötigt.
Des Weiteren hätten wir eine ideale Nachrichtenverteilung in Erlang implementiert. Solange eine Prozess ID innerhalb der Plattform bekannt ist, kann
man direkt Nachrichten durch die Anwendung genau an diesen Prozess schicken. Ich denke ich brauche die Stärke in diesem Bereich nicht weiter auszuführen, wenn man sich in Erinnerung ruft, dass die Erfinder doch bei einem Kommunikationsunternehmen arbeiteten.
Um die Highlights abzurunden, bietet Erlang noch die Möglichkeit eines Codeaustauschs zur Laufzeit. Dies ist ein extrem wichtiges und -entschuldigen Sie den Ausdruck - coole Eigenschaft. Um eine hohe Verfügbarkeit von Systemen zu erreichen, ist dies eine notwendige Eigenschaft eines Systems. Dies bringt nach Untersuchungen 5-9 neunen an Uptime. Hierbei gilt jedoch auch wieder, dass die Anwendung natürlich so entwickelt sein muss, dass dies auch möglich ist. Es ist wie mit allen Dinge: man bekommt nichts umsonst.
Doch wo es viel Lob gibt, gibt es natürlich auch immer einen Kritikpunkt. In diesem Fall natürlich auch. Erlang ist nun mehr als 20 Jahre alt. Dies ist ein nicht zu unterschätzender Punkt, den man berücksichtigen sollte. Andere Programmiersprachen sind sicherlich auch nicht die jüngsten, haben jedoch im Laufe ihrer Lebenszeit eine starke Entwicklergemeinde hinter sich gehabt und der Sprache so einige Kinderkrankheiten ausgetrieben. Auf der anderen Seite war Erlang immer im behüteten Schoß einer kleinen Entwicklergemeinde. Dies hat auch sein gutes. Da die Sprache dadurch vielleicht genau die gewünschte Robustheit erlangt hat, die sie heute nachweisen kann. Denn nicht umsonst setzen so viele Unternehmen bei der Implementierung genau auf dieses Pferd. Man kann außerdem auch von Kindern viel lernen. Dies zeigen unlängst Managerschulen, in denen Kinder den Erwachsenen beibringen, worauf es im Leben ankommt.
Hier eine kleine Zusammenfassung vor dem Resümee in Anlehnung an Paul O’Rorke⁶ :
Haupteigenschaften:
• Asynchrone Nachrichtenübermittlung
• Synchrone Nachrichtenübermittlung ist möglich
• Tracking/Monitoring von Prozessen, z.B. mit Hilfe eines Nameservers
• Schnelle Prozesserzeugung
• Code Integration von Java und C möglich
Stärken:
• Geeignet für hoch verteilte, nebenläufige Anwendungen mit Zehntausenden von Transaktionen pro Sekunde
• Ermöglicht eine hohe Anzahl von simultanen Prozessen (Produktivsysteme mit 8-9 Millionen Prozessen sind im Einsatz)
• Extensive Inter-Prozess Kommunikation
• Verteilung über heterogene Maschinen ist kein Problem, da Erlang keine Unterscheidung macht, wo der Prozess läuft
• Codeaustausch zur LaufzeitSchwächen:
• Nicht geeignet für Anwendungen wie Number Crunching
• Große VM, daher nicht umbedingt für clientseitige Anwendungen geeignet
Die zu grundliegende Betrachtung von Erlang und seinen Fähigkeiten befürwortet einen Einsatz dieser Sprache oder Systemkomponenten, die in Erlang realisiert worden sind für moderne Projekte in dynamischen und skalierbaren Systemlandschaften wie etwa im Cloud Computing Umfeld. Ob es nun “nur” die Nutzung von beispielsweise CouchDB oder RabbitMQ ist, oder die komplette Anwendung nativ in Erlang entwickelt wird, sei einmal dahingestellt. Es lohnt sich jedenfalls.
Quellen:
[1] Erlang Programming - A Concurrent Approach to Software Development; Autoren: Francesco Cesarini, Simon Thompson; Verlag: O’Reilly Media; Veröffentlicht: June 2009 - http://www.oreilly.de/catalog/9780596518189
[2] Thrift - Scalable Cross-Language Service Implementation; Autoren: Mark Slee, Aditya Agarwal, Marc Kwiatkowski, FACEBOOK - http://thrift.apache.org/static/thrift-20070401.pdf
[3] http://de.wikipedia.org/wiki/Erlang_(Programmiersprache)
[4] The evolution of the Erlang VM - http://www.erlang-factory.com/upload/presentations/247/erlang_vm_1.pdf