Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Noteinfo

Remote 는, 기존 작성했던 로컬에서 액터를 그대로 재활용하여 , 액터설계의 코드변경없이

원격지에서 사용이 가능합니다. 이것은 아주 큰장점입니다. 대부분의 비동기처리에 있어서

로컬에서도 휼륭한 역활을 하지만 , 원격에 배치를 하여 메시지처리를 휼륭하게 합니다.

이것이 Actor를 굳이 RemoteActor라고 부르지 않는 이유입니다.

코드 변경없이 원격 배치가 가능합니다.

Panel
title설정
akka {
    actor {
        provider = "Akka.Remote.RemoteActorRefProvider, Akka.Remote"
    }

    remote {

helios.tcp {
port = 8001 #bound to a specific port
hostname = 127.0.0.1
}

    }
}

...

Code Block
languagec#
themeEmacs
title원격 처리를 위해 메시지정의 공용 DLL로 집합
linenumberstrue
    public class EchoActor Hello
    {
        public Hello(string message)
        {
            Message = message;
        }

        public string Message { get; private set; }
    }

    public class EchoActor2 : ReceiveActor
    {
        public EchoActorEchoActor2()
        {
            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에 위 내용을 추가한후

...

Code Block
languagec#
themeEmacs
titleServiceB
linenumberstrue
			using (ActorSystem actorSystem = ActorSystem.Create("ServiceB"))
            {
				//자신이 가진액터가 아닌, 원격지의 액터 선택이기 때문에 ActorSelection 을 사용합니다.
                IActorRefActorSelection myActorotherActor = actorSystem.ActorSelection("akka.tcp://ServiceA@127.0.0.1:8001/user/myactor");
				Hello msg = new Hello("Hello");
                myActorotherActor.Tell("Hello"msg);
                //콘솔 종료 방지 코드 생략...
            } //동일 컴퓨터이니 ServiceB의 설정포트를 8002로 변경

...

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


Warning
title액터 메시지 설계시 주의점

두 액터간 메시지를 주고 받을때, 인사(Hello)에 항상 반응 하는 두 액터가 있다고 가정해봅시다.

두 액터중 아무나 먼저 상대 액터에게 인사를 시작하면 두액터는 무한대로 인사를 주고 받을것입니다.

네트워크에서 발생할수 있는 무한루프이며, 네트워크 지연이없을수록 하드웨어 자원(CPU,메모리)를 빠르게 고갈시킬것입니다.

이러한 실수를 방지하기위해 전통적인 방법으로는 전송 오브젝트에대해 요청(Req)과 응답(Res)을 분리하여 네이밍을 할수 있습니다

우리는 EchoActor를 통해 자신이한 인사가 되돌아오는것을 확인하였습니다.

하지만 이러한 가정을 해봅시다. EchoActor1가 EcshoActor2 에게 인사를 합니다.

어떠한 상황이 펼쳐질까요? 메시지간 무한반복이 됩니다. 인사를하고 인사를 받고 또하고 받고하는

끝나지 않는 상황이 됩니다. 응답시간이 0 이라고 가정해봅시다.

이것은 무한대의 메시지 처리가 될것입니다. 마치 거울두개를 맞되어 무한의 이미지가 투영되는것으로

컴퓨터는 이것을 처리할수 없습니다. 가끔 이것을 몇분 컴퓨터가 버티냐? 호기심에 부하테스트를 하기도합니다.

동일컴퓨터이거나 네트워크상황이 좋은면 이것은 보통 더 빨리 크래쉬가 납니다.

이러한 실수를 방지하려면 보통 네이밍 기법으로 해결합니다.

Hello ==> HellowReq , HelloRes 이렇게 요청과/응답을 분리를 합니다.

인사의 속성을 살펴보면, 같은 안녕이지만 처음 인사는 인사의 응답을 받는 숨은 의미가 있습니다.

그래서 HellowReq (Request) 입니다. 인사에 대응하는 안녕은 응답을 해주고, 다음에 그어떤 기대가

숨어있지 않습니다. 그래서 HellowRes(Response) 입니다.

하지만 이방식은 일반적인 방식은 아니며 , 전통적인 패킷설계방식을 적용한것입니다.

액터는 네이밍에 관여하지 않고, 메시지 전송에 자유롭기때문에 이것은 응용개발자가 더 좋은 방법으로

설계를 할수가 있을것입니다.