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

Compare with Current View Page History

« Previous Version 10 Next »

Actor란?

액터는 매우 가벼운 동시성  엔터티들이다. 이놈들은 메세지들을 event-driven receive loop  를 이용하여 비동기적으로 실행한다.

메세지에 대응되는 패턴매칭은 액터의 행동을 나타내는 굉장히 편리한 방법이며

추상레벨을 높혀서 Akka 를 가져다가 사용하는 개발자들이  분산/병렬  코드를 작성하기 굉장히 쉽게 해준다.


  • 유사 패턴 : Active Object 패턴
  • 간단한 설명 : 비동기 메시지를 처리할수 있는 능독적 객체

간단한 용어설명

  • 비동기 : 다른 녀석에게 일을 넘기고 내일을 한다. ( 논블럭킹)
  • 동기 : 다른 녀석이 일을 마칠때까지 기다린다. ( 블럭킹 )
  • 능동적 : 나만의 큐와 스케쥴러를 가지고 있음


OOP와 비교해본 Actor Model


OOP

일반적 OOP 설계방법
class DeepThought
  def initialize(state)
    @state = state
  end

  def meaning_of_life
    # This is a long running calculation where
    @state gets mutated frequently to hold
    # intermediary calculations
  end
end

dt = DeepThought.new(data)

Thread.new { dt.meaning_of_life }
Thread.new { dt.meaning_of_life }

#=> BOOM!

 자신의 상태변경및 제공을 멀티스레드에 안전한 방식으로 OOP를 설계한다고 가정하자

이 클래스는 이야기한다, '자신의 속성을 Lock(metex)를 걸어 , 누가 나를 접근할때, 해당 오브젝트를 건들지마(기달려야해)' 라고 이야기하고 있다.


OOP는 멀티 쓰레드환경에서 자신의 속성값을 접근해야하고 공유의 원칙으로 설계가 되기 때문에



접근공유문제와  동시성 문제 해결하기위해, 복잡한 쓰레드 모델을(CriticalSection,SpinLock,Mutex,Semaphore) 익혀야하며

확장하기가 어려워 집니다.


Actor

액터의 기본철학은, 액터가 차지하는 메모리 공간은 어느 다른 쓰레드혹은 동일한 액터에서도 자기자신의 속성을 접근할수 없다

를 원칙으로 한다. 다시말해 액터내부에 일어나는 일은 어느 누구와도 '공유'되지 않으며 죽음의 칵테일에서 

공유라는 속성을 제거함으로 멀티쓰레드와 관련된 문제의 대부분을 제거 하고 시작하다.

공유되지 않기때문에, 임계영역 처리를 위해  'lock' 'synchronized' 와 같은 부자연스러운 키워드가 필요없으며

쓰레드를 생성하고 관리할 필요가 없어진다.  즉, 비동기형 능동적 객체인 Actor를 어떻게  최적화해서

관리할것인가의 문제는 ActorSystem이 해야할일이며 튜닝(옵션)화가 되어있다.   ( http://doc.akka.io/docs/akka/2.5.3/scala/dispatchers.html )


Actor 설계 코드
public class MyActor: ReceiveActor
{
  private readonly ILoggingAdapter log = Context.GetLogger();
  private int state =0;

  public MyActor()
  {
    Receive<string>(message => {
      log.Info("Received String message: {0}", message);
      Sender.Tell(state );
    });
    Receive<SomeMessage>(message => {...});
  }
}



var remoteActor = system.ActorSelection("akka.tcp://MyServer@127.0.0.1:8001/user/someActor");
var state = remoteActor.Ask("Hello").Result; // 질의를 하던지?(Ask),단지 말만한다던지?(Tell)  할수가 있다. 이것이 단순한 객체접근에서 조금더 추상화된 모델이다.


Actor는 오로지 메시만 주고 받으며 동시성을 달성하며,  결과값을 얻기위해서는 객체접근이아닌 질의를 해야한다.

이와같은 처리방식은 동일한 컨셉으로 로컬뿐아니라 리모트처리,분산처리등으로 확장이 될수가있다.


메시지 전송에의해서만, 처리가 되기때문에 확장및 동시성처리에 유연해진다.
















  • No labels