[Akka.net] 액터모델 - MailBox편

메일박스의 개념은 처리할 이벤트를 메일박스에 담아두고 하나씩 꺼내어 처리하는 심플한 아이디어로 오늘날의 MQ(Kafka,Rabbit MQ…)가 기본으로 채택하고 있는 방식입니다.

Akka의 액터모델 또한 로컬및 클러스터(리모트)에서 경량화된 메일박스 가지고 있으며 이는 외부 MQ를 대체하는것이아닌 메일박스를 상호 연결함으로 더 유연한 구조로 상호 운영할수도 있습니다.

메시지 순차보장이 되는 FiFO방식의 기본 메일박스 커스텀을 통해, 실시간으로 처리되는 메시지 이벤트 우선순위를 조정할수 있는 컨셉을 살펴보겠습니다.

낮은숫자가 우선순위가 높으며 메일함의 메시지 우선순위를 조정할수 있습니다.

public class MyCustomMailbox : UnboundedPriorityMailbox
{
    protected override int PriorityGenerator(object message)
    {
        if (message is Issue issue)
        {
            if (issue.IsSecurityFlaw)
            {
                return 0;
            }
            else if (issue.IsBug)
            {
                return 1;
            }
            else
            {
                return 2;
            }
        }
        return 3;
    }
}

다음과 같이 메시지를 발생시키고 메시지 수신검증 테스트를 만들수 있습니다.

var actorSystem = akkaService.GetActorSystem();
TestProbe testProbe = this.CreateTestProbe(actorSystem);
var mailBoxActor = actorSystem.ActorOf(Props.Create(() => new BasicActor()).WithMailbox("my-custom-mailbox") );
mailBoxActor.Tell(testProbe.Ref);
testProbe.ExpectMsg("done");
Within(TimeSpan.FromMilliseconds(cutoff), () =>
{
    mailBoxActor.Tell(new Issue() { IsBug = true });
    mailBoxActor.Tell(new Issue());
    mailBoxActor.Tell(new Issue() { IsSecurityFlaw = true });
    mailBoxActor.Tell(new Issue() { IsBug = true });
    mailBoxActor.Tell(new Issue() { IsBug = true });
    mailBoxActor.Tell(new Issue() { IsSecurityFlaw = true });
    mailBoxActor.Tell(new Issue());
    for (int i = 0; i < testCount; i++)
    {
        var issue = testProbe.ExpectMsg<Issue>();
        var jsonString = JsonSerializer.Serialize(issue);
        output.WriteLine($"Issue: {jsonString}");
    }
});

Test를 수행하면 메시지 우선순위가 높은 메시지를 우선 처리하려고 합니다. 메일함 전체 처리가 오래 걸리는경우 , 블락없이처리할 메일함 내의 우선순위를 역전시키고자 할때 유용하게 이용할수 있습니다.

## Recived Issue : {"IsSecurityFlaw":true,"IsBug":false}
## Recived Issue : {"IsSecurityFlaw":false,"IsBug":true}
## Recived Issue : {"IsSecurityFlaw":false,"IsBug":true}
## Recived Issue : {"IsSecurityFlaw":false,"IsBug":true}
## Recived Issue : {"IsSecurityFlaw":false,"IsBug":false}
## Recived Issue : {"IsSecurityFlaw":false,"IsBug":false}
## Recived Issue : {"IsSecurityFlaw":false,"IsBug":false}
## Recived Issue : {"IsSecurityFlaw":false,"IsBug":false}
## Recived Issue : {"IsSecurityFlaw":false,"IsBug":false}

자세한 코드와 MailBox기능을 Blazor.net PlayGround를 통해서도 살펴볼수 있습니다.

5 Likes

Within 이런 함수도 있군요 아 찾아봐도 잘안나오네요 TEST 프로젝트에서 사용하는 구문인지
실력이 없어서 이해하기 힘들지만 ACTOR MODEL 에 Arguement 전달시에 우선순위
인자값을 던져서 우선 처리 를 가능하다 정도로 이해했습니다.

현재 진행중인 Que 순서를 조정할수 있다는것이 좋은것 같군요

1 Like

일반적으로 유닛테스트를 하는경우 중단후 동기검사를 하는데~
액터모델의 경우 중단없이 작동되는 상태로 수신검증을 해야하기 때문에 extend 테스트 툴킷을 제공합니다.

-메인 액터는 중단없이 흘러감
-관찰자 액터를 연결해 관찰자가 수신받은 메시지를 하나씩 검사(messageDeliveryOnce 컨셉)

Within 은 해당 시간내에 수신검증을 못하면 testFail로 간주하는 Akka.net 제공 unitest 툴킷 제공 함수입니다. ( 테스트에서만 사용 )

링크 : Testing Actor Systems | Akka.NET Documentation

1 Like

와 근데 ACTOR MODEL 은 자바 진영에서도 거의 적용된것 못보고
(제가 견문이 좁아서)
잘 언급도 안되는데 거의 혼자서 구축 하셨겠어요

Instance 를 재활용(?) 개념으로 singleton 심화편인것 같은데
관련해서 Deep 한 HardCore 한 세미나 같은것 진행하시면

다른 개발자에게 귀감이 될것 같습니다.
기존에 new 로 인스턴스 생성이나 의존성 주입보다 한단계 더나아간
개념인데 많이 전파 되면 닷넷도 이런 고급 문법 쓴다

할수 있을것 같아요(당연하지만)

1 Like

MS도 Orleans 이라는 액터모델(grain이라고 표현) 프레임을 개발하고 자사 플랫폼에 적극활용하는것으로 보이며

최근 Opean AI도 ML 파이프라인에 Ray(Actors — Ray 2.36.0) 를 채택해 분산처리에 활용해 유명해진것같으며

국내 테크기업에서 성공적 활용사례는 찾기가 어려운것은 사실이네요
(빅테크가 아니여도 해외사례는 많은듯)

하지만 닷넷진영이 쓸만한 액터프레임워크가 제일 풍성해 선택지가 많은것으로 보여집니다. ( Orleans , proto , akka.net 등…)

2 Likes

Akka 좋지요.
다만 Akka는 상업 라이센스를 꼬아놓았고 (Why We Are Changing the License for Akka | Lightbend)
Akka.net은 opentelemetry(분산추적, 메트릭) 라이브러리를 유료화(https://phobos.petabridge.com/)해서 안사면 깜깜이 운영해야하는 불편함이 존재합니다.

클라우드 람다가 유행하면서 상태 저장 클러스터링 액터 모델은 상대적으로 더 주목을 못받는 상황이 된거 같아 개인적으로는 안타깝습니다.

2 Likes

AKKA의 라이센스 변경은 이용하는 입장에서 안타까워하는 부분이지만

다음과같이 약간 다른 개인적 시각으로도 해석하고 있습니다.

오픈소스를 개발해 기부금으로 운영되던 오늘날의 기업이 클라우드 등장으로 오픈진영이 아닌 클라우드 업체만 돈버는 구조가 되면서 ( 오픈진영 생태계 교란)
오픈진영의 라이센스 정책 변경은 몽고DB/Redis/ElasticSeach를 포함 성공한 오픈진영이 선택하는 오늘날의 흐름인것같습니다.
이 문제로 AWS내 직접제공 PaaS들이 본진영과 결별하고 버전이 갈리면서 신규기능이용및 EOL대비 포함 골치 아픈일이 되었습니다.
(오로라(Mysql5 중단), OpenSearch Vs Elasticsearch,Redis…)

다만 라이트벤드 AKKA 라이센스 변경의 아쉬운점의 추가점은 다음과같은 것들입니다.

라이트벤드가 리액티브 스트림 서밋을 주도하면서 다양한 빅테크기업들을 참여시켜 수년간 크게 성공한 활동이였으나
AKKA를 엣지로 적용한 빅테크 기업에서 라이센스의 갑작스러운 변경으로 빅테크 기업 지지를 잃은듯한보이며
AKKA보다는 리액티브 스트림 서밋 활동이 함께 죽은것이 더 안타까운부분입니다.
또는 이제 더이상 새로운것이 없거나
( 리액티브 스트림은 AKKA가 없어도 되지만 이 활동에서 중심인 플랫폼이였습니다. )

액터모델을 클라우드화 한 제품은 람다와 성격이 다르며 람다와도 상호운영할수 있을것으로 보여지며
람다의 이용범위가 넓고 클러스터화된 상태 서비스는 사용목적이 극히 한정적이기때문에 이 둘의 직접 비교보다는
액터모델을 클라우드화 다음제품 3강 체제로 비교로 보고 있습니다.

  • AWS Ray ( OpenAI 가 채택해 최근 유명해진 Ray를 클라우드화 클라우드만 배불리기하면 Ray도 라이센스 변경할지도)
  • Kalix ( 클러스터 관리필요없는 PasS 제품출시 )
  • MS Azure Orlean Grain ( MS는 자사가 직접 디벨롭한것을 밀고 있음, MS 제품군내에서만 사용하는듯. 닷넷진영도 크게 사용안하는것으로 보여짐 )

AKKA.net을 만든 페타브릿지의경우 라이트벤드와 비교해 작은 기업으로
여전히 닷넷진영에 오픈소스로 기여를 하고 있으며 MS Orleans 진영과도 교류하며 상호 발전하는것으로 보여집니다.
Akka.net을 개발하는 작은기업인 페타브릿지가 오픈소스를 계속 기여하면서 어떻기 생존해 나갈까? 살펴보고 있으며

akka로 포팅된 모든 기능은 여전히 오픈소스이며 모니터링을 구축하고 디벨럽하는 수단도 제공합니다. (개발자의 몫)
다만 기업이 성장했을때 비용을 지불하는 시기가 단순히 매출이 아닌, 기업이 액터모델을 잘활용할때
모니터링툴인 Phobos 일것이다라고 선택한것은 오픈진영의 새로운 생존 모델로 보여지며
단순하게 매출로 계산해 코어영역까지 비용을 받는 라이센스모델과의 변화와는 다르게 보고 있습니다.

액터 클러스터는 람다와 경쟁이 아닌 글로벌 대용량 트래픽 서비스에서 이미 상당수 채택하고 있는 패턴중 하나이며
AKKA만이 선택지가 아닌 다양한 메시지패턴을 로컬에서 학습할수 있는 툴킷정도 생각하고 있으며
클라우드 PasS로 전환했을때도 로컬에서 개발한 경험이 도음이 될것이라 믿고 있습니다.
(비용측면에서 대용량 MQ처리의 경우 호출당 과금이 되기때문에 꼭 장점이 있는것은 아니며, 로컬에서 작동하고 배포가능한것은 가능한 선택지가 하나더 있는것으로 보고있습니다.)

2 Likes