[Akka] Classic Mailboxes

smlee·2023년 8월 25일
0

Akka

목록 보기
10/50
post-thumbnail

Akka에서 MailBox는 액터로부터 온 메시지들을 보관하는 곳이다. 보통 모든 액터들은 각자의 메일박스를 가지고 있다. 하지만, BalancingPool은 하나의 메일박스 인스턴스를 공유한다.

메일박스 선택하여 지정하기

메일박스가 따로 설정되지 않았다면 디폴트 메일박스가 사용된다. 이 메일박스는 java.util.concurrent.ConcurrentLinkedQueue로 unbounded mailbox이다

java.util.concurrent.ConcurrentLinkedQueue
링크드 노드에 의거한 제한이 없는 thread-safe한 큐이다. 큐이므로 모든 원소들이 FIFO(First In, First Out)의 특징을 따른다. 효율적인 non-blocking 알고리즘을 가지고 있으며, Serializable을 상속하여 직렬화가 되어 있다.

SingleConsumerOnlyUnboundedMailBox는 더욱더 효율적인 메일박스이고, 이 역시 디폴트 메일박스로 사용될 수 있으나, BalancingDispatcher와 사용할 수 없으므로 유의해야 한다.

메일박스 configuration 등록하기

akka.actor.default-mailbox {
  mailbox-type = "akka.dispatch.SingleConsumerOnlyUnboundedMailbox"
}

Dispatcher configuration을 등록하듯 직접 mailbox-type을 설정해주면 디폴트 메일박스 대신 해당 메일박스로 대체된다.

Actor를 위한 메세지 큐 타입

우리는 메시지 큐를 할당할 때 특정 타입의 액터에는 특정한 메시지 큐를 도입하고 싶다. 이런 경우 어떻게 해야할까? 이런 경우 RequiresMessageQueue라는 트레이트를 믹스인하면 된다.

RequiresMessageQueue
trait RequiresMessageQueue[T] extends AnyRef 형태로, 타입에는 config에 있는 akka.actor.mailbox.requirements를 매핑한다.

import akka.dispatch.RequiresMessageQueue
import akka.dispatch.BoundedMessageQueueSemantics

class MyBoundedActor extends MyActor with RequiresMessageQueue[BoundedMessageQueueSemantics]

with를 사용하여 RequiredMessageQueue를 사용하였으며, 사용할 메시지큐의 타입을 중괄호 안에 넣어주면 된다.

RequiredMessageQueue의 타입 파라미터는 configuration의 메일박스에 다음과 같이 넣어주어야 한다.
위에서 설명했듯 akka.actor.mailgox.requirements에서 메일 박스를 매핑한다.

bounded-mailbox {
  mailbox-type = "akka.dispatch.NonBlockingBoundedMailbox"
  mailbox-capacity = 1000 
}

akka.actor.mailbox.requirements {
  "akka.dispatch.BoundedMessageQueueSemantics" = bounded-mailbox
}

따라서 예시에서 사용한 MyBoundedActor는 bounded-mailbox를 얻고, 다른 타입의 앵ㄱ터들은 deployment에 작성된 메일박스를 얻을 것이다.

Dispatcher를 위한 메시지 큐

dispatcher 역시 메일 박스 타입을 지정할 수 있다. 이전 포스팅에서 정리했든 configuration 섹션에 다음과 같은 코드를 추가하면 된다.

my-dispatcher {
  # 커스텀 디스패처 configuration 생략
  mailbox-requirement = org.example.MyInterface
}

MailBox Type 선택 우선순위

액터가 생성될 때, ActorRefProvider는 이 액터를 실행시킬 dispatcher를 가장 먼저 결정한다. 그 후에 mailbox가 결정된다. 메일 박스 선택 우선 순위는 다음과 같다.

  1. 만약 액터의 deployment configuration 섹션이 메일박스에 대한 내용을 담고 있다면, 이것이 액터가 사용할 메일박스 타입이 된다.
  2. 만약 Props가 어떤 메일 박스를 사용할지 가리키고 있다면, 그것을 사용한다. 이때, 절대 경로로 지정되어 있어야 한다.
  3. dispatcher configuration이 메일박스 타입을 가지고 있다면 해당 메일박스 타입을 가져온다.
  4. 만약 액터가 요구하는 메일박스 타입이 존재한다면 그것이 채택된다.
  5. 만약 디스패처가 요구하는 메일박스 타입이 존재한다면 그것이 메일박스 타입으로 채택된다.
  6. default 메일 박스(akka.actor.default-mailbox)가 사용된다.

우선순위는 1이 가장 높으며, 6이 가장 낮다.

Reference

0개의 댓글