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
와 사용할 수 없으므로 유의해야 한다.
akka.actor.default-mailbox {
mailbox-type = "akka.dispatch.SingleConsumerOnlyUnboundedMailbox"
}
Dispatcher configuration을 등록하듯 직접 mailbox-type
을 설정해주면 디폴트 메일박스 대신 해당 메일박스로 대체된다.
우리는 메시지 큐를 할당할 때 특정 타입의 액터에는 특정한 메시지 큐를 도입하고 싶다. 이런 경우 어떻게 해야할까? 이런 경우 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 역시 메일 박스 타입을 지정할 수 있다. 이전 포스팅에서 정리했든 configuration 섹션에 다음과 같은 코드를 추가하면 된다.
my-dispatcher {
# 커스텀 디스패처 configuration 생략
mailbox-requirement = org.example.MyInterface
}
액터가 생성될 때, ActorRefProvider
는 이 액터를 실행시킬 dispatcher를 가장 먼저 결정한다. 그 후에 mailbox가 결정된다. 메일 박스 선택 우선 순위는 다음과 같다.
deployment configuration
섹션이 메일박스에 대한 내용을 담고 있다면, 이것이 액터가 사용할 메일박스 타입이 된다.Props
가 어떤 메일 박스를 사용할지 가리키고 있다면, 그것을 사용한다. 이때, 절대 경로로 지정되어 있어야 한다.akka.actor.default-mailbox
)가 사용된다.우선순위는 1이 가장 높으며, 6이 가장 낮다.