0

商业逻辑

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

100 万次:

  1. 下载索引 i 中的文件
  2. 解压文件
  3. 从文件中提取一些信息
  4. 删除文件

当前的 Akka 解决方案

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

问题

运行该过程后,我们遇到了 Akka 将下载 actor 置于最高优先级的情况,而其余的 actor 则处于饥饿模式。

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

问题

  1. 有没有办法强制 Akka 不要让演员链中的演员挨饿?
  2. 有没有办法告诉下载参与者等到它收到可以继续的通知(例如,磁盘中不超过并行 1000 个文件)

谢谢。

4

1 回答 1

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")

调度程序实际上是线程池。将两者分开保证了缓慢的阻塞操作不会使另一个饿死。这种方法通常被称为bulk-heading,因为它的想法是如果应用程序的一部分发生故障,其余部分仍然保持响应。

有关更多信息,请参阅文档

于 2017-06-21T09:04:33.120 回答