Akka:演员当前邮箱大小或等待处理的邮件数

时间:2017-12-01 21:17:41

标签: scala akka

我试图找出等待由actor处理的待处理队列项的数量。

我确信必须有一个方法可以从actor上下文或context.system.mailboxes等引用

以下是代码示例:

class SomeActor extends Actor {
  override def receive = {

    case ScanExisting => {
      val queueSize = context.system.mailboxes... size ??
}

1 个答案:

答案 0 :(得分:9)

这种方法存在于Akka 1.x中,但在Akka 2.0中被删除。 Roland Kuhn写了一篇详细的blog post(摘自Akka用户名单上的discussion),解释了这一决定背后的理由。这是一段摘录,概述了查询演员邮箱大小的一些问题:

  
      
  • 从并发队列中获取一些大小的答案需要花费O(n)时间,即当你感觉到最痛苦时查询伤害(如果耐用邮箱在“错误”的情况下甚至可能需要几秒钟时刻”)

  •   
  • 答案不正确,即在处理此请求的开头或结尾处不需要匹配实际尺寸

  •   
  • 使其“更正确”涉及严重限制可扩展性的簿记

  •   
  • 即使这样,当您在代码中收到该号码时,该号码可能已经完全改变了(例如,您的线程计划为100毫秒,在此期间您将获得100.000条新消息)。

  •   

阅读整篇文章,然后重新考虑获取演员邮箱大小的原因。如果你还想要它:

  

如果您不能没有,可以很容易地编写自己的邮箱实现,基于akka.dispatch包中的特征并将记录代码插入enqueue()和dequeue()。然后你可以使用向下转换(邪恶)或在akka.actor.Extension(推荐)中跟踪你的邮箱,以便从你的演员中访问统计数据并做任何必要的事情。

     

但等等:我是否提到用时间戳标记延迟关键(但不是太高频率)的消息甚至更容易,并在处理时对消息的年龄作出反应?

     

因此,总结一下:虽然仍有办法获取邮箱大小,但您可能永远不需要它。

如果您希望将演员邮箱大小用于监控目的,请查看Lightbend TelemetryKamon。此外,Patrik Nordwall写了一个gist,当邮箱超过配置的限制时会记录邮箱大小。