1. ホーム
  2. scala

Scalaの複数Actorの実装はどう違うのか?

2023-08-23 20:07:35

質問

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

では、これらの実装の違いは何なのでしょうか?

どのように解決するのか?

この回答は私のものではありません。 制作したものです。 Viktor Klang (Akka で有名) が、David Pollak (Lift で有名), Jason Zaugg (Scalaz で有名), Philipp Haller (Scala Actors で有名) の助けを借りて制作したものです。

私がここでやっているのは、書式を整えることだけです(Stack Overflow がテーブルをサポートしていれば、もっと簡単なのですが)。

後で時間があるときに埋めようと思うところがいくつかあります。

デザイン哲学

  • スカラ座の役者たち

    最小の複雑さ。最大限の汎用性、モジュール性、拡張性。

  • リフト・アクター

    最小限の複雑さ、明示的なライフサイクルを気にするよりもJVMによるガベージコレクション、他のScala & Javaプログラムと一貫したエラー処理動作、軽量/小さなメモリフットプリント、メールボックス、ScalaアクターやErlangアクターに静的類似、高いパフォーマンス。

  • Scalaアクター

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

  • Akkaアクター

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

バージョン管理

                    Scalazアクター Liftアクター Scalaアクター Akkaアクター
現在の安定版 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アクター Liftアクター Scalaアクター Akkaアクター
新しいアクタを生成する Yes Yes Yes
アクター内部
メッセージの送信先 はい はい はい
既知のアクター 
動作の変更 アクターは はい はい:ネストされた はい。
次のメッセージのために 反応/受信が不変に なる/ならない
監督 提供されない アクター はい はい
(link/trapExit) Reactor: No

状態の分離のレベル

ユーザーがパブリックメソッドを定義した場合 を定義した場合、外部から呼び出せるか? 呼び出せるか?

  • Scalazのアクター: n/a. アクターは封印された特質です。
  • リフトアクタ。あり
  • Scala のアクター。あり
  • Akka のアクター。いいえ、アクターインスタンスはActorRefの後ろに遮蔽されています。

アクタータイプ

  • スカラ座のアクター Actor[A] extends A => ()
  • リフトアクターズ LiftActor , SpecializeLiftActor[T]
  • Scalaのアクターです。 Reactor[T] , Actor extends Reactor[Any]
  • アッカのアクターです。 Actor[Any]

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

                    Scalazアクター Liftアクター Scalaアクター Akkaアクター
手動開始 いいえ いいえ はい はい
手動停止 No No Yes
失敗時の再起動 n/a はい はい アクターインスタンスごとに設定可能
Restart semantics n/a Rerun actor アクタを再割り当てして安定した状態に戻し、古いインスタンスを捨てる。
                                                    動作は古いインスタンスを捨てる
リスタート設定可能回数 n/a n/a X 回、Y 時間以内に X 回
ライフサイクルフック提供 ライフサイクルアクションなし preStart, postStop, preRestart, postRestart

メッセージ送信モード

                    Scalazアクター Liftアクター Scalaアクター Akkaアクター
Fire-forget a ! message actor ! msg actor ! msg actorRef !
                    a(メッセージ)
Send-receive-reply (see 1) actor !!! msg actor !!! msg actorRef !!! msg
                                    actor !
Send-receive-future (see 2) actor !!! msg actorRef !!! msg
送信-結果-オブ-プロミス(メッセージ) future.onComplete( f => to ! f.result )
未来へ(actor)
アクターをアクターコンプリートで構成する f No No No
関数 (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アクター Liftアクター Scalaアクター Akkaアクター
返信先メッセージ
返信先メッセージ

メッセージの処理

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

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

メッセージ実行の仕組み

未定

                    Scalazアクター Liftアクター Scalaアクター Akkaアクター
実行機構の名称
実行機構は
設定可能
実行メカニズムが設定可能
アクター単位で指定可能
実行機構のライフサイクル
明示的に管理する必要がある
スレッド単位での実行
メカニズム
イベントドリブン型実行機構
メールボックス型
一時的なメールボックスをサポート
永続的なメールボックスをサポート

配信/リモートアクター

                    Scalazアクター Liftアクター Scalaアクター Akkaアクター
トランスペアレントリモート n/a No Yes Yes
アクター
トランスポートプロトコル n/a n/a Java Akka リモートプロトコル
                                                    シリアライズ (Protobuf on top of TCP)
                                                    オン・トップ・オブ・TCP
動的クラスタリング n/a n/a n/a 商用提供中

ハウツー

未定

                    Scalazアクター Liftアクター Scalaアクター Akkaアクター
アクターの定義
アクターインスタンスの作成
アクターインスタンスの起動
アクターインスタンスの停止