programing tip

Scala의 다중 액터 구현은 어떻게 다릅니 까?

itbloger 2020. 10. 17. 10:02
반응형

Scala의 다중 액터 구현은 어떻게 다릅니 까?


Scala 2.9.0의 출시와 함께, Scala 언어와 Akka 프레임 워크를 결합한 Typesafe Stack도 발표되었습니다. 이제 Scala는 표준 라이브러리에 액터가 있지만 Akka는 자체 구현을 사용합니다. 그리고 다른 구현을 찾으면 Lift와 Scalaz에도 구현이 있음을 알 수 있습니다!

그렇다면 이러한 구현의 차이점은 무엇입니까?


이 대답은 제 것이 아닙니다. 그것은 생산 된 데이비드 폴락 (리프트 명예의), (Scalaz 명성의) 제이슨 Zaugg, 필립 할러 (스칼라 배우 명예의)의 도움으로 빅토르 클랑 (Akka의 명성)에 의해.

여기서 내가하는 일은 서식을 지정하는 것뿐입니다 (Stack Overflow가 테이블을 지원하는 경우 더 쉬울 것입니다).

나중에 시간이 더있을 때 채울 곳이 몇 군데 있습니다.

디자인 철학

  • Scalaz 액터

    최소한의 복잡성. 최대한의 일반성, 모듈성 및 확장 성.

  • 액터 리프트

    최소한의 복잡성, 명시적인 수명주기, 다른 Scala 및 Java 프로그램과 일치하는 오류 처리 동작, 경량 / 작은 메모리 풋 프린트, 메일 박스, Scala 액터 및 Erlang 액터와 정적으로 유사한 고성능, JVM에 의한 가비지 콜렉션.

  • 스칼라 액터

    Scala에서 전체 Erlang 액터 모델, 경량 / 작은 메모리 공간을 제공합니다.

  • Akka 배우

    간단하고 투명하게 배포 할 수 있으며 고성능, 가볍고 적응력이 뛰어납니다.

버전 관리

                    Scalaz 액터 리프트 액터 스칼라 액터 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 액터 리프트 액터 스칼라 액터 Akka 액터
새 액터 생성 예 예 예 예
배우 내부
예 예 예 예에 메시지 보내기
알려진 배우 
행동 변경 액터는 예 예 : 중첩 예 :
다음 메시지 불변의 반응 / 수신이되고 / 불가
감독 제공되지 않음 아니요 배우 : 예, 예
(link / trapExit) 반응기 : 아니오

상태 격리 수준

사용자가 액터에 퍼블릭 메소드를 정의하면 외부에서 호출 할 수 있습니까?

  • Scalaz 액터 : n / a. 배우는 봉인 된 특성입니다.
  • 리프트 액터 : 예
  • 스칼라 액터 : 예
  • Akka 액터 : 아니요, 액터 인스턴스는 ActorRef 뒤에 보호됩니다.

배우 유형

  • Scalaz 액터 : Actor[A] extends A => ()
  • 리프트 액터 : LiftActor,SpecializeLiftActor[T]
  • 스칼라 액터 : Reactor[T],Actor extends Reactor[Any]
  • Akka 배우 : Actor[Any]

배우 라이프 사이클 관리

                    Scalaz 액터 리프트 액터 스칼라 액터 Akka 액터
수동 시작 아니오 아니오 예 예
수동 정지 아니오 아니오 아니오 예
실패시 다시 시작 해당 없음 예 예 액터 인스턴스별로 구성 가능
의미 체계 다시 시작 해당 사항 없음 액터 다시 실행 액터를 다시 할당하여 액터를 안정된 상태로 복원하고
                                                    행동은 이전 인스턴스를 버리고
구성 다시 시작 n / an / a X 회, Y 시간 내에 X 회
수명주기 후크 제공됨 수명주기는 preStart, postStop, preRestart, postRestart를 작동하지 않습니다.

메시지 전송 모드

                    Scalaz 액터 리프트 액터 스칼라 액터 Akka 액터
Fire-forget a! 메시지 배우! msg actor! msg actorRef! 메시지
                    메세지)
보내기-받기-응답 (1 참조) actor!? msg actor!? msg actorRef !! 메시지
                                    배우 !! 메시지
송수신 미래 (2 참조) 배우 !! msg actorRef !!! 메시지
약속의 결과 (메시지) 보내기. future.onComplete (f => ~! f.result)
미래에 (배우)
배우 코마로 배우 작곡 f 아니오 아니오 아니오
기능 (3 참조)

(1) 함수 f는 다음과 같은 행위자가됩니다.

val a: Msg => Promise[Rep] = f.promise
val reply: Rep = a(msg).get

(2) Any function f becomes such an actor:

val a = f.promise
val replyFuture = a(message)

(3) Contravariant functor: actor comap f. Also Kleisli composition in Promise.

Message reply modes

TBD

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
reply-to-sender-in-message
reply-to-message

Message processing

Supports nested receives?

  • Scalaz Actors: --
  • Lift Actors: Yes (with a little hand coding).
  • Scala Actors: Yes, both thread-based receive and event-based react.
  • Akka Actors: No, nesting receives can lead to memory leaks and degraded performance over time.

Message Execution Mechanism

TBD

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Name for Execution Mechanism
Execution Mechanism is
configurable
Execution Mechanism can be
specified on a per-actor basis
Lifecycle of Execution Mechanism
must be explicitly managed
Thread-per-actor execution
mechanism
Event-driven execution mechanism
Mailbox type
Supports transient mailboxes
Supports persistent mailboxes

Distribution/Remote Actors

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Transparent remote  n/a             No              Yes             Yes
actors
Transport protocol  n/a             n/a             Java            Akka Remote Protocol
                                                    serialization   (Protobuf on top of TCP)
                                                    on top of TCP
Dynamic clustering  n/a             n/a             n/a             In commercial offering

Howtos

TBD

                    Scalaz Actors   Lift Actors     Scala Actors    Akka Actors
Define an actor
Create an actor instance
Start an actor instance
Stop an actor instance

  • scala.actors was the first serious attempt to implement Erlang-style concurrency in Scala that has inspired other library designers for making a better (in some cases) and more performant implementations. The biggest problem (at least for me), is that unlike Erlang processes, complemented with OTP (that allows for building fault-tolerant systems), scala.actors only offer a good foundation, a set of stable primitives that must be used for building a more high-level frameworks - at the end of the day, you’ll have to write your own supervisors, catalogs of actors, finite state machines, etc. on top of actors.

  • And here Akka comes to the rescue, offering a full-featured stack for actor-based development: more idiomatic actors, set of high-level abstractions for coordination (load balancers, actor pools, etc.) and building fault-tolerant systems (supervisors, ported from OTP, etc.), easily configurable schedulers (dispatchers), and so on. Sorry, if I sound rude, but I think, there will be no merge in 2.9.0+ - I’d rather expect Akka actors to gradually replace stdlib implementation.

  • Scalaz. Normally I have this library in the list of dependencies of all my projects, and when, for some reason, I can’t use Akka, non-blocking Scalaz Promises (with all the goodness, like sequence) combined with the standard actors are saving the day. I never used Scalaz actors as a replacement for scala.actors or Akka, however.


Actors: Scala 2.10 vs Akka 2.3 vs Lift 2.6 vs Scalaz 7.1

Test code & results for average latency and throughput on JVM 1.8.0_x.

참고URL : https://stackoverflow.com/questions/5997018/how-are-the-multiple-actors-implementation-in-scala-different

반응형