Remote 는, 기존 작성했던 로컬에서 작동했던 액터를 그대로 재활용하여 , 액터설계의 코드변경없이
원격지에서 사용이 가능합니다. 어떻게 이게 가능한지 실습을 해보겠습니다.
akka {
actor {
provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
}
remote {
helios.tcp {
port = 8001 #bound to a specific port
hostname = 127.0.0.1
}
}
}
App.config 에 앞 섹션에서 이미 설정했듯이, 위 설정을 통해 이미 원격사용하기 위한 환경설정이 끝났습니다.
- provider : 원격 객체처리를 위한 원격처리 모듈을 어떤걸로 쓸것인가 지정 가능합니다. ( 현재 기준 기본값 사용)
- helios.tcp : provider중에 제공하는것중에 실제로 , transports에 해당하는 옵션으로 tcp / udp 등선택이 가능합니다.
- 그외 ip/port는 해당 주소로 리모트서비스를 제공하겠다란 옵션입니다.
public class EchoActor : ReceiveActor { public EchoActor() { Receive<Hello>(hello => { Console.WriteLine("[{0}]: {1}", Sender, hello.Message); Sender.Tell(hello); }); } } public class Hello { public Hello(string message) { Message = message; } public string Message { get; private set; } }
전송에 사용될 Class는 공용 DLL에 정의 되어 , 공용 DLL에 위 내용을 추가한후
ServiceA / ServiceB가 에 참조를 하여야 하고
ServiceB가 ServiceA의 EcshoActor에게 메시지를 보낸 상황을 가정해보겠습니다.
using (ActorSystem actorSystem = ActorSystem.Create("ServiceA")) { IActorRef myActor = actorSystem.ActorOf<EchoActor>("myactor"); //콘솔 종료 방지 코드 생략... } //port 8001
ServiceA 는 EchoActor를 제공하기만 하면됩니다.
using (ActorSystem actorSystem = ActorSystem.Create("ServiceB")) { IActorRef myActor = actorSystem.ActorSelection("akka.tcp://ServiceA@127.0.0.1:8001/user/myactor"); myActor.Tell("Hello"); //콘솔 종료 방지 코드 생략... } //동일 컴퓨터이니 ServiceB의 설정포트를 8002로 변경
위와 같이 ActorSelection을 원격주소를 입력함으로, 상대 AkkaSystem 특정 액터에게 전송이 가능합니다.
로컬에서 작동과 차이점은 주소체계를 앞부분에 넣은준것외에 다른점이 없습니다.