[Akka.NET] 액터 생성하기

참조


액터 모델이란?

  • 최소 단위는 액터입니다.
  • 액터는 메시지로만 소통합니다.
    • 메시지는 가장 낮은 결합도 입니다.(상대 주소 정보반 갖지, 직접 접근하지 않습니다.)
    • 액터 시스템이 메시지 처리를 담당합니다.
    • 메시지는 불변입니다.

액터의 기능

  • 액터는 Mailbox, Behavior, State, SupervisorStrategy, Children으로 구성됩니다.
    • Mainbox : 액터 시스템으로부터 전달 받은 메시지를 FIFO(First In First Out) 으로 처리됩니다.
    • Behavior : 함수 수행
    • State : 객체 멤버 변수와 비슷한 개념
    • SupervisorStrategy : 장애 처리
    • Children : 자식, 자신을 중심으로 계층 구조를 접근 할 수 있다.

액터 만들기

  • C#에서 Akka.Net NuGet Package를 설치한 후, 코드를 통해 액터 만드는 방법에 대해서 알려 드리겠습니다.

Akka.Net NuGet Package 설치하기

  • Akka.Cluster 를 검색하여 해당 누겟 패키지를 설치하면 됩니다.
  • Akka.NET 이 Akka.Cluster 종속성에 포함되어 있기 때문에, Akka.Cluster 를 설치하면 추가 설치가 필요 없습니다.


예제 코드

  • 앞에서 Akka.Cluster 누겟을 설치 완료 하였습니다.
  • 이제 가장 기본이 되는, 액터를 생성하는 방법에 대해서 예제 코드를 통해서 보여 드리겠습니다.
  • 또한, 간단히 메시지를 보내서 Receive 로 받아서 Console 에 출력하는 것 까지 보여 드리겠습니다.
using Akka.Actor;
using System;

namespace interfaceTest
{
    class Program
    {
        // 액터 시스템 생성
        static ActorSystem system = ActorSystem.Create("MyActor");

        static void Main(string[] args)
        {
            SomeMessage some = new()
            {
                message = "안녕하세요. SomeMessage 클래스에서 보냅니다."
            };

            // demoActor 생성
            IActorRef demoActor = system.ActorOf(DemoActor.Props(), "someMessage");
            IActorRef demoActor2 = system.ActorOf(DemoActor.Props(), "message");

            // 액터 메시지 보냄
            Console.WriteLine(demoActor.Ask(some).Result);
            Console.WriteLine(demoActor2.Ask("이것은 그냥 메시지입니다.").Result);
        }
    }

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

    public class DemoActor : ReceiveActor
    {
        public DemoActor()
        {
            Receive<string>(_ => Handle(_));
            Receive<SomeMessage>(_ => Handle(_));
        }

        public static Props Props()
        {
            return Akka.Actor.Props.Create(() => new DemoActor());
        }

        private void Handle(string message)
        {
            Sender.Tell($"Re: {message}");
        }

        private void Handle(SomeMessage message)
        {
            Sender.Tell($"SomeMessgae Re: {message.message}");
        }
    }
}

실행 결과

SomeMessgae Re: 안녕하세요. SomeMessage 클래스에서 보냅니다.
Re: 이것은 그냥 메시지입니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY