当msg太多时,是否会创建新的actor实例?

时间:2016-01-30 09:35:56

标签: akka actor

我最近了解了akka,但有些想法我无法掌握。   我的问题是,如果队列中有太多消息,是否会创建一个新的演员?

在许多框架中,例如,一个http-requet消息即将到来,并且框架发现当前的“worker”正忙,因此框架将创建另一个“worker”来处理另一个线程中的新消息。

但似乎akka没有这样做,只有一个actor实例。

所以我认为“忙碌的演员”会把队列搞得一团糟,这会影响到整个演出,我是否正确?

2 个答案:

答案 0 :(得分:1)

<强> TL; DR:
如果您发送的消息速度超过了Actor可以处理的消息,那么最终您的应用程序将开始丢弃消息。

更长的回答:

据我了解,每个Akka Actor都有一个与之关联的Queue,它包含它收到的所有消息。

如果您向此Actor发送消息,比Actor更快地处理它们,最终队列将溢出,因为队列中的消息保留在ram中。

无法动态生成另一个Actor。由于队列中的消息按顺序处理。如果存在多个消费者,则该订购将被破坏。

我建议你看一下Akka Streams,这是一个建立在演员之上的更高级别的API,并通过在整个系统中提供背压来防止这种情况。这意味着如果您发送消息的actor比生成消息的人慢,则消费者会要求生产者减速,并且不会溢出您的Actor队列。

答案 1 :(得分:1)

每个Mailbox将其邮件存储在Mailbox中。 http://doc.akka.io/docs/akka/current/scala/mailboxes.html

默认邮箱是无限制且无阻塞的。如果你的演员不能足够快地处理消息,他们的邮箱就会大小膨胀并消耗越来越多的RAM。您可以将Akka配置为使用有限的阻止Router,这会在容量过大时阻止发件人。

如果您想动态管理演员池,请查看路由策略。 http://doc.akka.io/docs/akka/2.4.1/scala/routing.html

您可以创建一个Actor Router来接收消息并将其传递给routee演员。 Future还管理routee池,并可根据需要动态生成路由。

此外,如果使用for(int i=0;i<10;i++){ for(int j=0;j<0;j++){ } } 并回调异步执行,您的actor将不会阻止http请求。