2016-02-05 13 views
9

Ich bin mir bewusst, dies ist eine sehr ungenaue Frage und könnte als ungeeignet für Stapel angesehen werden. Leider helfen kleinere Anwendungen (in Bezug auf die Anzahl der Akteure) und "Tutorial-ähnliche" mir nicht, Intuition über den Overhead des Nachrichtenversands und einen schnellen Punkt für die Granularität zwischen einem "Scala-Objekt" und einem "Corba-Objekt" zu entwickeln. .Wie schwer sind Akka Schauspieler?

Während ein Gespräch mit einem Kunden zum Beispiel sehr wahrscheinlich einen Akteur verdient, würde er in den meisten realen Anwendungsfällen konditionale/parallele/alternative Interaktionen beinhalten, die von vielen Klassen modelliert werden. Dies lässt die Wahl zwischen der Behandlung von Akteuren als Fassaden zu recht komplexen Diensten, ähnlich dem gerecht pensionierten EJB, oder ähnlich wie Smalltalk-Objekte, die Nachrichten zwischen einander abfeuern, wann immer Kommunikation asynchron implementiert werden kann.

Abgesehen von dem Overhead der Nachrichtenweitergabe selbst, wird es auch einen Overhead für das Lifecycle-Management geben, und ich bin vorsichtig mit möglichen Problemen, die durch verkettete Neustarts ganzer Teilbäume von Akteuren aufgrund von Ausnahmen oder anderen Fehlern in ihrer Wurzel verursacht werden.

Für diese Frage können wir annehmen, dass die überwiegende Mehrheit der Kommunikation innerhalb einer einzigen Maschine passiert und Netzwerküberquerung ist unbedeutend.

Antwort

8

Ich bin mir nicht sicher, was Sie unter einem "Overhead der Nachricht selbst" verstehen. Wenn Netzwerk/Serialisierung nicht beteiligt ist, ist der Overhead vernachlässigbar: Eine Seite schiebt eine Nachricht in eine Warteschlange, eine andere liest sie aus.

Akka behauptet, dass es so schnell wie 50 Millionen Nachrichten pro Sekunde auf einer einzigen Maschine gehen kann. Dies bedeutet, dass Sie Akteure nicht als Fassade für komplexe Subsysteme verwenden würden. Sie würden sie eher als kleine "Arbeitseinheiten" modellieren. Sie können im Vergleich zu Smalltalk-Objekten komplexer sein, wenn dies praktisch ist. Sie könnten sagen, KafkaConsumerActor, die intern andere "normale" Klassen wie Verbindung, Konfiguration usw. verwenden würden, diese müssen nicht akka Schauspieler sein. Aber es ist immer noch klein genug, um eine einfache Arbeitseinheit zu sein, die eine einfache Sache macht (eine Nachricht konsumiert und sie irgendwo hinschickt).
50 Millionen pro Sekunde ist wirklich viel.

Ein Speicherbedarf ist auch extrem klein. Akka selbst behauptet, dass Sie ~ 2.5 Millionen Schauspieler für nur 1 GB Heap haben können. Vergleiche mit dem, was ein typisches System ist, ist es tatsächlich nichts.

Im Hinblick auf den Lebenszyklus ist das Erstellen eines Akteurs nicht viel schwerer als das Erstellen einer Klasseninstanz und eines Postfachs, so dass ich nicht wirklich erwarte, dass es so bedeutend ist.
Sagen wir, normalerweise haben Sie nicht viele Akteure in Ihrem System, die mit einer Nachricht umgehen und sterben würden. Normalerweise spawnt man Schauspieler, die viel länger leben. Wie ein Schauspieler, der Ihre Hypothekenrückzahlungen basierend auf Parametern berechnet, die Sie zur Verfügung stellen, hat keinen Grund, überhaupt zu sterben.
Auch Akka macht es sehr einfach, Schauspieler Pools (verschiedene Arten von ihnen) zu verwenden.
So Leistung ist hier sehr zwickbar.

Der letzte Punkt ist, dass Sie Akka Overhead in einem Kontext vergleichen sollten. Wenn Ihr System beispielsweise Datenbankabfragen durchführt oder HTTP-Anfragen bedient oder ausführt oder sogar signifikante E/A-Vorgänge durchführt, macht der Aufwand dieser Aktivitäten den Akka-Aufwand so unbedeutend, dass Sie nicht einmal daran denken würden. Eine Hin- und Rückfahrt in die DB für 50 Millis wäre ein Äquivalent eines Overhead von ~ 2,5 Millionen Akka-Nachrichten. Ist es wichtig?

Also können Sie ein Randfall-Szenario finden, in dem Akka Sie zwingen würde, Leistungsstrafen zu zahlen? Wahrscheinlich. Akka ist kein goldener Hammer (und nichts ist).
Aber mit all den oben genannten sollten Sie denken, wenn es Akka ist, dass ein Leistungsengpass in Ihrem spezifischen Kontext ist oder Sie Zeit in Mikro-Optimierung verschwenden.

+1

Danke für einige harte Zahlen. Ich habe darüber nachgedacht im Zusammenhang mit der Verarbeitung einzelner UDP/IP-Pakete, bei denen ein einzelner Akteur jedes von ihnen zur Kenntnis nehmen muss und erst nach dem Erkennen der Konversation ein Teil des Delegierens an den verantwortlichen Akteur ist, der häufig ist vor Ort erstellt. Während es möglich ist, diesen einzigen Konfliktpunkt zu entfernen, würde dies die Komplexität erheblich erhöhen und niemals vollständig auf die Clients übertragen werden, die zahlreiche, aber kleine Low-Level-Geräte sind, die nur sehr einfache Software ausführen können. – Turin

Verwandte Themen