我最近了解了akka,但有些想法我无法掌握。 我的问题是,如果队列中有太多消息,是否会创建一个新的演员?
在许多框架中,例如,一个http-requet消息即将到来,并且框架发现当前的“worker”正忙,因此框架将创建另一个“worker”来处理另一个线程中的新消息。
但似乎akka没有这样做,只有一个actor实例。
所以我认为“忙碌的演员”会把队列搞得一团糟,这会影响到整个演出,我是否正确?
答案 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请求。