Как отличается реализация нескольких акторов в 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 Актеры
минимальную сложность. Максимальная общность, модульность и расширяемость.
Лифт Актеров
минимальная сложность, сбор мусора JVM, а не беспокоиться о явном жизненном цикле, поведение обработки ошибок, совместимое с другими программами Scala и Java, легкий / небольшой объем памяти, почтовый ящик, статически похожий на актеров Scala и актеров Erlang, высокий спектакль.
Актеры Scala
обеспечьте полную модель актера Erlang в Scala, облегченном/малом следе ноги памяти.
Актеры Акка
просто и прозрачно distributable, высокая эффективность, легковес и высоки способный к адаптации.
если пользователь определяет общедоступные методы их актеры, они вызываемы из снаружи?
- 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.