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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

  • Scala Актеры

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

  • Akka Актеры

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

Versioning

                    Scalaz Actors Лифт Актеры Scala Actors Актеры Akka
Текущая стабильная версия 5               2,1             2,9,0           0,10
Минимальная версия Scala 2,8             2,7,7                           2,8
Минимальная версия Java 1,5             1,5             1,6

Поддержка модели актера

                    Scalaz Actors Лифт Актеры Scala Actors Актеры Akka
Появляются новые актеры Да Да Да Да
внутри актера
Отправить сообщения Да Да Да Да
известный актер 
Изменить поведение Актеры Да Да: Вложено Да:
для следующего сообщения неизменный реагировать / получать становится / не получаться
Наблюдение Не предусмотрено Нет Актер: Да, Да
(link/trapExit) Реактор: Нет

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

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

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

Тип актера

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

Актер управления жизненным циклом

                    Scalaz Actors Лифт Актеры Scala Actors Актеры Akka
Ручной запуск Нет Нет Да Да
Ручная остановка Нет Нет Нет Да
Перезапуск при ошибке нет Да Да Настраивается для экземпляра субъекта
Перезапустить семантику не применимо. Перезапустить субъект Восстановить субъект в стабильное состояние, перераспределив его и
                                                    поведение выбросить старый экземпляр
Перезапустите конфигурацию не применимо X раз, X раз за Y
Предоставлены хуки жизненного цикла. Нет действия жизненного цикла preStart, postStop, preRestart, postRestart

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

                    Scalaz Actors Лифт Актеры Scala Actors Актеры Akka
Огонь-забудь! сообщение актера! MSG актер! MSG ActorRef! тзд
                    сообщение)
Отправить-получить-ответить (см. 1) актер!? MSG актер!? MSG ActorRef! тзд
                                    актер!! тзд
Отправить-получить-будущее (см. 2) актер! msg    actorRef!!! тзд
Посыл-результат-обещание (сообщение).                               future.onComplete( f => to! f.result)
будущее (актер)
Составь актера с актером comap f Нет Нет Нет
функция (см. 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 Лифт Актеры Scala Actors Актеры Akka
ответ к отправителю-в-сообщения
ответ к сообщению

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

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

  • Скалаз Актеры: -
  • Лифт Актеров: Да (с небольшим ручным кодированием).
  • Актеры Scala: Да, как на основе потоков, так и на основе событий реагируют.
  • Akka Actors: нет, получение вложений может привести к утечкам памяти и снижению производительности с течением времени.

Механизм выполнения сообщений

TBD

                    Scalaz Actors Лифт Актеры Scala Actors Актеры Akka
Название для Механизма исполнения
Механизм исполнения
конфигурируемый
Механизм исполнения может быть
указано на каждого участника
Жизненный цикл Механизма исполнения
должен быть явно управляемым
Выполнение потока на актера
механизм
Механизм управления событиями
Тип почтового ящика
Поддерживает временные почтовые ящики
Поддерживает постоянные почтовые ящики

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

                    Scalaz Actors Лифт Актеры Scala Actors Актеры Akka
Прозрачный пульт н / д Нет Да Да
актеры
Транспортный протокол не доступно Java            Akka Remote Protocol
                                                    сериализация (Protobuf поверх TCP)
                                                    поверх TCP
Динамическая кластеризация n/a             n/a             n/a В коммерческом предложении

HowTos

TBD

                    Scalaz Actors Лифт Актеры Scala Actors Актеры Akka
Определить актера
Создать экземпляр актера
Запустить экземпляр актера
Остановить экземпляр актера
  • scala.actors был первой серьезной попыткой реализовать параллелизм в стиле Erlang в Scala, который вдохновил других разработчиков библиотек на создание лучших (в некоторых случаях) и более производительных реализаций. Самая большая проблема (по крайней мере для меня) заключается в том, что в отличие от процессов Erlang, дополненных OTP (который позволяет создавать отказоустойчивые системы), scala.actors предлагает только хорошую основу, набор стабильных примитивов, которые должны использоваться для сборки более высокоуровневые фреймворки - в конце дня вам придется писать своих собственных руководителей, каталоги актеров, конечные автоматы и т. д. поверх актеров.

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

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

Актеры: Скала 2.10 против Акки 2.3 против Лифта 2.6 против Скалаза 7.1

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

Другие вопросы по тегам