Что делает опция конфигурации "throughput-deadline-time"?
Я наткнулся на throughput-deadline-time
Свойство конфигурации для диспетчеров Akka, и оно выглядит как интересный вариант, однако единственное упоминание о нем, которое я смог найти во всей документации, заключается в следующем:
# Throughput deadline for Dispatcher, set to 0 or negative for no deadline
throughput-deadline-time = 0ms
Я думаю, что мы можем согласиться, что это не очень полезно.
Так что же throughput-deadline-time
контроль, и какое влияние это оказывает на моего диспетчера?
1 ответ
Итак, я взглянул на исходный код 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
настраивает максимальное количество времени, которое будет потрачено на обработку одного и того же почтового ящика, прежде чем переключиться на почтовый ящик другого участника.
Другими словами, если вы настраиваете диспетчер с помощью:
my-dispatcher {
throughput = 100
throughput-deadline-time = 1ms
}
Затем почтовый ящик участников будет обрабатывать не более 100 сообщений одновременно, в течение не более 1 мс, при каждом достижении первого из этих ограничений Akka переключается на другого субъекта / почтовый ящик.