[java] Akka 액터의 상호작용과 상태 전이

Akka는 자바 및 Scala를 위한 고성능 액터 모델 라이브러리입니다. 액터 모델은 동시성과 병렬성 문제를 다루기 위한 언어 수준의 패턴입니다. Akka 액터는 동시에 실행할 수 있는 고립된 단위로서 작업을 수행하고 다른 액터와 메시지를 통해 상호작용합니다.

이 글에서는 Akka 액터의 상호작용과 상태 전이에 대해 살펴보겠습니다.

액터간 메시지 전송

Akka 액터는 메시지를 통해 상호작용합니다. 액터는 다른 액터로 메시지를 보낼 수 있으며, 보낸 액터는 메시지를 받은 액터에 대한 참조를 유지합니다. 이러한 메시지 전송은 비동기적으로 이루어지며, 보낸 액터는 메시지의 처리 결과를 필요에 따라 확인할 수 있습니다.

public class SenderActor extends AbstractActor {

  private final ActorRef receiverActor;

  public SenderActor(ActorRef receiverActor) {
    this.receiverActor = receiverActor;
  }

  @Override
  public Receive createReceive() {
    return receiveBuilder()
      .match(String.class, message -> {
        // 메시지를 받은 액터에게 메시지를 전송
        receiverActor.tell(message, getSelf());
      })
      .build();
  }
}
public class ReceiverActor extends AbstractActor {

  @Override
  public Receive createReceive() {
    return receiveBuilder()
      .match(String.class, message -> {
        // 메시지 처리
        System.out.println("Received message: " + message);
      })
      .build();
  }
}
public class Main {

  public static void main(String[] args) {
    ActorSystem system = ActorSystem.create("my-system");

    ActorRef receiver = system.actorOf(Props.create(ReceiverActor.class));
    ActorRef sender = system.actorOf(Props.create(SenderActor.class, receiver));

    sender.tell("Hello, Akka!", ActorRef.noSender());
  }
}

액터의 상태 전이

Akka 액터는 내부 상태를 가질 수 있습니다. 상태는 액터의 동작에 영향을 미치는 변수 또는 객체입니다. 액터는 메시지에 따라 상태를 변경할 수 있으며, 다른 상태에서 다른 동작을 수행할 수 있습니다.

public class MyActor extends AbstractActor {

  private int count = 0;

  @Override
  public Receive createReceive() {
    return receiveBuilder()
      .match(Integer.class, message -> {
        count += message;

        if (count > 10) {
          getContext().become(highCountState());
        }
      })
      .build();
  }

  private Receive highCountState() {
    return receiveBuilder()
      .match(Integer.class, message -> {
        System.out.println("High count state: " + message);
      })
      .build();
  }
}
public class Main {

  public static void main(String[] args) {
    ActorSystem system = ActorSystem.create("my-system");

    ActorRef actor = system.actorOf(Props.create(MyActor.class));

    actor.tell(5, ActorRef.noSender()); // count = 5
    actor.tell(10, ActorRef.noSender()); // count = 15, 상태 변경
    actor.tell(3, ActorRef.noSender()); // 상태 변경된 상태에서 메시지 처리
  }
}

Akka 액터는 내부 상태를 유지하고, 메시지에 따라 상태를 전이할 수 있는 강력한 도구입니다. 액터는 동시성 및 병렬성 문제를 다루기 위한 간편한 방법을 제공하며, 대규모 애플리케이션에서 성능을 향상시킬 수 있습니다.

참고 자료