Акка - Диспетчеры - PullRequest
       27

Акка - Диспетчеры

3 голосов
/ 13 июня 2019

Я читал документы, но мне не очень понятно, будет ли только один Диспетчер, связанный с каждым действующим лицом, или только один.Допустим, у меня есть актер SendSmsActor и актер UpdateSmsActor, будут ли они оба использовать диспетчер по умолчанию?или каждый актер получит свой собственный экземпляр диспетчера по умолчанию?Также мне не очень понятно, если у меня 500 входящих запросов (как часть пакетного процесса), а мой параллелизм-макс установлен на 300, будут ли эти 300 потоков разделены между SendSmsActor и UpdateSmsActor?

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Оба ваших актера будут выполняться в диспетчере по умолчанию, если вы явно не назначите альтернативный диспетчер для экземпляра актера, либо в конфигурационном, либо в программном режиме.потоки.Однако опция throughput будет определять, сколько сообщений для каждого субъекта следует обработать перед переключением на другого субъекта.

В зависимости от вашей рабочей нагрузки, 300 потоков диспетчера могут быть или не быть оптимальными.Если ваши акторы полностью неблокируют, то вы, вероятно, захотите иметь примерно 1 поток на ядро ​​ЦП в качестве отправной точки, а затем провести некоторый тест для точной настройки этого числа.В противном случае вы будете тратить циклы ЦП на ненужное переключение контекста.Если ваши акторы блокируют, то вы, вероятно, захотите предоставить отдельного диспетчера и настроить своих блокирующих акторов для использования этого вместо.См. Блокировка требует тщательного управления .

1 голос
/ 13 июня 2019

По умолчанию Akka использует диспетчер по умолчанию для выполнения акторов над потоками.dispatcher является общим для всех действующих лиц в Actor System.Акка также предоставляет возможность написать пользовательский диспетчер.Вы можете указать тип исполнителя в диспетчере.

Потоки не будут разделены между актерами.Любая свободная нить, доступная в диспетчере, будет использоваться для выполнения актеру

Конфигурация диспетчера по умолчанию:

default-dispatcher {
type = "Dispatcher"
executor = "fork-join-executor"

fork-join-executor {
    parallelism-min = 8
    parallelism-factor = 3.0
    parallelism-max = 64
}

thread-pool-executor {
    keep-alive-time = 60s
    core-pool-size-min = 8
    core-pool-size-factor = 3.0
    core-pool-size-max = 64
    max-pool-size-min = 8
    max-pool-size-factor  = 3.0
    max-pool-size-max = 64
    task-queue-size = -1
    task-queue-type = "linked"

    allow-core-timeout = on
}

}

Ссылка: Чтозначения конфигурации диспетчера Akka по умолчанию?

...