【发布时间】: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