3

我有一组按不同时间表运行的几个 Akka 作业。最近,我添加了一些每天运行一次的作业,这些作业需要从磁盘读取文件并处理数据。因为从磁盘读取是一个阻塞操作,所以我的代码在执行计划操作时等待并且不运行任何计划作业。有谁知道调度线程不会被挂起的磁盘 IO 操作阻塞的方法?我在下面包含了我的一位演员的代码。

调度程序代码:

lazy val system = akka.actor.ActorSystem("system")
lazy val emailActor = system.actorOf(Props[EmailActor], name = "EmailActor")

system.scheduler.schedule(3 hours, 24 hours)(emailActor ! System.currentTimeMillis)

演员实现:

class EmailActor extends Actor {
  override def receive = {
    case _ => EmailSyncer.process()
  }
}

处理器:

def process() = {
  DataWarehouse.dataWarehouse withSession {
    val file = "/some/file/name"
    val emails = Try { Source.fromFile(file).getLines.map(l => Email(l)) }

    ...
  }
}
4

1 回答 1

3

这是 Akka 中的常见问题。因此,解决它的模式很容易获得。查看“隔板”。我在下面包含了一篇博文,向您展示了您需要做什么。

一般的想法是,您可以将不同的参与者放在不同的执行上下文或俚语“故障区”中。这使您可以防止资源耗尽和其他问题渗入应用程序的其他部分。只有一个执行上下文会饿死,没有别的。

您还可以根据每个故障区域的操作不同地调整线程池。通常,用于阻塞操作和计算密集型事物的大量线程将是每个内核一个线程从那里开始和调整。

祝你好运。

http://letitcrash.com/post/40755146949/tuning-dispatchers-in-akka-applications

于 2013-11-14T19:56:35.820 回答