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


76

З виходом Scala 2.9.0 також було оголошено стек Typesafe, який поєднує мову Scala з фреймворком Akka. Зараз, хоча Scala має акторів у своїй стандартній бібліотеці, Akka використовує власну реалізацію. І якщо ми будемо шукати інші реалізації, ми також виявимо, що Lift і Scalaz також мають реалізації!

Отже, у чому різниця між цими реалізаціями?


8
Не пряма відповідь на запитання, але нещодавно Мартін згадав, що "У наступних версіях ми плануємо поступово об'єднувати Akka із scala.actors": groups.google.com/group/scala-user/browse_frm/thread/…
ebruchez

2
Відповідно, оскільки "Оригінальні актори Scala зараз застаріли". у 2.10 ( scala-lang.org/node/27499 )
MrDrews

Відповіді:


95

Ця відповідь насправді не моя. Його випустив Віктор Кланг (зі слави "Акка") за допомогою Девіда Поллака (зі слави "Ліфт"), Джейсона Заугга (зі слави "Скалаза"), Філіпа Халлера (зі слави "Актори" Скала ").

Все, що я тут роблю, - це форматування (що було б простіше, якщо таблиці підтримували Stack Overflow).

Є кілька місць, які я заповню пізніше, коли у мене буде більше часу.

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

  • Актори Scalaz

    Мінімальна складність. Максимальна загальність, модульність та розширюваність.

  • Підніміть акторів

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

  • Актори Scala

    Надайте повну модель актора Erlang у Scala, легкий / невеликий розмір пам'яті.

  • Акка Актори

    Простий і прозоро розподіляється, високопродуктивний, легкий і дуже пристосований.

Версія

                    Актори Scalaz Актори Ліфт Актори Scala Actors Akka Actors
Поточна стабільна вер. 5 2,1 2,9,0 0,10
Мінімальний Scala ver. 2,8 2,7,7 2,8
Мінімальна версія Java. 1,5 1,5 1,6

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

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

Рівень ізоляції держави

Якщо користувач визначає загальнодоступні методи для своїх Акторів, чи можна їх викликати ззовні?

  • Актори Scalaz: н / д. Актор - це запечатана риса.
  • Підйомники: Так
  • Актори Scala: Так
  • Актори Акки: Ні, екземпляр актора захищений позаду ActorRef.

Тип актора

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

Управління життєвим циклом актора

                    Актори Scalaz Актори Ліфт Актори Scala Actors Akka Actors
Ручний запуск Ні Ні Так Так
Ручна зупинка Ні Ні Ні Так
Перезапуск при відмові н / д Так Так Конфігурується для кожного екземпляра актора
Перезапустити семантику не застосовується Перезапустити актор Відновити актора до стабільного стану, перерозподіливши його та
                                                    поведінки викиньте старий екземпляр
Перезапустіть налаштованість n / an / a X разів, X разів протягом Y часу
Наявні гачки життєвого циклу Жоден цикл дії не діє перед запуском, після зупинки, перед запуском, після перезапуску

Режими надсилання повідомлень

                    Актори Scalaz Актори Ліфт Актори Scala Actors Akka Actors
Вогонь-забудь! повідомлення актор! msg актор! повідомлення msgRef! повідомлення
                    повідомлення)
Надіслати-отримати-відповісти (див. 1) актор!? msg актор!? повідомлення msgRef !! повідомлення
                                    актор !! повідомлення
Надіслати-отримати-отримати (див. 2) актор !! повідомлення msgRef !!! повідомлення
Надіслати результат обіцянки (повідомлення). future.onComplete (f => до! 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 Актори Ліфт Актори Scala Actors Akka Actors
відповідь відправнику в повідомленні
відповідь на повідомлення

Обробка повідомлень

Підтримує вкладені отримує?

  • Актори Scalaz: -
  • Підйомники: Так (з невеликим кодуванням рук).
  • Актори Scala: Так, як реакція на основі прийому, так і подія.
  • Актори Akka: Ні, вкладене отримання може призвести до витоків пам'яті та погіршення продуктивності з часом.

Механізм виконання повідомлень

TBD

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

Розподіл / Віддалені актори

                    Актори Scalaz Актори Ліфт Актори Scala Actors Akka Actors
Прозорий пульт дистанційного керування немає Ні Так Так
актори
Транспортний протокол не застосовується, віддалений протокол Java Akka
                                                    серіалізація (Protobuf поверх TCP)
                                                    поверх TCP
Динамічна кластеризація n / an / an / a У комерційній пропозиції

Howtos

TBD

                    Актори Scalaz Актори Ліфт Актори Scala Actors Akka Actors
Визначте актора
Створіть екземпляр актора
Запустіть екземпляр актора
Зупиніть екземпляр актора

1
відмінне написання спасибі. Хтось вимірював розміри пам'яті та продуктивність?
Йохан Прінслу

Посилання порушено. Будь ласка, відредагуйте поточне? (Я нічого не знаю про Скалу, тому я б погано судив про "поточний".)
yzorg

2
@yzorg На даний момент я просто піду з акторами Акки. Актори Scala припиняють свою діяльність на їх користь, а актори Scalaz / Lift Actors ніколи не користувались популярністю за межами своєї території.
Даніель К. Собрал

23
  • scala.actors була першою серйозною спробою впровадити паралельність у стилі Ерланг у Scala, що надихнуло інших дизайнерів бібліотек на покращення (в деяких випадках) та ефективнішу реалізацію. Найбільша проблема (принаймні для мене) полягає в тому, що на відміну від процесів Erlang, доповнених OTP (що дозволяє створювати системи, що захищають від відмов ), scala.actors пропонують лише хороший фундамент, набір стабільних примітивів, які потрібно використовувати для побудови більш високорівневі рамки - наприкінці дня вам доведеться писати своїх власних керівників, каталоги акторів, кінцеві автомати тощо тощо.

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

  • Scalaz . Зазвичай у мене є ця бібліотека у списку залежностей усіх моїх проектів, і коли з якихось причин я не можу використовувати Akka , неблокуючі Scalaz Promises (з усією добротою, як sequence) у поєднанні зі стандартними акторами зберігають день. Однак я ніколи не використовував акторів Scalaz як заміну акторам Scala.actors або Akka .


2

Актори: Scala 2.10 проти Akka 2.3 проти Lift 2.6 проти Scalaz 7.1

Тестовий код та результати для середньої затримки та пропускної здатності на JVM 1.8.0_x.


Ого, я здивований, коли Scalaz конкурує з Akka з точки зору затримки та пропускної здатності.
Рафаель С. Кальсаверіні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.