Versions Compared

Key

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

단일기기 단일 액터의 전송 능력을 확인하기 위해 닷넷코어 AKKA.net을 이용하여 

가장 실플하게 부하를 줄수있는 액터설계와, 측정가능한 녀석으로 만들어보겠습니다.


무한반사 액터설계

무한 반사 액터의 컨셉이며, 이 컨셉에서 단일장비에서 얼마나 많은 메시지를 처리하는지확인하기위해 무한반사 액터를 다음과 같이 설계하였습니다가장 심플하게 부하를 줄수 있어서 채택하였습니다.

  • 단일 액터는 순차성이 보장되기때문에, 하나의 액터는 하나의 메시지만 처리한다처리합니다.
  • 메시지를 상대에게 재 전송한다. 받은녀석은 또 재전송한다 ( 무한 )무한메시지는 n개 추가가능...전송하며, 상대는 또 재전송합니다.
  • 메시지는 n개 추가가능하며, 메시지를 늘려봅니다.

성능에영향을 주는 경우의 수 = 액터수(탁구대1쌍) * 메시지수(탁구공)

실제 작동모습

액터두개를 만들고 위와같이 작동을 시켜, Tick(탁구채에 맞은수를 모두 카운팅)

의 TPS를 측정합니다.  탁구공이 상대편에 전달되는 시간이 짧으면 짧을수록 많은 수가 처리되며

CPU를 최대한 활용해서 0에가깝게 작동되겠지만...물리적으로 0이 될순없을것같습니다. 

정확하게 위와동일하게 작동하는 액터를 만들어보겠습니다.

성능테스트기를 어떻게 구현하고 검증하였는지 간략하게 살펴보겠습니다메시지 발생수(틱톡)를 카운팅하여, 탁구대수와 공의수를 조절하여

TPS를 최대한 끌어올려보는것이 이 실험의 주요 목표입니다.

무한반사 액터구현

Code Block
themeEmacs
linenumberstrue
using Akka.Actor;
using Akka.Event;
using Akka.Monitoring;

namespace AkkaDotBootApi.Actor
{
    public class InfiniteMessage
    {
        public string Message { get; set; }

        public uint Count { get; set; }
    }

    public class InfiniteReflectionActor : ReceiveActor
    {
        private IActorRef ReplyActor;

        private readonly ILoggingAdapter logger = Context.GetLogger();

        public InfiniteReflectionActor()
        {
            ReceiveAsync<IActorRef>(async actorRef =>
            {
                ReplyActor = actorRef;
            });

            ReceiveAsync<InfiniteMessage>(async infiniteMessage =>
            {
                Context.IncrementCounter("akka.infinite.metric");  // <-- 요녀석이 성능카운터 측정기, 지정된이름으로 메시지당 1증가합니다.
                var reply = new InfiniteMessage
                {
                    Message = infiniteMessage.Message,
                    Count = ++infiniteMessage.Count
                };
                
                if(reply.Count % 50000 == 0)					 // <-- 작동잘하는지 확인하기위해 5만건당 로그를 찍습니다.콘솔창은 해당 TPS를 못 따라가기때문에 건수마다 찍으면 위험합니다.
                {
                    logger.Info($"Count:{reply.Count}");
                }

                ReplyActor.Tell(reply);							// 카운팅 1증가된 메시지를 되돌려줍니다.(상대편이 받고 다시 받게됩니다. - 무한반사)
            });
        }

    }
}

...