Акка диспетчер и роутер - PullRequest
0 голосов
/ 25 октября 2018

После прочтения документации Akka, а также некоторых публикаций в Интернете у меня все еще нет четкого понимания взаимосвязи между маршрутизатором и диспетчером.

1) Всегда ли маршрутизатор использует диспетчер для отправкик маршрутам?Может ли маршрутизатор выполнять свою работу без использования диспетчера?

2) Если в конфигурации не определены дополнительные диспетчеры, я понимаю, что будет использоваться диспетчер по умолчанию.В моей системе акторов у меня есть кластер с двумя субъектами-производителями, которые используют субъект-маршрутизатор, и тремя субъектами-потребителями.Производители и потребители работают в разных JVM - что значит для системы акторов иметь одного диспетчера по умолчанию?

Насколько я понимаю, диспетчер подобен исполнителю пула потоков.В этом случае в разных JVM не будет ли у каждой JVM свой экземпляр диспетчера и собственный исполнитель пула потоков?

3) Относительно вышеуказанного вопроса (https://doc.akka.io/docs/akka/current/dispatchers.html#problem-blocking-on-default-dispatcher):

Использование context.dispatcher в качестве диспетчера, для которого выполняется блокирующее Future, может быть проблемой, поскольку этот диспетчер по умолчанию используется для всей другой обработки субъекта, если вы не настроили отдельный диспетчер для субъекта.

Если актеры участвуют в разных JVM, применимо ли вышеизложенное? Если да, что это значит?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Некоторые небольшие исправления к Джеффрису, в противном случае отличный ответ: можно запустить маршрутизатор, который направляет сообщения в вызывающий поток (см. Первый пример в документации ), и этот поток потенциально может быть произвольнымнеактерский поток, так что сам по себе не требует диспетчера.

Актер, к которому маршрутизирует маршрутизатор, однако, как и любой другой актер, всегда будет работать на диспетчере.

Также довольно часто запускать маршрутизатор как отдельный субъект, и в этом случае он будет работать на диспетчере (описано во втором разделе документации по маршрутизатору ).

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

Если одному из этих субъектов требуется «несколько минут» для выполнения, это может привести к голоду - то, что ни один другой актер не может выполнить, включая актеров, которые имеют дело с кластерным состоянием и внутренностями Akka, поэтому важно изолировать их от их собственного диспетчера.См. Раздел , требующий тщательного рассмотрения в документации .

.
0 голосов
/ 25 октября 2018

(1a) Всегда ли маршрутизатор использует диспетчер для отправки сообщения маршрутизатору?

Да.

(1b) Может ли маршрутизатор выполнитьработа без использования диспетчера?

Нет.Все актеры, независимо от того, являются ли они маршрутизаторами, работают в диспетчере.

(2) ... в разных JVM, не будет ли у каждой JVM свой экземпляр диспетчера и егоСобственный исполнитель пула потоков?

Да, по сути.Если ваша система состоит из нескольких JVM, то у каждой JVM будет свой собственный ActorSystem (например, с использованием кластера Akka).Каждый ActorSystem настраивает свой собственный диспетчер (-ы) независимо от других ActorSystem. 1 Если вы не добавите диспетчер, будет использован диспетчер по умолчанию.

(3) «Использование context.dispatcher в качестве диспетчера, для которого выполняется блокирующее Future, может быть проблемой, поскольку этот диспетчер по умолчанию используется для всей другой обработки субъекта, если вы не настроили отдельный диспетчер для субъекта.»

Если актеры участвуют в разных JVM, применимо ли все вышеизложенное?Если это так, что это значит?

Да, рекомендации по работе с блокирующими операциями будут применимы, если у вас есть действующие лица, работающие на нескольких JVM.Каждая JVM будет иметь свой собственный ActorSystem, и каждому ActorSystem потребуется настроить выделенного диспетчера для обработки операций блокировки, как рекомендует цитированная вами документация .


1 На самом деле, вы можете иметь более одного ActorSystem на JVM.Из документации :

Несколько актерных систем с различными конфигурациями могут сосуществовать в одной JVM без проблем, в самой Akka нет глобального общего состояния.

...