我的流具有CPU绑定和IO绑定阶段的均匀混合(每个IO阶段后跟一个CPU阶段)。我想要做的是将IO操作放在与流的其余部分不同的调度程序上。
在传统的基于演员的Akka应用程序中,我可以将我的IO演员放在具有大量线程的固定线程池调度程序上,同时将CPU绑定的actor放在具有少量线程的fork连接池中(有些多个,理想情况下) 1,核心数量)。这应该减少CPU绑定参与者的线程切换浪费的时间,同时通过在IO上阻塞大量线程来增加吞吐量。
这种理解是对的吗?如果没有,为什么?如果是,那么如何将我的IO绑定阶段(流)放在与流的其余部分分开的调度程序上?
我尝试关闭自动融合,这确实有帮助。但它的吞吐量仍然远低于几乎相当于Akka的产量。
答案 0 :(得分:9)
默认情况下,流中的所有阶段都在同一个actor上运行,您可以使用属性标记这些阶段应在单独的调度程序上运行,如下所示:
stage.withAttributes(ActorAttributes.dispatcher("dispatcher-name"))
这也将在该阶段引入异步边界,在其自己的actor中有效地运行它。为避免异步边界变得昂贵,现在阶段实际上会从上游一次发送16个元素的需求,因此这是您必须注意的事项。
可以使用附加属性调整缓冲区大小,在这种情况下,使其行为类似于融合阶段,因为它一次要求一个元素,请注意,这可能会产生过多的开销,具体取决于用例。 / p>
stage.withAttributes(Attributes.inputBuffer(1, 1))
文档的相关部分: