Programing/Akka

Akka Actor

BUST 2017. 6. 25. 11:26


Akka Actor

Akka는 오픈 소스 툴킷으로, JVM 상의 동시성과 분산 애플리케이션을 단순화하는 런타임이다. Akka는 동시성을 위한 여러 프로그래밍 모델을 지원하지만, Erlang으로부터 영향을 받아 actor 기반의 동시성이 두드러진다.

자바와 스칼라 언어 모두로 작성이 가능하다. Akka는 스칼라 2.10로 작성되었으며, 스칼라 2.10의 Akka의 actor 구현은 스칼라 표준 라이브러리에 포함되어있다.

출처 : 위키백과

Akka Actor Model

Akka actor를 기반으로하는 애플리케이션의 구별되는 특징은 다음과 같다:

  • 동시성은 메시지 기반 이며 비동기 방식 으로 이루어진다: 일반적으로 변형 가능한 데이터를 공유하거나 동기화되는 primitive를 사용해서는 안됩니다: Akka는 액터 모델을 구현한다.
  • 동일한 호스트든 분산된 호스트들이든, 직접 통신하든, 몇몇 혹은 다수의 스레드 상에서 동작하는 라우팅 채널을 이용하여 통신하든, 혹은 이외의 방법으로 통신을 하든 actor들이 상호작용하는 방식은 동일하다. 이러한 세부사항들은 프로그램이 수정 없이 스케일-업(더 성능이 뛰어난 서버를 사용)하거나 스케일-아웃(더 많은 서버를 사용)하기 위해 배포 시점의 구성 메카니즘에 따라 변경할 수 있다.
  • Actor들은 프로그램의 오류를 연관성에 따라 계층적으로 분류한다. 이 오류들은 actor의 supervisor의 이벤트로 처리된다(어느 actor가 오류를 발생했다는 메시지인지를 가리지 않음). 얼랭과는 대조적으로 Akka는 parental supervision을 강조한다. 이는 각 actor가 parent actor에 의해 생성되고 감독받는 것을 의미한다.
  • Akka는 actor를 제공하는 코어 모듈을 포함한 모듈 구조를 띄고 있다. 다른 모듈들은 actor의 네트워크 분산, 클러스터 지원, 명령과 이벤트 소싱, 다양한 서드 파티 시스템과의 통합(예, Apache Camel, ZeroMQ), 심지어 Futures, Agents같은 다른 병렬성 모델을 지원하는 것과 같은 기능을 추가하는 것이 가능하게 한다.

출처ㅋ : 위키백과

Actor Example

import akka.actor.AbstractActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;
 
public class MyActor extends AbstractActor {
  private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
 
  @Override
  public Receive createReceive() {
    return receiveBuilder()
      .match(String.class, s -> {
        log.info("Received String message: {}", s);
      })
      .matchAny(-> log.info("received unknown message"))
      .build();
  }
}
  • createReceive 매서드를 통해 생성된 Receive 객체로 실제 Message가 전달받음.

Prop Example

import akka.actor.Props;
Props props1 = Props.create(MyActor.class);
Props props2 = Props.create(ActorWithArgs.class,
  () -> new ActorWithArgs("arg")); // careful, see below 
Props props3 = Props.create(ActorWithArgs.class, "arg");
  • Props 은 Actor 객체가 생성될때 설정 클래스

Full Example

public class DemoActor extends AbstractActor {
  /**
   * Create Props for an actor of this type.
   * @param magicNumber The magic number to be passed to this actor’s constructor.
   * @return a Props for creating this actor, which can then be further configured
   *         (e.g. calling `.withDispatcher()` on it)
   */
  static Props props(Integer magicNumber) {
    // You need to specify the actual type of the returned actor 
    // since Java 8 lambdas have some runtime type information erased 
    return Props.create(DemoActor.class, () -> new DemoActor(magicNumber));
  }
 
  private final Integer magicNumber;
 
  public DemoActor(Integer magicNumber) {
    this.magicNumber = magicNumber;
  }
 
  @Override
  public Receive createReceive() {
    return receiveBuilder()
      .match(Integer.class, i -> {
        getSender().tell(+ magicNumber, getSelf());
      })
      .build();
  }
}
 
public class SomeOtherActor extends AbstractActor {
  // Props(new DemoActor(42)) would not be safe 
  ActorRef demoActor = getContext().actorOf(DemoActor.props(42), "demo");
  // ... 
}
  • getContext 매서드를 이용하여 다른 ActorRef를 얻을수가 있다.


'Programing > Akka' 카테고리의 다른 글

Akka Stream을 이용한 Kafka Producer 개발  (0) 2018.06.02
Persistence Actor  (0) 2018.05.27
Akka Cluster  (0) 2017.10.22
Akka Tutorial  (0) 2017.07.01
Akka Actor Throttle  (0) 2017.06.24