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