Как отличается реализация нескольких акторов в Scala?

с выпуском Scala 2.9.0 также был анонсирован стек Typesafe, который объединяет язык Scala с платформой Akka. Теперь, хотя Scala имеет актеров в своей стандартной библиотеке, Akka использует свою собственную реализацию. И, если мы ищем другие реализации, мы также найдем, что у Lift и Scalaz тоже есть реализации!

Итак, в чем разница между этими реализациями?

3 ответов


этот ответ на самом деле не мой. было произведено Виктора Кланга (славы Акка) с помощью Дэвида Поллака (славы лифта), Джейсона Заугга (славы Скалаза), Филиппа Халлера (славы актеров Scala).

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

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

дизайн Философия!--27-->
  • Scalaz Актеры

    минимальную сложность. Максимальная общность, модульность и расширяемость.

  • Лифт Актеров

    минимальная сложность, сбор мусора JVM, а не беспокоиться о явном жизненном цикле, поведение обработки ошибок, совместимое с другими программами Scala и Java, легкий / небольшой объем памяти, почтовый ящик, статически похожий на актеров Scala и актеров Erlang, высокий спектакль.

  • Актеры Scala

    обеспечьте полную модель актера Erlang в Scala, облегченном/малом следе ноги памяти.

  • Актеры Акка

    просто и прозрачно distributable, высокая эффективность, легковес и высоки способный к адаптации.

версионность

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Current stable ver. 5               2.1             2.9.0           0.10
Minimum Scala ver.  2.8             2.7.7                           2.8
Minimum Java ver.                   1.5             1.5             1.6

Поддержка Модели Актера

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Spawn new actors    Yes             Yes             Yes             Yes
inside of actor
Send messages to    Yes             Yes             Yes             Yes
known actor 
Change behavior     Actors are      Yes             Yes: nested     Yes:
for next message    immutable                       react/receive   become/unbecome
Supervision         Not provided    No              Actor: Yes,     Yes
(link/trapExit)                                     Reactor: No

уровень государства изоляция

если пользователь определяет общедоступные методы их актеры, они вызываемы из снаружи?

  • Scalaz актеры: n / a. Актер-это закрытая черта.
  • Поднимите Актеров: Да
  • Scala Актеры: Да
  • актеры Акка:нет, экземпляр актера экранирован за актером.

актер типа

  • Scalaz Актеры: Actor[A] extends A => ()
  • Лифт Актеры: LiftActor, SpecializeLiftActor[T]
  • Scala Актеры:Reactor[T], Actor extends Reactor[Any]
  • Акка Актеры: Actor[Any]

актер жизненного цикла

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Manual start        No              No              Yes             Yes
Manual stop         No              No              No              Yes
Restart-on-failure  n/a             Yes             Yes             Configurable per actor instance
Restart semantics                   n/a             Rerun actor     Restore actor to stable state by re-allocating it and
                                                    behavior        throw away the old instance
Restart configurability             n/a             n/a             X times, X times within Y time
Lifecycle hooks provided            No lifecycle    act             preStart, postStop, preRestart, postRestart

режимы отправки сообщений

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Fire-forget         a ! message     actor ! msg     actor ! msg     actorRef ! msg
                    a(message)
Send-receive-reply  (see 1)         actor !? msg    actor !? msg    actorRef !! msg
                                    actor !! msg
Send-receive-future (see 2)                         actor !! msg    actorRef !!! msg
Send-result-of-     promise(message).                               future.onComplete( f => to ! f.result )
future              to(actor)
Compose actor with  actor comap f   No              No              No
function            (see 3)

(1) любая функция f становится таким актером:

val a: Msg => Promise[Rep] = f.promise
val reply: Rep = a(msg).get

(2) любая функция f становится таким актором:

val a = f.promise
val replyFuture = a(message)

(3) Контравариантный функтор: actor comap f. Также Клейсли состав в Promise.

ответ режимы

TBD

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
reply-to-sender-in-message
reply-to-message

обработки сообщения

поддерживает вложенные получает?

  • Scalaz Актеры: --
  • поднимите актеров: да (с небольшим ручным кодированием).
  • Scala Actors: да, как потоковое получение, так и реакция на основе событий.
  • актеры Акка: нет, вложенность получает может привести к утечкам памяти и ухудшению производительности с течением времени.

Исполнение Сообщение Механизм

TBD

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Name for Execution Mechanism
Execution Mechanism is
configurable
Execution Mechanism can be
specified on a per-actor basis
Lifecycle of Execution Mechanism
must be explicitly managed
Thread-per-actor execution
mechanism
Event-driven execution mechanism
Mailbox type
Supports transient mailboxes
Supports persistent mailboxes

Распределение / Удаленные Актеры

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Transparent remote  n/a             No              Yes             Yes
actors
Transport protocol  n/a             n/a             Java            Akka Remote Protocol
                                                    serialization   (Protobuf on top of TCP)
                                                    on top of TCP
Dynamic clustering  n/a             n/a             n/a             In commercial offering

Howtos

TBD

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Define an actor
Create an actor instance
Start an actor instance
Stop an actor instance

  • scala.актеры!--5--> была первой серьезной попыткой реализовать параллелизм в стиле Erlang в Scala, который вдохновил других дизайнеров библиотек на создание лучших (в некоторых случаях) и более эффективных реализаций. Самая большая проблема (по крайней мере, для меня) заключается в том, что в отличие от процессов Erlang, дополненных OTP (что позволяет создавать отказоустойчивые системы), scala.актеры!--5-- > только предложение хорошая основа, набор стабильных примитивов это должно быть использовано для построения более высокоуровневых фреймворков-в конце дня вам придется писать своих собственных супервайзеров, каталоги актеров, конечные государственные машины и т. д. поверх актеров.

  • и здесь Акка приходит на помощь, предлагая полнофункциональный стек для актерской разработки: больше идиоматических актеров, набор абстракций высокого уровня для координации (балансировщики нагрузки, пулы актеров и т. д.) и создание отказоустойчивых систем (супервизоров, портировано из OTP, etc.), легко конфигурируемые планировщики (диспетчеры) и так далее. Извините, если я звучу грубо, но я думаю, что не будет слияния в 2.9.0+ - Я бы предпочел ожидать Акка актеры, чтобы постепенно заменить реализацию stdlib.

  • Scalaz. Обычно у меня есть эта библиотека в списке зависимостей всех моих проектов, и когда по какой-то причине я не могу использовать Акка неблокирующий Scalaz Обещания (со всей добротой, как sequence) в сочетании со стандартными актерами спасают день. Я никогда не использовал Scalaz актеры в качестве замены scala.актеры!--5--> или Акка


актеры: Scala 2.10 vs Akka 2.3 vs Lift 2.6 vs Scalaz 7.1

тестовый код & результаты для средней задержки и пропускной способности на JVM 1.8.0_x.