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

Compare with Current View Page History

« Previous Version 11 Next »

액터모델의 특징 요약

  • 동시및 분산 시스템작성을 위해 높은수준의 추상화제공
  • 개발자가 명시적 잠금처리및 스레드 관리 안해도됨
  • 이로인해 병렬 시스템 작성에 용이


Actor 정의(+메시지설계)



 
    public class SomeMessage
    {
        public string message { set; get; }
    }

    public class MyActor : ReceiveActor
    {        

        public MyActor()
        {
            Receive<string>(message => {
                Sender.Tell("RE:" + message);                
            });

            Receive<SomeMessage>(message => {
                Sender.Tell("RE:" + message.message);
            });
        }
    }



 Actor는, 메시지를  송수신을 정의하는 가장작은 객체의 정의 이며, 능동적 객체라고 볼수 있다.


Actor설계시 기본적으로 다음을 고려하면 된다. 이것은 마치 특정API 설계시 하는 고민과 똑같다.

  • 어떠한 메시지(구조체)를 전달할것인가?
  • 특정한 메시지(요청)에 어떻게 반응할것인가?


위 정의 코드는 그러한 설계에대해 구현을 한것이며, 다음과 같은 스펙을 가진다.

  • message 문자열 오브젝트를 가진, SomeMessage 존재
  • 메시지를 받게 될시 , 접두어 "RE:" 를 붙여 해당 메시지를 그대로 돌려줌

 위 코드에서 생성자에서 , 패턴 매칭하여 메시지 처리기가 가능한것은 , ReveiveActor의 추상화덕분이며

IF문이나 스위치문없이 생성자에서 , 처리할 패턴별로 처리기가 등록이 가능한것은 C#의 문법지원때문인데

C# 언어학적으로 파악하고자 하면 (람다/함수형/델리게이트) 참조하여 더 싶은 학습이 가능합니다.


어쨋든, 우리의  아주 짧은 액터 메시지 처리기 설계가 끝이 났습니다.

액터 생성



        protected void SomeTest1()
        {
            IActorRef myActor = actorSystem.ActorOf<MyActor>("myactor");
            Console.WriteLine(myActor.Ask("Hello Akka").Result);
        }

RE:Hello AKKA


처음에 설계한 MyActor를 myActor란 이름으로 생성하고

Heelo Akka란 메시지를 전송하여 그 결과값을 출력하는 예제입니다.

보낼수 있는 명령 Type

  • Ask : 결과값을 기대할때 사용합니다. 비동기로 수신하며, 동기처리시 .Result를 붙입니다. ( C#의 Async 프로그래밍 )
  • Tell : 결과값이 필요 없을때 , 단지 전송만 하고 대기처리가 없습니다.


Child 액터 생성과 액트선택




자식 노드 생성

            Receive<string>(message => {
                if (message == "createChild")
                {
                    Context.ActorOf<MyActor>("myChild");
                    Sender.Tell("Create Child Succed:myChild");
                }
                else
                {
                    Sender.Tell("RE:" + message);
                }
            });

문자열 수신부분을 수정을 하여,  createChild 란 문자열을 받을시 'myChild' 란 하위 노드의 액트를 생성하고

자식액트(하위노드) 의 생성을 반환하는 메시지를 응답하는 예제입니다.

이것을 작동하는 코드는 아래와 같이 하면 되겠습니다.


자식노드를 선택하여 메시지 보내기


        protected void SomeTest2()
        {
            IActorRef myActor = actorSystem.ActorOf<MyActor>("myactor");
            Console.WriteLine(myActor.Ask("createChild").Result);
            Console.WriteLine(actorSystem.ActorSelection("/user/myactor").Ask("Hello Akka1").Result);
            Console.WriteLine( actorSystem.ActorSelection("/user/myactor/myChild").Ask("Hello Akka2").Result );
        }

Create Child Succed:myChild
RE:Hello Akka1
RE:Hello Akka2


사용자가 만든 액터 로트의 최상위는 'user' 이며 만든 계층에따라 하위 뎁스로 가게 됩니다. 

actorSystem에 의해 어떠한 이름(myactor))으로 만들어졌다면  'user/myactor'
myactor가 어떠한 이름(myChild) 하위 노드를 만들었다면 'user/myactor/myChild' 이렇게 계층화가 됩니다.

그리고  actorSystem.ActorSelection( 액터주소).어떠한액션() 을 할수가 있습니다.











  • No labels