Pol*_*ase 2 streaming asynchronous akka
来自Akka文档,流水线和并行性
默认情况下,将Akka Streams处理阶段(即Flow和Source或图形结点上的简单运算符)“融合”在一起,并按顺序执行。这避免了跨越异步边界的事件的开销,但将流程限制为在任何给定时间最多执行一个阶段。
跨越异步边界的事件是什么意思?
在《两个莫妮克斯流的传说》和相应的幻灯片中也经常使用相同的术语
实现流时,将ActorMaterializer决定如何运行不同的阶段。默认情况下,所有阶段都在幕后的同一actor中顺序运行。这是为了避免如果每个阶段都在不同的actor中运行时将发生的线程上下文切换开销。
在async舞台上使用运算符时,是在告诉实现器要在该点创建异步边界。这意味着该舞台将在幕后在其自己的演员中进行。根据情况,这可能会影响性能,因为事件将跨越异步边界。
例如:
Source(List("A","B","C "))
.map(x => x.toLowerCase)
.async
.map(x => x.toUpperCase)
.map(x => x.trim)
.runWith(Sink.ignore)
Run Code Online (Sandbox Code Playgroud)
此流将运行阶段,map(x => x.toLowerCase)在不同的演员比阶段map(x => x.toUpperCase)和map(x => x.trim)。最后两个将在同一演员中运行。
最后要提到的是异步边界还允许在流内部并行处理事件。每个异步边界都可以独立处理事件,因为它们在不同的参与者中运行(只要下游有需求)。在此简单的场景,“B”可以在被处理map(x => x.toLowerCase)的同时与“A”在被处理map(x => x.toUpperCase)和map(x => x.trim)。
我希望这有助于更多地了解流的工作方式。