2015-12-10 3 views
3

Я пытаюсь понять, почему нужно использовать нетипизированных актеров над typed actors. Я прочитал несколько постов на этом, некоторые из них ниже: What is the difference between Typed and UnTyped Actors in Akka? When to use what? http://letitcrash.com/post/19074284309/when-to-use-typedactorsUntyped vs TypedActors - зачем использовать нетипизированные?

Я заинтересован в понимании того, почему нетипизированных актеры лучше в контексте:

  • веб-сервера,
  • Распределенная архитектура
  • Масштабируемость,
  • Взаимодействие с приложениями, написанными в другом программировании
    Языки.

Я знаю, что нетипизированные актеры лучше в контексте FSM из-за функции «стать/не препятствовать».

Я могу видеть возможности нетипизированного в балансировщике нагрузки, поскольку он не должен знать о содержании сообщений, а просто передает их другим актерам. Однако это может быть реализовано и в типедакторе.

Может кто-нибудь придумать несколько вариантов использования в упомянутых выше областях, где нетипизированные актеры «лучше»?

ответ

3

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

trait One { 
    def callOne(arg : String) 
} 
trait Two { 
    def callTwo(arg : Double) 
} 
trait Both extends One with Two 

Both черт поддерживает два вызова в сочетании с двух признаков.

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

trait One { 
    val receiveOne : PartialFunction[String,Unit] = { 
    case msg : String =>() 
    } 
} 
trait Two { 
    val receiveTwo : PartialFunction[Double, Unit] = { 
    case msg : Double =>() 
    } 
} 
trait Both extends One with Two { 
    val receive : PartialFunction[Any, Unit] = receiveOne orElse receiveTwo 
} 

Значение receive в Both признака сочетает в себе две частичные функции. Первый принимает только String s, второй - только Double s. У них есть один общий супертип: Any. Поэтому расширенная версия должна использовать Any в качестве аргумента и становится фактически нетипизированной. Недостаток находится в системе типа scala, которая поддерживает размножение типов с использованием ключевого слова with, но не поддерживает типы объединения. Вы не можете определить Double or String.

Типизированные участники теряют способность к простому расширению. Актеры сдвигают проверки типа на контравариантную позицию, и для ее расширения требуются типы профсоюзов. Вы можете видеть, как они работают в языке программирования ceylon.

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

Ввод текста позволяет избежать ошибок перед тем, как перейти к модульному тестированию. Это будет стоить шаблона для объявлений вспомогательных протоколов.В приведенном выше примере вы должны объявить тип накидного явно:

trait Protocol 
final case class First(message : String) extends Protocol 
final case class Second(message : Double) extends Protocol 

И вы теряете легко сочетание обратного вызова: нет orElse метода для вас. Только рукописным

val receive : PartialFunction[Protocol, Unit] = { 
    case First(msg) => receiveOne(msg) 
    case Second(msg) => receiveTwo(msg) 
} 

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

Akka предлагает некоторые полезные предопределенные усовершенствования для актеров. Они добавляют новую функциональность либо с помощью mixin (например, receive pipeline), либо путем делегирования (например, reliable proxy). Шаблоны прокси используются в приложениях akka в значительной степени, и они изменяют протокол «на лету», добавляя к нему управляющую команду. Это не может быть сделано так легко с типизированными актерами. Поэтому вместо предопределенных утилит вам придется писать собственные реализации. А оставшиеся утилиты не ограничивались бы FSM.

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

+0

Не могли бы вы связать это с контекстами, которые я упомянул? Я могу понять ваши примеры, но я не понимаю, почему это большая проблема. –

+0

@CasperThuleHansen Ваш вопрос слишком широк, и я бы сказал, что этот вопрос обращается к нему разумно. – wheaties

+0

Прошу прощения, но я не согласен. Я ищу несколько вариантов использования, где нетипизированная абстракция лучше, чем напечатанная. FSM один, есть ли еще? –

2

Типизированные актеры - очень новые; they're explicitly marked as experimental and not ready for production use.

Предупреждение

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

(на момент это написано)

+0

Я не имею в виду библиотеку, напечатанную на машинке, я имею в виду типизированных актеров, как указано [здесь] (http://doc.akka.io/docs/akka/snapshot /scala/typed-actors.html). –

0

Я хотел бы отметить путаницу, которая, кажется, всплыли здесь. Каспер, «типизированные актеры», о которых вы говорите, устарели и будут удалены в конечном итоге, я подробно объяснил, почему это так: Akka typed actors in Java. Ссылка, которую вы нашли с ответом Виктора Кланга, говорит об Akka 1.2, которая сейчас «древняя» (когда 2.4 является стабильным выпуском).

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

Я рекомендую вам дать типизированных модули: Akka Streams (последнее дополнение к Акки, которые станут не экспериментальной очень скоро) и Akka Typed, чтобы увидеть, как актеры могут стать набраны в ближайшее время (возможно). Затем, действительно посмотрите еще раз на Actors и посмотрите, какая модель лучше всего подходит для вашего прецедента. Нетипированные актеры имеют преимущество быть истинным и испытанным зрелым модулем/моделью, поэтому вы можете действительно доверять им в этом смысле, если вы хотите больше типов - Akka Streams вы охватывали во многих случаях, но не все, поэтому вы можете рассмотреть экспериментальный модуль (но помните, что мы, скорее всего, изменим Typed API во время его созревания).

+0

Меня очень интересует новая Akka Typed, но, поскольку она экспериментальна, ее еще трудно оправдать. Я имею в виду Акку, набранную актерами. Однако, насколько я могу прочитать, он еще не устарел [пока] (http://doc.akka.io/docs/akka/snapshot/scala/typed-actors.html), но это будет. Ваше сообщение хорошее, и я прочитал оригинальную статью Карла Хьюитта. Однако, похоже, что если я не использую FSM, нет никаких оснований для использования нетипизированных актеров. Я мог бы использовать более «почему» более обобщенным образом. В следующем комментарии –

+0

Я ищу несколько вариантов использования, похожих на ваш последний аргумент. Первый аргумент очень специфичен для реализации, и я уже использую фьючерсы, как упоминалось во втором аргументе. –

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