Akka 정리 (하)

김대현·2020년 2월 4일
0

Akka 정리 (하)

#3. Akka 계층구조

아카 계층구조

어떤 액터는 다음과 같은 세 가지 동작을 수행한다.

  • 메시지 수신
  • 메시지 송신
  • 다른 액터를 만든다

보내고 잊기

액터시스템에서 tell 메서드를 이용해서 메시지를 전달하는 것은 철저하게 비동기적이다. tell 메서드를 호출하면 메시지가 실제로 목적지에 도달하는가 여부와 무관하게 즉시 리턴되기 때문이다.

  1. 작업의 완료 확인 어려움 -> 비동기적 실행
  2. 메시지 순서 확인 어려움 -> 보내고 받는 액터 관계가 직접적인 경우에만 확인 가능

#4. try/catch

SupervisorStrategy

  • Resume
  • Restart
  • stop

#5. 액터와 상태기계

new Procedure -> become()

#6. 라우터

Java8에서 병렬처리 : stream() 대신 parallelStreaM() 사용
Akka에서 병렬처리 Router

#7. 보내고 잊지 않기 - future

Java8 CompletableFuture 퓨쳐
Akka에서 퓨쳐 사용 예시

Timeout timeout = new Timeout(Duration.create(5, "seconds"));
Future<Object> future = Patterns.ask(actor, msg, timeout);
String result = (String) Await.result(future, timeout.duration());
//동기로 쓰레드가 기다림

우리가 메시지를 보내고자 하는 목적지에 해당하는 액터는 ask 메서드에게 인수로 전달된다. 보내려는 메시지와 타임아웃 객체도 인수로 전달된다. Await.result 호출은 현재 스레드가 그 자리에서 답변을 기다리게 만든다. 블로킹 호출이다.

public NobblockingActor() {
  child = context().actorOff(Props.create(CalculationActor.class), "calculationActor");
  ec = context().system().dispatcher();
}

Future<Object> future = Patterns.ask(child, message, timeout);
// 
future.onSuccess(new SaySuccess<Object>(), ec);
future.onComplete(new SayComplete<Object>(), ec);
future.onFailure(new SayFailure<Object>(), ec);

public final  class SaySuccess<T> extends OnSuccess<T> {
  @Override public final void onSuccess(T result) {
    log.info("Succeeded with " + result);
  }
}
 

child Actor로 향하는 message를 timeout과 함께 보냈다. 비동기적으로 동작하며 callback과 유사한 방식으로 동작이 끝나고 메시지를 받으면 상황에 맞게 nonblocking 함수 (onSuccess, onComplete, onFailure중 하나)를 실행한다.

에이전트

#8. 클러스터

profile
FrontEnd Developer with React, TypeScript

0개의 댓글