Чем отличается реализация нескольких актеров в 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.