web-dev-qa-db-ja.com

Scalaの複数のアクターの実装はどのように異なりますか?

Scala 2.9.0のリリースに伴い、Scala言語とAkkaフレームワークを組み合わせたTypesafeスタックも発表されました。ただし、Scalaの標準ライブラリにはアクターがあり、Akkaは独自の実装を使用しています。また、他の実装を探すと、LiftとScalazにも実装があることがわかります。

では、これらの実装の違いは何ですか?

76

この答えは本当に私のものではありません。 作成されました Viktor Klang(Akkaの名声)、David Pollak(Liftの名声)、Jason Zaugg(Scalazの名声)、Philipp Haller(Scalaの俳優の名声)の助けを借りて。

ここで行っているのはフォーマットすることだけです(Stack Overflowがテーブルをサポートしていると簡単になります)。

後で時間があれば埋める場所がいくつかあります。

デザイン哲学

  • Scalaz俳優

    最小限の複雑さ。最大の一般性、モジュール性、および拡張性。

  • 俳優を持ち上げる

    最小限の複雑さ、明示的なライフサイクルを気にすることなくJVMによるガベージコレクション、他のScalaおよびJavaプログラムと一貫したエラー処理動作、軽量/小さなメモリフットプリント、メールボックス、静的にScalaと同様俳優とErlang俳優、高性能。

  • Scalaアクター

    Scalaで完全なErlangアクターモデル、軽量/小さなメモリフットプリントを提供します。

  • アッカアクター

    シンプルで透過的に配布可能で、高性能で、軽量で、適応性が高い。

バージョニング

 ScalazアクターリフトアクターScalaアクターAkkaアクター
現在の安定版ver。 5 2.1 2.9.0 0.10 
最小Scala ver。 2.8 2.7.7 2.8 
最小Java ver。 1.5 1.5 1.6 

アクターモデルのサポート

 ScalazアクターリフトアクターScalaアクターAkkaアクター
新しいアクターを生成するはいはいはいはい
アクター内
メッセージを送信するはいはいはいはい
既知のアクター
動作の変更アクターははいはい:ネストされたはい:
次のメッセージに対して不変の反応/受信になる/なりません
監視は提供されませんいいえアクター:はい、はい
(link/trapExit)リアクター:いいえ

状態分離のレベル

ユーザーがアクターにパブリックメソッドを定義した場合、それらは外部から呼び出すことができますか?

  • Scalazアクター:該当なし。俳優は封印された特性です。
  • リフトアクター:はい
  • Scalaアクター:はい
  • Akka Actors:いいえ、アクターインスタンスはActorRefの背後でシールドされています。

アクタータイプ

  • Scalazアクター:Actor[A] extends A => ()
  • リフトアクター:LiftActorSpecializeLiftActor[T]
  • Scalaアクター:Reactor[T]Actor extends Reactor[Any]
  • Akkaアクター:Actor[Any]

アクターのライフサイクル管理

 ScalazアクターリフトアクターScalaアクターAkkaアクター
手動開始いいえいいえはいはい
手動停止いいえいいえいいえはい
失敗時の再起動n/aはいはいアクターインスタンスごとに構成可能
セマンティクスを再起動するn/aアクターを再実行するアクターを再割り当てして安定した状態に復元し、
動作によって古いインスタンスが破棄される
構成可能性を再開するn/an/a X回、Y時間内にX回
ライフサイクルフックが提供されないライフサイクル動作preStart、postStop、preRestart、postRestart 

メッセージ送信モード

 ScalazアクターリフトアクターScalaアクターAkkaアクター
ファイア・アンド・フォーゲット!メッセージ俳優! msgアクター! msgactorRef! msg 
 a(message)
 Send-receive-reply(1を参照)アクター!? msgアクター!? msgactorRef !! msg 
俳優!! msg 
 Send-receive-future(2を参照)アクター!! msgactorRef !!! msg 
 Send-result-of-promise(メッセージ)。 future.onComplete(f => to!f.result)
 future to(actor)
アクターコマップを使用してアクターを作成します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のクライスリ構成。

メッセージ返信モード

未定

 ScalazアクターリフトアクターScalaアクターAkkaアクター
 reply-to-sender-in-message 
 reply-to-message 

メッセージ処理

ネストされた受信をサポートしますか?

  • Scalaz俳優:-
  • リフトアクター:はい(少し手作業でコーディングします)。
  • Scalaアクター:はい、スレッドベースの受信とイベントベースの両方の反応です。
  • Akka Actors:いいえ、受信をネストすると、メモリリークが発生し、時間の経過とともにパフォーマンスが低下する可能性があります。

メッセージ実行メカニズム

未定

 ScalazアクターリフトアクターScalaアクターAkkaアクター
実行メカニズムの名前
実行メカニズムは
構成可能
実行メカニズムは[.____。 .____。]アクターごとに指定
実行メカニズムのライフサイクル
明示的に管理する必要があります
アクターごとのスレッドの実行
メカニズム
イベント駆動型実行メカニズム
メールボックスタイプ
一時的なメールボックスをサポート
永続的なメールボックスをサポート

配布/リモートアクター

 ScalazアクターリフトアクターScalaアクターAkkaアクター
透過リモートn/aいいえはいはい
 actors 
トランスポートプロトコルn/an/a Java Akka Remote Protocol 
シリアル化(TCP上でのProtobuf)
 TCP上で
動的クラスタリングn/an/an/a商用サービス

ハウツー

未定

 ScalazアクターリフトアクターScalaアクターAkkaアクター
アクターの定義
アクターインスタンスの作成
アクターインスタンスの開始
停止アクターインスタンス
95
  • scala.actorsは、Erlangスタイルの同時実行性をScalaに実装する最初の真剣な試みであり、他のライブラリ設計者がより優れた(場合によっては)パフォーマンスを向上させるように促しました。実装。最大の問題(少なくとも私にとって)は、Erlangプロセスとは異なり、[〜#〜] otp [〜#〜](フォールトトレラントシステムの構築を可能にする)で補完されることです。 scala.actors優れた基盤、より高レベルのフレームワークを構築するために使用する必要のある安定したプリミティブのセットのみを提供します-結局のところ、独自のスーパーバイザーを作成する必要があります、アクターの上にあるアクター、有限状態マシンなどのカタログ。

  • そしてここでAkkaが助けになり、アクターベースの開発のためのフル機能のスタックを提供します:より慣用的なアクター、調整のための高レベルの抽象化のセット(ロードバランサー、アクタープールなど)およびフォールトトレラントシステム(スーパーバイザー、[〜#〜] otp [〜#〜]などから移植)、簡単に構成可能なスケジューラー(ディスパッチャー)などを構築します。申し訳ありませんが、失礼に聞こえますが、2.9.0 +にマージはありません-私はむしろ期待していますAkka stdlib実装を徐々に置き換えるアクター。

  • Scalaz。通常、私はすべてのプロジェクトの依存関係のリストにこのライブラリを持っていますが、何らかの理由で使用できない場合Akka、ノンブロッキングScalaz Promises(with sequence)のようなすべての長所と、標準のアクターを組み合わせると、その日が節約されます。ただし、scala.actorsまたはAkkaの代わりにScalazアクターを使用したことはありません。

23
Vasil Remeniuk

アクター:Scala 2.10 vs Akka 2.3 vs Lift 2.6 vs Scalaz 7.1

テストコード結果 JVM1.8.0_xの平均レイテンシとスループット。

2