2013-03-21 3 views
48

Ich habe gerade die Leistung von Scala-Darstellern vs Java-Threads verglichen.Wie sind Java-Threads im Vergleich zu Scala/Akka-Akteuren schwer?

Ich war erstaunt, den Unterschied zu sehen, ich beobachtete, dass ich mit meinem System maximal ~ 2000 Threads (nur live) spawnen konnte. Aber mit dem gleichen System konnte ich ~ 500.000 Scala-Akteure erzeugen.

Beide Programme verwendeten rund 81 MB Heap-Speicher von JVM.

Können Sie erklären, wie Java-Gewinde so viel Gewicht als Scala/Akka Schauspieler sind? Was ist der Schlüsselfaktor, der scala-actor so viel Leichtgewicht machte?

Wenn ich die beste Skalierbarkeit erreichen möchte, sollte ich für einen aktorbasierten Webserver anstelle eines Java basierten traditionellen Web/App-Servers wie JBoss oder Tomcat gehen?

Danke.

+3

Wie für Ihre Webserver-Frage, hängt es davon ab, was Sie brauchen. Es gibt wirklich skalierbare Lösungen mit hohem Durchsatz, basierend auf NIO wie Netty, und sie verwenden keine Aktoren. Benötigen Sie einen ausgewachsenen Webserver? hohe Verkehrsleistungen? Hohe Integration mit bekannten Frameworks (Jee, Feder, ...)? Schauspieler im Allgemeinen und Akka 2.1 insbesondere mit Unterstützung für Clustering oder spielen! das auf akka basiert, ist auch eine "skalierbare" lösung, aber es gibt keine silberne kugel für alle szenarien. Es hängt wirklich von Ihren Bedürfnissen ab. –

Antwort

37

Scala-Aktoren (einschließlich der Akka-Variante) verwenden Java-Threads. Es gibt keine Magie: mehr als ein paar tausend Threads, die gleichzeitig laufen, sind ein Problem für die meisten Desktop-Rechner.

Das Actor-Modell ermöglicht Wake-on-Demand-Actors, die keinen Thread belegen, es sei denn, sie haben Arbeit. Einige Probleme können effektiv modelliert werden, da viele schlafende Agenten darauf warten, etwas Arbeit zu bekommen, die es relativ schnell erledigen und dann wieder schlafen gehen. In diesem Fall sind Akteure eine sehr effiziente Möglichkeit, Java-Threading zu verwenden, um Ihre Arbeit zu erledigen, besonders wenn Sie eine Bibliothek wie Akka haben, bei der Leistung eine hohe Priorität hatte.

Die Akka docs erklären die Grundlagen ziemlich gut.

Alle vernünftig skalierbaren Webserver müssen diese Art von Problem auf die eine oder andere Weise lösen; Sie sollten Ihre Entscheidung für Webserver wahrscheinlich nicht primär darauf basieren, ob die Akteure unter der Haube eingesetzt werden, und unabhängig davon, was Sie verwenden, können Sie immer selbst Schauspieler hinzufügen.

+0

Ich bin nicht sicher, ob die Dokumente das unterstützen, was Sie geschrieben haben, denn sie sagen "... typischerweise teilen sich viele Akteure einen Thread". – Suma

+2

@Suma - Ich glaube nicht, dass du meinen zweiten Absatz verstanden hast. –

16

Ein Akka-Actor entspricht nicht einem Thread. Es ist eher wie ein Callable, der auf einem Threadpool ausgeführt wird.

Wenn eine Nachricht an einen Akteur gesendet wird, wird dieser Akteur in einen Threadpool platziert, um die Nachricht zu verarbeiten. Wenn es fertig ist, kann der gepoolte Thread verwendet werden, um andere Akteure auszuführen.

Verwandte Themen