首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Scala,Akka)在Akka流缓冲器上设置调度器throughput=1的效果

(Scala,Akka)在Akka流缓冲器上设置调度器throughput=1的效果
EN

Stack Overflow用户
提问于 2021-09-03 19:07:34
回答 1查看 203关注 0票数 1

我有一个带有Akka流的管道,它使用自定义调度程序。

Akka流代码:

代码语言:javascript
复制
// 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()

调度员配置:

代码语言:javascript
复制
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问题:设置会导致缓冲区始终只有一个文档吗?

EN

回答 1

Stack Overflow用户

发布于 2021-09-03 20:11:13

不是的。

Akka调度程序负责(除其他外)在线程池中调度参与者。throughput配置设置了在另一个参与者能够在线程上调度之前,参与者将从其邮箱处理的最大消息数。较低的吞吐量值意味着更多的上下文切换,从而降低性能:交换的好处是,处理消息需要很长时间的参与者不太可能占据线程。

在Akka流中异步边界引入的缓冲区是不同的,基本上是背压协议的一部分。可以使用akka.stream.materializer.max-input-buffer-size配置选项设置这些缓冲区的默认大小,也可以通过向边界添加Attributes.inputBuffer属性以编程方式设置每个异步边界。

Akka流可能会受到dispatcher吞吐量的影响,但在流参与者多于dispatcher线程的情况下,这种影响会显着。由于信号需求的内部消息以及那些从参与者到参与者的流元素都会受到影响,所以效果是什么是不可预测的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69049613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档