Wie vergleicht sich akka mit Erlang? [geschlossen]

97

Ich habe mir kürzlich Akka angesehen und es ist ziemlich beeindruckend. Es sieht so aus, als hätte es die meisten Killer-Funktionen von erlang - Standorttransparenz, Überwachungshierarchien und mehr. Gibt es irgendwelche Funktionen, die erlang hat, die akka nicht hat?

Ryeguy
quelle
Sehen Sie sich diesen Film über erlang in der Praxis an. Schade, dass es keine über scala gibt youtube.com/watch?v=G0eBDWigORY
mhstnsc

Antworten:

123

Haftungsausschluss: Ich bin der PO für Akka

  • Erlang kopiert beim Senden - Akka verwendet gemeinsam genutzten Speicher (unveränderliche Objekte) für In-VM-Sendungen
  • Erlang führt pro Prozess GC durch - Akka verwendet JVM-GCs
  • Erlang hat OTP - Akka integriert sich in das gesamte Java-Ökosystem (Apache Camel, JAX-RS usw. usw.)
  • Erlang erledigt die Prozessplanung für Sie - Mit Akka können Sie viele verschiedene Dispatcher mit endlosen Konfigurationsmöglichkeiten verwenden
  • Erlang lädt Hotcode neu - Akka kann dies unterstützen, ist jedoch aufgrund des Ladens von JVM-Klassen weniger flexibel

Das sind die von oben.

Auf der anderen Seite bedeutet die Verwendung von Akka, dass Sie Scala, Java, Groovy oder JRuby verwenden können, um Ihre Anwendungen zu schreiben.

Viktor Klang
quelle
39
Erlang-Objekte sind ebenfalls unveränderlich und das Parallelitätsmodell erfordert kein Kopieren beim Senden innerhalb desselben Knotens. BEAM für große Objekte sendet eine Referenz. Quelle: diese SO-Antwort von @rvirdig .
FooF
26
Erlang führt Copy-on-Send durch, um die GC effizienter zu gestalten - es kann pro Prozess ausgeführt werden. Aus diesem Grund gibt es in Erlang-Apps im Gegensatz zu JVM / Akka-Apps keine großen GC-Pausen.
andreypopp
4
Nun, Andrey, das hängt davon ab, welche JVM / GC Sie verwenden. azulsystems.com/products/zing/whatisit
Viktor Klang
4
Erlang hat eine Reduktionszahl für jeden Prozess. Selbst wenn Sie sich in einer ausgelasteten Rechenschleife befinden, kann Erlang VM den Prozess anhalten und anderen hungrigen Prozessen erlauben, mehr CPU-Zyklen zu benötigen. Dies ist eine sehr wichtige Funktion, die JVM nicht bietet.
Daniel
6
@MaX Erlang ist häufig 5x langsamer als Java, da keine JIT-Unterstützung vorhanden ist. Aber Erlang hat keine GC-Pause, es ist für Parallelität und 7 * 24-Telekommunikationsanwendungen konzipiert. Erlang kümmert sich mehr um Prozessgerechtigkeit, vermeidet Hunger und Deadlock. Es ist nicht für Durchsatz wie JVM ausgelegt. Es ist also wirklich Orange und Apfel.
Daniel
74

In Erlang werden Prozesse garantiert ungefähr alle 1000 Reduktionen umgeschaltet. In einem so naiven Rahmen wie Scala / Akka besitzt der Agent einen Scheduler, bis die Arbeit im Empfang abgeschlossen ist. Schachmatt. Spiel ist aus. Hasta la vista :) Leute, verschwenden Sie Ihre Zeit nicht mit Pseudotechnikern. Ich war schockiert, dass die Leute hier Scala mit Erlang vergleichen.

Es gibt auch viele andere sogenannte "Killer-Features", aber hier ist mein Rat, denken Sie nicht in Features, denken Sie an Redewendungen, die eine bestimmte Sprache ermöglichen. Scala stiehlt "beste Funktionen", Erlang ermöglicht / implementiert Sie mit den richtigen Redewendungen, um Systeme zuverlässig zu erstellen, mit einer Hochsprache, die von diesen richtigen Redewendungen abhängt. Wenn Sie Erlang lernen, bauen Sie Ihren Geist wieder auf, Ihre Denkweise über verteilte zuverlässige Systeme, Erlang lehrt Sie und aktualisiert Sie. Scala ist nur eine weitere zwingende Sprache (oh, sorry, multiparadigmales, lustiges Wort), die versucht, gute Funktionen aus anderen Sprachen zu stehlen.

vjache
quelle
9
Die Erlang-Methode, alle E / A implizit asynchron zu machen, ist sehr elegant. Async IO kann mit NIO-APIs in Scala ausgeführt werden, was für mich nicht wie ein Schachmatt aussieht, sondern eine weniger elegante Lösung.
HRJ
7
wovon zum Teufel redest du?! Wie ist die Verarbeitung von 1000 direkten Aufgaben besser als eine Roundrobin-Planung oder sogar in der Nähe einer kleinsten Mailbox-Planung?
FUD
8
@vjache - ich stimme zu. Meine vielen Jahre als Java-Programmierer haben mich gelehrt, dass Sie irgendwann die Ebene unter Ihnen untersuchen müssen. Scala / Akka scheint nur eine weitere Ebene über vielen anderen Ebenen (z. B. nio, netty usw.) zu sein, die Sie alle irgendwann verstehen müssen. Obwohl ich gerade erst angefangen habe, mit Erlang zu arbeiten, habe ich anscheinend weniger Ebenen, die ich verstehen muss, um die Arbeit zu erledigen. Die verteilte Programmierung in Erlang ist für Scala / Akka viel leichter, wahrscheinlich ähnlich wie Python die leichtere Alternative zu Java für Web-Apps.
Chris Snow
@FUD: Vielleicht meinte er 1000 Erlang Anweisungen? er konnte nicht 1000 Nachrichten gemeint haben ...
Erik Kaplun
2
@ErikAllik Er meinte 1000 "Ermäßigungen". Stellen Sie sich eine Reduzierung als Token vor, um ein bisschen Code auszuführen (das ist es nicht, aber es macht den Job zum Erklären ...). Nach 1000 Reduzierungen wechselt der Scheduler zu einem anderen Prozess. Weitere Infos unter erlang.org/pipermail/erlang-questions/2001-April/003132.html
Aegis
40

Fast niemand erwähnt die Prozessisolation. Ohne die Garantie "Ihr Thread kann sich nicht mit meinem Müll anlegen" sind verteilte Systeme viel schwieriger zu überlegen. (Sie sind bereits schwierig genug mit Erlangs Prozessen.)

AFAIK (was angesichts meiner begrenzten direkten Erfahrung mit der JVM nicht weit ist), nur Erlang erhält tatsächlich Prozessisolation "richtig" auf der JVM. Herr Google kann einige Hinweise geben, wo Fox und Candea (?) Nachforschungen zu Forschungssystemen anstellen können, die eine "Micro-Reboot" -Technik ("Recovery-Oriented Computing") verwenden. Ein Erlang-Entwickler liest diese Forschung und sagt ein paar Dinge:

  1. Willkommen im Club, warum hast du so lange gebraucht?
  2. Die JVM macht es jedoch furchtbar schwer, Mitglied zu werden. :-)
Scott Lystig Fritchie
quelle
Prozessisolation ist in der Tat super nett. Allerdings ist auch Erlang nicht immun gegen einen schiefgegangenen NIF.
Viktor Klang
14

Für mich ist das Austauschen von heißem Code in einem gesamten Erlang-Cluster ohne Ausfallzeit (zum Beispiel :) make:all([netload]eine der Killerfunktionen von Erlang.

Aber lassen Sie uns Ihre Frage umkehren: Was hat Akka, was Erlang nicht hat? Natürlich können Sie Java Dutzende von Erweiterungen und Bibliotheken (Scala, Akka, Spring, Osgi, ...) hinzufügen, um zu versuchen, Erlang nahe zu kommen. Aber wo ist der Punkt? Insgesamt sind all diese Erweiterungen viel komplexer als das Erlernen der einfachen Erlang-Sprache, die seit über zwei Jahrzehnten bewiesen hat, dass sie die Aufgabe bietet, eine maximale Skalierbarkeit ohne Ausfallzeiten zu bieten.

Rumpelstilz
quelle
30
IMO, Scala ist eine viel bessere Sprache auf Syntaxebene als Erlang. Es hat Objekte, Eigenschaften, richtige Namespaces, richtige Typensicherheit, keine hässliche Datensatzsyntax usw. Die Community ist größer, ich kann alle verfügbaren Java-Tools verwenden und es fühlt sich einfach besser an.
Ryeguy
15
@ryeguy: "Bessere Sprache auf Syntaxebene" ... hmm, definiere "besser" für "Syntax". Wenn ich Sprachen vergleiche, ist die Syntax der irrelevanteste Faktor (weil es nur um den Geschmack oder die Verwendung geht).
Peer Stritzinger
4
@ryeguy Unterschiedliche Semantik, unterschiedliche Syntax.
Rvirding
3
Hot-Code-Austausch wird zu einem Problem, wenn Sie den Status zwischen verschiedenen Code-Versionen beibehalten müssen. Am Ende ist es einfacher, den Prozess herunterzufahren und den Status beim Start zu migrieren
OlegYch
4
@ryeguy Die Syntax einer Programmiersprache ist nahezu irrelevant. Was zählt, ist seine Semantik. Erlang ist ein funktionaler PL, daher hat er natürlich keine Objekte. Eigenschaften, Typensicherheit usw. sind darauf zurückzuführen, dass Scala eine stark typisierte Sprache ist, während Erlang dynamisch typisiert wird. Das ist eine Design-Wahl. Trotzdem möchte ich Sie einladen, sich Elixir anzuschauen, wenn Sie die Vorteile von Erlang mit einem moderneren Gefühl nutzen möchten;)
Aegis
5

Wahrscheinlich ist Erlang besser für größere verteilte Systeme (nach der Antwort von vjache), aber für einen normalen Server, wenn Sie nur die volle Leistung mehrerer CPUs nutzen möchten, ist Akka eine gute Wahl - bietet gute Abstraktion, Leistung und Integration in das Java-Ökosystem.

Kodstark
quelle