Akka 阿克卡演员和调度员

Akka 阿克卡演员和调度员,akka,Akka,在调度消息时,下面的示例是经典的反模式吗 class MyActor extends Actor { private val scheduler = context.system.scheduler.schedule(3.seconds, 3.seconds, self, Tick) def receive = { case Tick => processMessage(....) } } 为什么我不应该使用本地调度程序?我将尝试总结为什么不应该使用调度程序作为默

在调度消息时,下面的示例是经典的反模式吗

class MyActor extends Actor {

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

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

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

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

  • 如果提交的任务数超过了处理的任务数,JVM可能会内存不足或任务延迟
  • Actor scheduler不是持久性的,因此,例如,如果您在17:50计划在10分钟内发送一条勾号消息,但由于某些异常,您的Actor被supervisor 17:53 Actor重新启动,作为默认监督策略的一部分,因此您计划的任务将延迟3分钟。。。为了解决这个问题,您可以使用persistent actor,它将重播所有计划的事件,并在事件时间大于当前时间时重新安排它。您的计划周期将是这两个时间戳的增量
  • Akka调度器基于最适合短时间调度的
    HashedWheeltimer

  • 在我们的项目中,我们使用“每个请求的参与者”模式,我们从“请求参与者”向其他参与者发送消息,然后设置
    context.setReceiveTimeout(x秒)
    。如果我们在X秒内没有收到任何响应,我们认为这个消息是丢失的,根据我们使用的“至少一次”或“至多一次”交付的方式应用我们的逻辑。

    我已经看到的一个问题是测试这个角色变得困难。假设我在这个演员里面有相当多的逻辑,那么我就注定了,但除此之外,这被认为是反模式吗?你们觉得怎么样?