Page History
...
Code Block | ||||
---|---|---|---|---|
| ||||
class PrintMyActorRefActor extends Actor { override def receive: Receive = { case "printit" => val secondRef = context.actorOf(Props.empty, "second-actor") //자식의 생성에 대한 책임은 부모가 가진다. ( 생성하고 자식노드로 런타임 이동하는 형태의 방법 제한) println(s"Second: $secondRef") } } val firstRef = system.actorOf(Props[PrintMyActorRefActor], "first-actor") // actorOf 는 Actor생성시 사용됩니다. println(s"First : $firstRef") firstRef ! "printit" // !는 스칼라에서 Input을 위한 키워드이며, c++의 cout >> 과 유사한 키워드 , //C#또는 JAVA에서는 명시적으로 firstRef.Tell("printit") 이렇게 사용하면 됩니다. //액터 생성 순서 first-actor <= second-actor 가 parent <= child 관계가 된다. First : Actor[akka://testSystem/user/first-actor#1053618476] Second: Actor[akka://testSystem/user/first-actor/second-actor#-1544706041] |
아래와같이, rest의 endpoint 와 유사하게 접근이 가능합니다접근법이 유사합니다.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
var parentActor= system.ActorSelection("akka://testSystem/user/first-actor"); var childActor= system.ActorSelection("akka://testSystem/user/first-actor/second-actor"); |
RestAPI에서는 호출을 한번하면 내부적으로 ( 접속-요청-응답-접속해제) 의 과정을 거치지만
원격 Actor의 경우 이미 연결된 객체(TCP피어투피어) 를 사용하며 ,새로운 연결에대한 오버헤드가 없기때문에
대량의 호출시 CPU/메모리/네트워크자원 을 훨씬 작게 사용합니다. ( 성능적으로 약 100배 이상 차이 )
사용자에게 제공하는 ResAPI를 대체하는 의미는 아니며, 미들웨어간 정보를 주고받을때 RestAPI를 사용하고 있다면 고성능 정보교환 문제를 해결할수 있습니다.
액터의 소멸
이런 구조적인 설계로, 부모의 액터를 정지시키면 자식의 액터를 모두 종류후 마지막에 부모 액터가 종료가됩니다.
...