我有一个带有Akka流的管道,它使用自定义调度程序。
Akka流代码:
// Pulls in data via network requests
source
// Downstream will be sent to a different actor.
// Also, a "buffer" of 16 elements will be created between those actors.
.async
.via(writeToDatabase())
.toMat(Sink.ignore)(Keep.right)
.withAttributes(ActorAttributes.dispatcher("customer-dispatcher"))
.run()调度员配置:
custom-dispatcher {
type = Dispatcher
executor = "thread-pool-executor"
thread-pool-executor {
fixed-pool-size = 16
}
throughput = 1
}我的理解是,默认情况下,.async将插入由16个元素组成的缓冲区。
在引入异步边界时,Akka Streams API在每个异步处理阶段之间插入一个缓冲区。
来源:https://blog.colinbreck.com/maximizing-throughput-for-akka-streams/
throughput=1问题:设置会导致缓冲区始终只有一个文档吗?
发布于 2021-09-03 20:11:13
不是的。
Akka调度程序负责(除其他外)在线程池中调度参与者。throughput配置设置了在另一个参与者能够在线程上调度之前,参与者将从其邮箱处理的最大消息数。较低的吞吐量值意味着更多的上下文切换,从而降低性能:交换的好处是,处理消息需要很长时间的参与者不太可能占据线程。
在Akka流中异步边界引入的缓冲区是不同的,基本上是背压协议的一部分。可以使用akka.stream.materializer.max-input-buffer-size配置选项设置这些缓冲区的默认大小,也可以通过向边界添加Attributes.inputBuffer属性以编程方式设置每个异步边界。
Akka流可能会受到dispatcher吞吐量的影响,但在流参与者多于dispatcher线程的情况下,这种影响会显着。由于信号需求的内部消息以及那些从参与者到参与者的流元素都会受到影响,所以效果是什么是不可预测的。
https://stackoverflow.com/questions/69049613
复制相似问题