【问题标题】:akka non-blocking BoundedMailboxakka 非阻塞 BoundedMailbox
【发布时间】:2013-08-13 17:46:34
【问题描述】:

我正在尝试找到一种非阻塞方式来使用带有 BoundedMailbox 的 akka Actor。当演员的邮箱已满时,它应该丢弃消息。我可以通过将 pushTimeOut 设置为 0 来实现吗?这种方法有什么缺点或需要注意的地方吗?

【问题讨论】:

  • 丢弃新收到的消息还是丢弃旧消息?
  • 丢弃新收到的消息
  • 将 pushTimeout 设置为 0 肯定会让您在使用有界邮箱时等待时间较短,但它不会是非阻塞的。有界邮箱使用 LinkedBlockingQueue 作为其队列实现。当它将消息放入队列时,它使用offer 将 pushTimeout 作为输入。即使它为 0,您仍然会产生获取添加项目所需的锁的开销,因此它不是非阻塞解决方案
  • @cmbaxter,谢谢你的回答。那么,演员使用有界非阻塞邮箱的最佳方式是什么?
  • 我认为您不能将有界邮箱与非阻塞相结合。为了正确(线程安全)有界,需要同步。我认为,如果有可能有一个好的有界且非阻塞的 impl,那么 akka 家伙就会制作一个。我想你需要决定哪个对你更重要;有一个有界邮箱或有一个非常高吞吐量的邮箱,因为我相信这两个概念有些排他性。您可能想阅读这篇文章,看看是否有另一种方法可以解决:letitcrash.com/post/28901663062/throttling-messages-in-akka-2

标签: scala akka


【解决方案1】:

是的,如果您将 pushTimeOut 设置为 0,如果邮箱已满,新邮件将被丢弃。丢弃的消息将被发送到特殊的dead letters actor

【讨论】: