액터는 어디든 생성할수 있고, 어디에서든지 참조하여 메시지 전송이 가능합니다.

이와 관련한 액터의 특징을 살펴보겠습니다.


actor의 주소는 원격과 로컬로 구분될수 있으며 Rest api의 주소체계와 유사하며

탑다운 방식으로 생성되게됩니다.

RestAPI를 설계할시에도 앞의 네이밍이 큰범주(Parent)를 표현하는것이 일반적입니다.


ActorOf vs ActorSelection

// 'user/myActor' 경로에 사용자가 설계한 MyActor를 생성합니다.  user는 최상위 root입니다.
IActorRef myActor = this.Sys.ActorOf<MyActor>("myActor");


// 이미 생성된 'user/MyActor'를 선택합니다.
ActorSelection myActor2 = this.Sys.ActorSelection("user/myActor");


Absolute vs. Relative Paths

//Local
Context.ActorSelection("../brother").Tell(msg);
Context.ActorSelection("/user/serviceA").Tell(msg);
//Remote
var remoteHello = actorSystem.ActorSelection("akka.tcp://ANODE@127.0.0.1:7000/user/hello");


액터는 상대경로로 접근이 가능하며, 원격일경우 원격주소를 명시하여 원격접근도 가능합니다.


Querying the Logical Actor Hierarchy

Context.ActorSelection("../*").Tell(msg);

특정 트리뎁스의 액터를 모두 선택하여, 동일 메시지를 여러액터에게 보낼수 있습니다.



Reusing Actor Paths


//동일한 주소의 액터를 생성하고 ,삭제하고 다시 생성한다.
IActorRef myActor = this.Sys.ActorOf<MyActor>("myActor");
ActorSelection myActor3 = this.Sys.ActorSelection("user/myActor");
myActor.GracefulStop(TimeSpan.FromSeconds(1)).Wait();
IActorRef myActor2 = this.Sys.ActorOf<MyActor>("myActor");

//주소 참조는, 동일한 주소에 액터가 있으면 참조가능하다.
myActor3.Tell("Hello", this.TestActor);
ExpectMsg("RE:Hello", TimeSpan.FromSeconds(0.2));

//액터 참조의경우 액터가 삭제되면 참조를 잃는다.
myActor.Tell("Hello", this.TestActor);
ExpectMsg("RE:Hello", TimeSpan.FromSeconds(0.2));

액터는 삭제가능하며, 삭제된 액터의 주소는 재사용해서 다시 액터할당이 가능합니다.

ActorRef와 ActorSelection은 다음과 같은 차이점이 있습니다.


Top-Level Scopes for Actor Paths