Versions Compared

Key

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

...

C#이 지원하는 순수 동시처리 는 파이프 를 통해 ACTOR와 휼륭하게 연동이 될수있습니다.

 


Dispatcher

...

No Format
custom-dispatcher {
  type = Dispatcher
  throughput = 100
}

.NET ThreadPool 을 통해 작동이되며 대부분의 경우 이것만으로 충분합니다.

몇개의 스레드를 둘것인가? 보다 몇개의 메시지를 동시에 처리하게 할것인가? 에대한 설정입니다.


TaskDispatcher 

...


No Format
custom-task-dispatcher {
    type = TaskDispatcher
    throughput = 100
}

TPL 인프라를 사용합니다. ThreadPool과 유사하지만 병렬처리 Thread를 사용해야하는

특수한 케이스일때 사용합니다. 대부분 신경쓸필요없이 프레임워크가 다중코어처리를 잘 수행하나

병렬처리가 꼭 유용한 경우, 액터설정을 할수가 있습니다. 


PinnedDispatcher

...


No Format
custom-dedicated-dispatcher {
    type = PinnedDispatcher
}

AKKA가 준비한 ,단일 전용 스레드만 사용합니다. 어떠한 목적을 두고 준비된 Dispatcher는 아니며

서비스 메시지 처리와, 시스템 성능 메시지처리를 분리한다고 했을시

성능확인을 위해 그리많은 메시지처리가 되지 않고, 서비스 메시지처리와 분리하여 작동시키고자 할때 활용될수 있습니다.


ForkJoinDispatcher 

...


No Format
            my-dispatcher {
              type = ForkJoinDispatcher 
              throughput = 100
              throughput-deadline-time = 0ms
              dedicated-thread-pool {
                thread-count = 3
                deadlock-timeout = 3s
                threadtype = background
              }
            }

나머지 대부분 Dispatcher는 목적에맞게 최적화된 각자의 스레드풀이 있습니다.스레드풀 메카니즘이 있고 신경쓸필요없으나

ForJoinDispatcher의 경우  전용 스레드풀을 사용하며, 이 스 케줄러를 이용할시생성하여, 스레드수를 직접 할수있는 유일한 Dispatcher입니다.

이 스케줄러를 이용할시, 세밀한 튜닝 전략으로 나머지 시스템에서 일부 액터를 분리할수가 있습니다.


SynchronizedDispatcher

...

UI를 업데이트할수있는 전용 Dispatcher 입니다.  Actor는 UI Thread내에서 작동되는 녀석이 아니며

Actor와 별개로 대부분 타 스레드가 UI 객체를 변경하고자 할때 문제가 생깁니다.  ( WPF,WINFORM 모두 동일)

이러한 문제에대해 단순한 처리는 UI 스레드내에서 어떠한 작업을 진행하는것인데, 그러면 UI가 멈춰서 좋은 UX를 제공하기 불가합니다.

관리툴 목적으로, 네이티브한 UI 를 만드는 경우 활용할수 있습니다.  


TEST1-액터내에서 블락킹되는경우

...

Code Block
languagec#
themeEmacs
title지연액터
linenumberstrue
    public class ReActor : ReceiveActor
    {
        private ILoggingAdapter log = Context.GetLogger();

        public ReActor()
        {
            Receive<string>(message => {

                if(message == "slow")  //slow메시지를 받으면, 지연시킵니다.(테스트 지연코드)
                {
                    Task.Delay(500).Wait();
                }

                string reply = string.Format("I'am {0} RE:{1}", Self.Path, message);
                log.Info(reply);
                Sender.Tell(reply);
            });            
        }
    }

...