参与序列过程的Akka演员的饥饿

时间:2017-06-21 07:00:02

标签: java akka actor starvation

Bisuness Logic

我们需要完成以下业务逻辑:

100万次:

  1. 下载索引i中的文件
  2. 解压缩文件
  3. 从文件中提取一些信息
  4. 删除文件
  5. 当前的Akka解决方案

    我们目前拥有的Akka解决方案可以创建100万个负责一个文件下载的演员,一旦完成,他们就会创建一个演员来处理2,3,4步骤。

    问题

    一旦我们运行这个过程,我们就遇到了Akka优先考虑下载演员的情况,其余演员都处于饥饿模式。

    我们知道,由于下载演员不断下载,因此机器磁盘已满,但其他演员没有机会扫描和删除文件。

    问题

    1. 有没有办法迫使Akka不要让演员链中的演员们挨饿?
    2. 有没有办法告诉下载actor等到它可以继续通知(例如,磁盘中只有并行的1000个文件)
    3. 感谢。

1 个答案:

答案 0 :(得分:1)

对两种类型的actor使用不同的调度程序:

在您的配置中,您可以定义一个单独的调度程序(例如):

my-dispatcher {
  type = Dispatcher
  executor = "thread-pool-executor"
  thread-pool-executor {
    fixed-pool-size = 32
  }
  throughput = 100
}

然后您可以在创建时将其分配给特定的演员:

val myActor = context.actorOf(Props[MyActor].withDispatcher("my-dispatcher"), "myactor1")

调度程序实际上是线程池。分开这两个保证缓慢的阻塞操作不会使另一个挨饿。一般来说,这种方法被称为批量标题,因为这个想法是,如果应用程序的一部分失败,其余部分仍然保持响应。

有关详细信息,请参阅the documentation