“吞吐量 - 截止时间”配置选项有什么作用?

时间:2018-06-05 08:00:15

标签: akka akka-actor akka-dispatcher

我偶然发现了Akka调度员的throughput-deadline-time配置属性,它看起来像一个有趣的选项,但是我在整个文档中找到的唯一提及的是:

  # Throughput deadline for Dispatcher, set to 0 or negative for no deadline
  throughput-deadline-time = 0ms

我认为我们可以同意这不是很有帮助。

那么throughput-deadline-time控制什么,以及它对我的调度员有什么影响?

1 个答案:

答案 0 :(得分:2)

所以我查看了Akka源代码,发现Mailbox中的这个方法似乎实现了throughput-deadline-time的行为:

/**
 * Process the messages in the mailbox
 */
@tailrec private final def processMailbox(
  left:       Int  = java.lang.Math.max(dispatcher.throughput, 1),
  deadlineNs: Long = if (dispatcher.isThroughputDeadlineTimeDefined == true) System.nanoTime + dispatcher.throughputDeadlineTime.toNanos else 0L):     Unit =
  if (shouldProcessMessage) {
    val next = dequeue()
    if (next ne null) {
      if (Mailbox.debug) println(actor.self + " processing message " + next)
      actor invoke next
      if (Thread.interrupted())
        throw new InterruptedException("Interrupted while processing actor messages")
      processAllSystemMessages()
      if ((left > 1) && ((dispatcher.isThroughputDeadlineTimeDefined == false) || (System.nanoTime - deadlineNs) < 0))
        processMailbox(left - 1, deadlineNs)
    }
  }

这段代码清楚地表明:throughput-deadline-time配置在切换到另一个actor的邮箱之前处理同一邮箱所花费的最长时间。

换句话说,如果您使用以下命令配置调度程序:

my-dispatcher {
  throughput = 100
  throughput-deadline-time = 1ms
}

然后,演员的邮箱一次最多处理100条消息,在最多1分钟内,每当达到第一个限制时,Akka就会切换到另一个演员/邮箱。