Warum Schauspieler pro Anfrage in Spray ist besser oder schlechter als Thread pro Anfrage (wie in Tomcat). Welche Strategie bietet bessere Leistung?Warum ist Actor pro Anfrage in Spray besser/schlechter als Thread pro Anfrage (wie in Tomcat)?
Antwort
Wenn Sie HTTP verwenden, haben Sie ein Stateless-Protokoll. Somit ist es perfekt für Schauspieler geeignet.
Ich denke, bevor Sie jeden Aspekt aufschreiben. Ich leite Sie zu dieser guten Antwort um, die meine Aussage auf eine allgemeinere Ebene bringt. How does Actors work compared to threads?
EDIT:
Schauspieler im Grunde nicht Staat teilen und die Daten in den Nachrichten sind unveränderlich. Wenn Sie Threads verwenden, können Sie leicht Daten zwischen ihnen austauschen und müssen auch Dinge wie Lebensdauer und Anzahl der begonnenen Threads behandeln. Es ist eine grundlegende Tatsache, dass der gemeinsame Status (wenn nicht unveränderlich) DeadLocks und andere gleichzeitige Situationen verursachen kann. Ich werde nicht die Tatsache auslassen, dass Sie vorimplementierte ThreadPools verwenden können, die viele Dinge für Sie einschließlich des ExecutionContext behandeln werden. Viele Leute verwenden Threads falsch, einschließlich mir selbst - ich bin kein Profi im Thema Threads und alle Probleme der Nebenläufigkeit. https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html
Ein Schauspieler sollte klein sein und "eins" Ding/Thema/Anwendungsfall sehr gut tun. Sie sind hirachirmal aufgebaut, was bedeutet, dass Sie ein ActorSystem haben, einen RootActor, der viele Childs unterschiedlicher Typen haben kann und so weiter. Es ist die Kommunikation über das Senden von Asynchron-Nachrichten (Sie können auch in einem blockierenden Stil arbeiten). Wenn du einen Akteur startest, läuft es in einem Thread. Das heißt, wenn Sie 10 Nachrichten senden, die 1 Sekunde verarbeitet werden müssen, werden alle Nachrichten nach ~ 10 Sekunden verarbeitet. Dies ist nicht sehr parallel und daher können Sie mehr Actors spawnen, aber wenn Sie sie jetzt korrekt verwenden, laufen sie in einer Menge x von Shared Threads. Dies verhindert, dass die Threads getötet werden und neue entstehen. Es wird alles unter der Haube gehandhabt und Sie können es über TypeSafeConfig konfigurieren. Als ein unrealistisches Beispiel kannst du 20 Schauspieler spawnen, aber sie laufen in 4 Threads - nicht 20. All dies wird von Akka-Schauspielern gehandhabt und du musst nur überlegen, welchen Dispatcher, Router, Mailbox du für deinen Zweck benutzt. Und das ist was Spray tut.
Zurück zu HTTP: Es ist zustandslos, dh nachdem die TCP-Con eingerichtet wurde, senden Sie Ihre HTTP-Anfrage und Sie erhalten Ihre HTTP-Antwort. Danach ist diese Konversation veraltet und für HTTP nicht relevant. Eine Sitzung wird über HTTP-Header identifiziert, aber das Protokoll selbst wird nichts damit zu tun haben, das Session-Zeug ist die Aufgabe Ihrer Anwendung. Für die Bearbeitung von Anfragen wird repsonse spray einen Pool von Threads mit einigen Actors haben, die die Anfrage bearbeiten und auf Ihre Routes umleiten.
Eine Sache, die Sie auf Ihrem Radar haben sollten: Spray ist ein REST/HTTP-Framework. REST impliziert, dass jede Nachricht alle Informationen enthalten sollte, die benötigt werden, um entsprechend zu reagieren, wenn Sie sie sehr streng und geradlinig sehen.
Ich hoffe, dass dies die Dinge ein wenig aufheben wird. Wenn Sie tiefer in das von Spray verwendete ActorModel eintauchen möchten, sollten Sie auf deren Website (Entschuldigung, ich habe keinen Link dafür) schauen oder den Code durchsuchen, was sehr hilfreich sein kann. Ich weiß, dass es sehr einfach ist, was ich erzähle, aber es gibt ziemlich gute Blogeinträge zu all diesen Themen und ich denke, das ist nicht der richtige Kontext, um einen ganzen Roman zu schreiben.
Außerdem weiß ich nicht, wie Threads in Tomcat verwendet werden, was auch eine sehr wichtige Frage ist. Aber ich würde an einen ThreadPool denken, weil er weniger umfangreich ist. – sascha10000
Ich würde nicht sagen, dies qualifiziert sich als eine Antwort auf die Frage. Ich poste dies als * Kommentar *. –
Bitte argumentieren, warum Actors für statusfreie Protokolle wie HTTP gut ist? – pacman
Wilde Schätzung: Thread ist eine begrenzte Systemressource, Schauspieler wartet auf asynchrone Antwort von z. DB ist nicht (Thread wird für einen anderen Akteur freigegeben). Wenn Ihre Anwendung also asynchron ist, können Sie mehr Verbindungen offen halten als mit 1 thread = 1 Verbindungsmodell (wie Tomcat), und Ihr System wird nicht heruntergefahren. –
Ich glaube nicht, dass es darum geht, "wer ist besser".Der Actor-Ansatz erfordert keinen Thread pro Akteur, sodass Sie * skalieren * können, wenn die Anzahl der Anfragen zunimmt, im Gegensatz zu einem dedizierten Thread pro Anfrage, bei dem die Anzahl der Threads eng an das zugrunde liegende Betriebssystem gekoppelt ist. Wenn Ihr Service Ihre Maschine nicht belastet, bezweifle ich, dass Sie einen großen Unterschied sehen werden. –
Grundsätzlich beschränken Sie sich auf die Anzahl der Threads, bei denen die Systemressourcen begrenzt sind, auf den Thread pro Anfrage. Es ist ein Problem, wenn die meisten Ihrer Threads auf IO warten und sehr wenige von ihnen Benutzer tatsächlich bereitstellen. Auf der anderen Seite können Akteure warten, ohne Ihre Threads zu blockieren, sodass Sie mit derselben Anzahl von Bedrohungen mehr Benutzern dienen können. –