You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

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는 해당 주소로 리모트서비스를 제공하겠다란 옵션입니다.



원격 처리를 위해 메시지정의 공용 DLL로 집합
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에게 메시지를 보낸 상황을 가정해보겠습니다.


ServiceA
			using (ActorSystem actorSystem = ActorSystem.Create("ServiceA"))
            {
                IActorRef myActor = actorSystem.ActorOf<EchoActor>("myactor");
                //콘솔 종료 방지 코드 생략...
            } //port 8001

ServiceA 는 EchoActor를 제공하기만 하면됩니다.



ServiceB
			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 특정 액터에게 전송이 가능합니다.

로컬에서 작동과 차이점은 주소체계를 앞부분에 넣은준것외에 다른점이 없습니다.













  • No labels