Akka演员和日程安排

时间:2016-05-18 07:43:14

标签: akka

以下示例在调度消息时是否是经典的反模式?

class MyActor extends Actor {

  private val scheduler = context.system.scheduler.schedule(3.seconds, 3.seconds, self, Tick)

  def receive = {
    case Tick => processMessage(....)
  }
}

为什么我不能使用本地调度程序?

1 个答案:

答案 0 :(得分:0)

我将尝试总结您为什么不应将调度程序用作默认模式。

  1. 如果您提交的任务数量多于您处理的任务数量,那么您的JVM可能会耗尽内存,或者您的任务可能会延迟。
  2. 演员调度程序不是持久性的,所以如果例如在17:50你安排了一个Tick消息在10分钟内发送,但是由于一些例外,你的演员被主管17:53作为默认监督的一部分重新启动策略,因此您的计划任务将被延迟3分钟...为了解决此问题,您可以使用持久性演员,该演员将重播所有预定事件并在事件时间较长时重新安排它,那么您安排时段的当前时间将为delta这两个时间戳。
  3. 基于HashedWheeltimer的Akka调度程序,最适合安排短期
  4. 在我们的项目中,我们正在使用"每个请求的演员"模式我们将消息从"请求演员"发送给其他演员。然后设置context.setReceiveTimeout(x seconds)。如果我们没有收到任何响应x秒,我们认为这个消息丢失并根据我们使用的模式应用我们的逻辑"至少一次"或者"最多一次"递送