Actor API

Ada·2023년 8월 25일

Akka

목록 보기
3/32

Actor API

Actor trait 는 receive만을 정의하며, 이는 액터의 동작을 구현합니다.

현재 액터 동작이 수신된 메시지와 일치하지 않는 경우에는
처리되지 않은 메시지 처리 함수인 unhandled가 호출됩니다.
unhandled는 akka.actor.UnhandledMessage(message, sender, recipient) 에 퍼블리싱 된 메서드입니다.

Actor API는 다음과 같은 기능을 제공합니다:

  • self : 액터의 ActorRef에 대한 자기 참조
  • sender : 수신된 메시지 중 마지막 메시지의 발신자를 호출
  • supervisorStrategy : 사용자가 오버라이드 할 수 있는 자식 액터 감시 전략 정의

context 는 액터와 현재 메시지에 대한 문맥 정보를 노출하며 아래와 같은 API가 있습니다.

  • 자식 액터 생성을 위한 팩토리 메서드 (actorOf)
  • 액터가 속한 시스템(system)
  • 상위 감독자(parent supervisor)
  • 감독되는 자식들(supervised children)
  • 라이프사이클 모니터링

Actor Lifecycle

액터 시스템에서의 경로는 생존하는 액터가 "차지"할 수 있는 "장소"를 나타냅니다.

초기에는 (시스템이 초기화한 액터를 제외하고) 경로는 비어 있습니다.
actorOf()가 호출되면 전달된 Props에 의해 설명된 액터의 인스턴스가 주어진 경로에 할당됩니다. 액터의 인스턴스는 경로와 UID에 의해 식별됩니다.

다음 사항에 대한 차이점에 대해 알아두는 것이 중요합니다:

  1. restart
  2. stop 후 액터의 재생성

restart

재시작은 Props로 정의된 Actor 인스턴스만 교체하지만, 인스턴스와 따라서 UID도 동일하게 유지됩니다. 인스턴스가 동일하다면 동일한 ActorRef를 계속 사용할 수 있습니다.
재시작은 액터의 부모 액터의 감독 전략에 의해 처리됩니다.

stop

인스턴스의 생명 주기는 액터가 중지될 때 끝납니다. 이 때 적절한 생명 주기 이벤트가 호출되며, 감시 중인 액터에게 종료가 알려집니다.
인스턴스가 중지된 후에는 경로를 다시 사용하여 actorOf()를 사용하여 액터를 다시 생성할 수 있습니다. 이 경우 새 인스턴스의 이름은 이전과 동일하지만 UID는 다를 것입니다. 액터는 액터 자체, 다른 액터 또는 액터 시스템에 의해 중지될 수 있습니다.

참고할 점은 액터가 더 이상 참조되지 않을 때 자동으로 중지되지 않는다는 것입니다. 생성된 모든 액터는 명시적으로 파괴되어야 합니다. 유일한 단순화는 부모 액터를 중지하면 해당 부모가 생성한 모든 자식 액터가 재귀적으로 중지된다는 것입니다.

액터 참조(ActorRef)는 항상 인스턴스(경로와 UID)를 나타냅니다. 따라서 액터가 중지되고 동일한 이름의 새 액터가 생성되면 이전 인스턴스의 ActorRef는 새 인스턴스를 가리키지 않습니다.

한편, ActorSelection은 경로(와 와일드카드를 사용하는 경우 여러 경로)를 가리키며 현재 어떤 인스턴스가 해당 경로를 차지하고 있는지에 대해 완전히 알지 못합니다.

이러한 이유로 ActorSelection은 감시될 수 없습니다. 현재 인스턴스의 ActorRef를 해결하려면 ActorSelection에 Identify 메시지를 보내서 올바른 참조가 포함된 ActorIdentity로 응답받을 수 있습니다.

이 작업은 ActorSelection의 resolveOne 메서드를 사용하여 수행할 수도 있으며, 해당 메서드는 일치하는 ActorRef의 Future를 반환합니다.

참조
https://doc.akka.io/docs/akka/current/actors.html#identifying-actors-via-actor-selection

profile
백엔드 프로그래머

0개의 댓글