2015-06-04 2 views
7

У меня есть достаточное количество Apache Camel (маршрутизации/посредничества/orchestation двигателя; легкий ESB) опыт, и я ломал мой мозг, пытаясь понять разницу между Акку:механизмы Akka сообщений на примере

  • диспетчеры (Dispatcher , PinnedDispatcher, CallingThreadDispatcher)
  • Маршрутизаторы
  • бассейны
  • Группы
  • событий Автобусы

Согласно документации:

диспетчеры являются:

... это то, что делает Akka Актёры «тик», это двигатель машины, так сказать.

Но это на самом деле не объясняет, что такое диспетчер или что такое его отношение к актеру.

Маршрутизаторы являются:

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

Бассейны являются:

[Тип] маршрутизатор [что] создает routees в качестве дочерних актеров и удаляет их из маршрутизатора, если они завершаются.

Группы являются:

[Тип] актер [где routees] создается извне к маршрутизатору и маршрутизатор отправляет сообщения на указанный путь, используя выбор актера, не наблюдая за прекращением ,

события Автобусов являются:

... способ отправки сообщений групп актеров

Это звучит так же, как диспетчеры и маршрутизаторы.

Так что мои главные задачи:

  • В чем разница между диспетчерами, маршрутизаторами и автобусов событий, и когда использовать каждый?
  • Когда использовать пул против группы?

ответ

15

A диспетчер в основном пул потоков. Akka использует диспетчер для нескольких вещей (например, в очереди сообщений в правом почтовом ящике или забрать сообщение из почтового ящика актера и обработать его). Каждый раз, когда одно из этих действий должно выполняться, поток из пула потоков выбирается и используется для него. Akka поставляется по умолчанию с default-dispatcher с конфигурацией, которую вы можете найти здесь, в reference.conf, ища default-dispatcher. Вы уже используете default-dispatcher, но вы можете определить другого диспетчера, чтобы обеспечить наличие зарезервированного пула потоков для других целей (например, для сетевых потоков при использовании akka-remote или akka-cluster).

A router в Akka - это актер, который использует логику маршрутизации для маршрутизации сообщений в список маршрутов. В зависимости от логики существует множество типов маршрутизаторов: Broadcast, Balancing, RoundRobin ... вы можете найти их все в документах akka. Маршруты маршрутизатора могут быть пулом или группой. Одним из наиболее популярных вариантов использования маршрутизаторов является вертикальное масштабирование вашего приложения, что означает максимальное использование всего процессора, доступного в вашей системе (одновременно использование нескольких потоков).

A пул означает, что маршруты создаются по запросу для данного типа. Например, вам может понадобиться RandomPool из MyFancyActor с тремя экземплярами. Акка создаст трех актеров MyFancyActor и четвертого, который будет настоящим маршрутизатором. Каждый раз, когда актер маршрутизатора получает сообщение, он будет пересылать сообщение одному из участников 3 MyFancyActor. Пул берет на себя перезапуск участников и наблюдает за их жизненным циклом, чтобы убедиться, что у вас запущено несколько экземпляров.

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

Event buses - это каналы, в которых вы можете подписаться на определенный тип сообщения с актером. Если есть сообщение этого конкретного типа, вы, актер, получите его. Это используется для некоторых внутренних элементов Akka, таких как подписка на DeadLetter с, когда сообщение не может достичь своего адресата или событий, связанных с формированием кластера (в akka-кластере). Вы будете использовать это, чтобы быть в курсе событий, происходящих в вашем ActorSystem.

+0

Удивительный ответ, спасибо @hveiga (+1) - несколько быстрых наблюдений: (1), поэтому это звучит так, как 'Dispatcher' * * как * маршрутизатор, но используется внутри для обмена сообщениями и других низкоуровневых потоков в Акке, и поэтому я никогда бы не отправил сообщение непосредственно Диспетчеру **, да **? (2) Похоже, что автобус событий действительно похож на общесистемный почтовый ящик. Но если я подписались на получение сообщения с партикулярным типом сообщения с шины, будет ли это блокировать другие типы участников, также получая одно и то же сообщение? Еще раз спасибо! – smeeb

+0

'Диспетчер' ы прозрачны для вас. Они __dispatch__ нити для выполнения действий. Вы не можете отправлять сообщения диспетчеру. Приятно отметить, что «диспетчер» ** не является актером, а «маршрутизатор». Что касается шины событий, то определение типа kinda как общесистемного почтового ящика может быть правильным. Тем не менее, я не знаю внутренних дел, но я действительно сомневаюсь, что ребята из Akka сделают что-то блокирующее. Я бы предположил, что он не блокируется. Вероятно, он реализован как «Маршрутизатор», где список маршрутов (подписчиков) для каждого типа сообщений изменяется со временем. – hveiga

 Смежные вопросы

  • Нет связанных вопросов^_^