2016-06-01 4 views
5

Mein Stream hat eine gleichmäßige Mischung aus CPU-gebundenen und IO-gebundenen Stufen (jeder IO-Stufe folgt eine CPU-Stufe). Ich möchte die IO-Operationen auf einen anderen Dispatcher als den Rest des Streams stellen. In einer traditionellen aktarbasierten Akka-Anwendung hätte ich meine IO-Actors auf einen festen Thread-Pool-Dispatcher mit vielen Threads setzen können, während die CPU-gebundenen Actors auf einen Fork-Join-Pool mit einer kleinen Anzahl von Threads (einige multiple, idealerweise 1, der Anzahl der Kerne). Das sollte die Zeit reduzieren, die beim Threadwechsel für die CPU-gebundenen Akteure verschwendet wird, während der Durchsatz erhöht wird, indem viele Threads für IO blockiert werden.Akka-Stream - Setzen eines IO-gebundenen Flusses auf einen anderen Dispatcher

Ist dieses Verständnis richtig? Wenn nicht, warum? Wenn ja, wie setze ich meine IO-gebundenen Stufen (Flows) auf einen separaten Dispatcher vom Rest des Streams?

Ich habe versucht, Auto-Fusing zu deaktivieren, und das hilft. Aber es hat immer noch einen viel geringeren Durchsatz als das fast gleichwertige Akka-Pendant.

Antwort

8

Der Standardwert ist, dass alle Stufen in einem Fluss auf demselben Schauspieler ausgeführt werden, können Sie markieren die Stufen auf einem separaten Dispatcher laufen sollen Attribute verwenden, etwa so:

stage.withAttributes(ActorAttributes.dispatcher("dispatcher-name")) 

Dies wird auch asynchrone Grenzen einführen um diese Phase, effektiv es in seinem eigenen Schauspieler zu laufen. Um zu vermeiden, dass die asynchrone Grenze zu teuer wird, sendet die Stufe nun tatsächlich eine Anforderung von 16 Elementen zu einer Zeit von stromaufwärts, so dass dies etwas ist, was Sie beachten müssen.

Die Puffergröße kann mit einem zusätzlichen Attribut angepasst werden. In diesem Fall verhält es sich wie eine fusionierte Stufe, da es nach einem Element gleichzeitig fragt. Beachten Sie, dass dies je nach Anwendungsfall zu viel Aufwand verursachen kann.

stage.withAttributes(Attributes.inputBuffer(1, 1)) 

Relevante Teile der Dokumentation:

+0

Danke für die Antwort. Das ist, was ich gesucht habe. – anindyaju99

+0

Was ist, wenn ich eine Antwort zurückgeben und im Hintergrund arbeiten möchte? [This] (https://gist.github.com/asarkar/37e4cb026c463f6334617e923cfc4b12) scheint zu funktionieren. –

Verwandte Themen