我偶然发现了Akka调度员的throughput-deadline-time
配置属性,它看起来像一个有趣的选项,但是我在整个文档中找到的唯一提及的是:
# Throughput deadline for Dispatcher, set to 0 or negative for no deadline
throughput-deadline-time = 0ms
我认为我们可以同意这不是很有帮助。
那么throughput-deadline-time
控制什么,以及它对我的调度员有什么影响?
答案 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就会切换到另一个演员/邮箱。