我正在尝试了解何时何地使用不同的built-in Akka mailboxes以及何时适合推广自己的{{3}}。但是,该页面上没有任何地方可以解释“有界邮箱”实际上是什么,或者它与无界邮箱的行为方式不同。此外,该页面将邮箱归类为“阻止”与“非阻止”。虽然我对它的含义有很强的了解(除非邮箱首先被清空,否则可以将邮件发送到邮箱)我不是百分之百确定我理解这一点。因此,当他们将邮箱归类为有界或阻塞时,我不知道文档是什么意思,我很难告诉我何时应该使用每种类型。
此外,如果重新启动该actor,似乎是清除演员邮箱的默认Akka行为。我想阻止这种情况,但不确定解决方案是使用这些内置邮箱类型之一(本页未提及消息持久性)或以某种方式使用持久性actor来实现此类无损。
答案 0 :(得分:7)
首先,如果演员崩溃并重新启动,您只会丢失当前正在处理的消息,而不是整个邮箱。
有限邮箱在开始阻止发件人之前可以对其排队的邮件数量进行限制,如果在发件人尝试放置项目时队列没有停止,则不允许该邮件。如果您对内存有疑虑并且可以处理潜在的消息丢失,那么您可能需要这样的东西。无界邮箱对容量没有限制,因此如果它被淹没,可能会遇到内存问题。
它是否受限将影响它是否阻止。阻止通常不是很好的性能,如果情况不需要有限的邮箱应该避免。这就是默认邮箱无限制的原因;它会产生比有界对手更好的表现。
单个消费者无界邮箱很可能是最快的,因为它被优化为只有一个消费者从队列中取出东西。这意味着您不能使用允许actor实例从其他actor实例邮箱中窃取项目的调度程序(工作分发/窃取),但如果您不关心它,那么此邮箱可能是性能的最佳选择。
基于优先级的邮箱允许您提供允许队列中的放置根据消息本身的某些属性而变化的代码。这允许您自己定义消息的优先级,然后无论正常的FIFO规则如何,这都会将更高优先级的项目移到队列的前面。