Как использовать Akka BoundedMailBox, чтобы душить производителя
У меня есть два актера, один производит сообщения, а другой потребляет сообщения с фиксированной скоростью.
Можно ли ограничить производителя потребителями BoundedMailBox? (обратное давление)
Мой продюсер в настоящее время периодически намечает (отправляя ему тиковое сообщение), есть ли способ запланировать его по доступности в почтовом ящике потребителей?
Я использую огонь и забыл стиль ( consumer.tell()), так как мне не нужен ответ. Должен ли я использовать другой подход к отправке сообщений?
1 ответ
Просто укажите ограничение почтового ящика, и оно блокируется, если почтовый ящик заполнен. Я сам не пробовал, но ребята в этой теме смотрели на поведение, и оба обнаружили, что актер просто блокирует, как только почтовый ящик достигает предела.
Смотрите здесь для обсуждения и более тестирования этой природы. https://groups.google.com/forum/?fromgroups=
Из этой темы:
object ProducerConsumer extends App {
implicit val system = ActorSystem("ProducerConsumer")
def waitFor(actor: ActorRef) {
Await.ready(gracefulStop(actor, 5.seconds), 5.seconds)
}
val consumers = system.actorOf(Props[Consumer].
withRouter(RoundRobinRouter(4)).
withDispatcher("consumer-dispatcher"), "consumer")
for (work <- generateWork)
consumers ! work
consumers ! PoisonPill
waitFor(consumers)
system.shutdown
}
application.conf:
consumer-dispatcher {
type = BalancingDispatcher
mailbox-capacity = 100
}