Чем отличается реализация нескольких актеров в Scala? - PullRequest
76 голосов
/ 13 мая 2011

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

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

Ответы [ 3 ]

95 голосов
/ 14 мая 2011

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

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

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

Философия дизайна

  • Актеры Скалаза

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

  • Лифт Актер

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

  • Актеры Scala

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

  • Akka Actors

    Простой и прозрачно распространяемый, высокопроизводительный, легкий и легко адаптируемый.

Versioning

                    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

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

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

  • Скалаз Актеры: н / д. Актер - запечатанная черта.
  • Лифт Актеры: Да
  • Scala Актеры: Да
  • Akka Actors: Нет, экземпляр ActorRef защищен. ActorRef.

Тип актера

  • Скалаз Актеры: Actor[A] extends A => ()
  • Лифт Актеры: LiftActor, SpecializeLiftActor[T]
  • Scala Актеры: Reactor[T], Actor extends Reactor[Any]
  • Akka Актеры: 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

Обработка сообщений

Поддерживает ли вложенный прием?

  • Скалаз Актеры: -
  • Лифт Актеры: Да (с небольшим ручным кодированием).
  • Актеры Scala: Да, как на основе потоков, так и на основе событий реагируют.
  • Akka 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
23 голосов
/ 14 мая 2011
  • scala.actors была первой серьезной попыткой реализовать параллелизм в стиле Erlang в Scala, которая вдохновила других разработчиков библиотек на создание лучших (в некоторых случаях) и более производительных реализаций,Самая большая проблема (по крайней мере для меня) заключается в том, что в отличие от процессов Эрланга, дополненных OTP (что позволяет создавать отказоустойчивые системы), scala.actors обеспечивают только хорошую основунабор стабильных примитивов, которые должны использоваться для построения более высокоуровневых фреймворков - в конце дня вам придется писать своих собственных супервизоров, каталоги актеров, конечные автоматы и т. д. поверх актеров,

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

  • Скалаз .Обычно у меня есть эта библиотека в списке зависимостей всех моих проектов, и когда по какой-то причине я не могу использовать Akka , неблокирующее Scalaz Promises (со всемиБоже мой, как sequence) в сочетании со стандартными актерами спасают день.Я никогда не использовал Scalaz актеров в качестве замены scala.actors или Akka , однако.

2 голосов
/ 02 апреля 2012

Участники: Scala 2,10 против Akka 2,3 против Lift 2,6 против Scalaz 7,1

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

...