Akka Version 2.5.12
Part 1: Actor Architecture
Akka를 사용하면 actor system 을 위한 인프라를 만들고 기본 동작을 제어하는 데 필요한 저수준 코드를 작성하지 않아도 된다.
이를 이해하기 위해 코드에서 생성한 actor와 Akka가 생성하고 관리하는 actor 사이의 관계, actor 라이프 사이클 및 오류 처리를 살펴본다.
The Akka actor hierarchy
Akka의 actor는 항상 부모에게 속한다. 일반적으로 context.actorOf ()를 호출하여 actor를 만든다.
"자립형 (freestanding)" actor를 만드는 대신, 새로운 actor를 자식으로 기존의 트리에 삽입한다.
actor를 생성한 actor 는 새로 생성 된 자식 actor의 부모가 된다. 그런 다음 물어볼 수도 있다. 첫 번째 actor의 부모는 누구인지?
아래 그림에서와 같이 모든 actor에는 공통된 부모인 사용자 보호자가 있다. system.actorOf ()를 사용하여이 actor 아래에 새 actor 인스턴스를 만들 수 있다. Quickstart Guide에서 다룬 것처럼 actor 생성은 유효한 URL 인 참조를 반환한다. 따라서 예를 들어 system.actorOf (..., "someActor")라는 someActor라는 액터를 만들면 해당 참조에 /user/someActor 경로가 포함된다.
실제로 코드에서 actor를 만들기 전에 Akka는 이미 시스템에 세 개의 actor를 미리 만들었다.
이러한 내장된 actor의 이름에는 보호자가 포함되어 있다. 이들은 자신의 경로에 있는 모든 child actor를 감독(supervise)하기 때문이다.
guardian actor 는 다음을 포함한다 :
/ : root guardian 시스템에 있는 모든 actor의 부모이며 시스템 자체가 종료 될 때 마지막으로 멈추는 액터
/user : 모든 user 생성 actor의 부모 액터. Akka 라이브러리를 사용하여 생성 한 모든 actor는 앞에 /user 라는 상수 경로를 가진다.
/system : system guardian
actor 계층 구조를 보기 위한 가장 쉬운 방법은 단순히 Actor Ref 인스턴스를 출력하는 것이다.
이 실험에서는 actor를 만들고 참조를 출력하고 이 actor의 자식을 만들고 그 참조를 출력한다.
Hello World 프로젝트로 시작한다. 다운로드하지 않았다면 Lightbend Tech Hub에서 Quickstart 프로젝트를 다운로드하면 된다.
package com.lightbend.akka.sample
import akka.actor.{ Actor, Props, ActorSystem }
import scala.io.StdIn
class PrintMyActorRefActor extends Actor {
override def receive: Receive = {
case "printit" ⇒
val secondRef = context.actorOf(Props.empty, "second-actor")
println(s"Second: $secondRef")
}
}
object ActorHierarchyExperiments extends App {
val system = ActorSystem("testSystem")
val firstRef = system.actorOf(Props[PrintMyActorRefActor], "first-actor")
println(s"First: $firstRef")
firstRef ! "printit"
println(">>> Press ENTER to exit <<<")
try StdIn.readLine()
finally system.terminate()
}
메시지가 첫 번째 actor에게 작업을 요청하는 방법에 대해 보자.
부모의 참조 firstRef를 사용하여 메시지를 보냈다. "firstRef ! "printit" 코드가 실행되면 출력에는 printit 메시지가 왔을때의 PrintMyActorRefActor의 case문이 실행되어 생성 된 첫 번째 actor 및 하위 참조가 포함된 출력 결과를 찍는다. 출력 결과는 다음과 같다.
First: Actor[akka://testSystem/user/first-actor#1053618476]
Second: Actor[akka://testSystem/user/first-actor/second-actor#-1544706041]
'backend > Scala_Play_Akka' 카테고리의 다른 글
[Akka] Akka Document - Actor Architecture (3) - Failure handling (0) | 2018.04.24 |
---|---|
[Akka] Akka Document - Actor Architecture (2) - actor lifecycle (0) | 2018.04.22 |
[Scala] Mac에서 Scala 설치 (0) | 2016.10.22 |
[Play] Play설치(activator) (0) | 2016.03.06 |
Scala로의 산책 (0) | 2015.12.24 |
[Scala] Scala에서의 객체 동등성 (0) | 2015.06.01 |