Akka:参与者当前邮箱大小或等待处理的消息数

2023-11-21

我试图找出等待演员处理的待处理队列项目的数量。

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

这是代码示例:

class SomeActor extends Actor {
  override def receive = {

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

这样的方法存在于 Akka 1.x 中,但在 Akka 2.0 中被删除。罗兰·库恩写了一篇详细的博客文章(由此衍生出讨论在 Akka 用户列表上)解释了这一决定背后的理由。以下摘录概述了查询演员邮箱大小的一些问题:

  • 从并发队列中获取一定大小的答案需要 O(n) 时间,即当您感到最痛苦时查询会很痛苦(如果在“错误的时刻”有持久邮箱,甚至可能需要几秒钟)

  • 答案不正确,即在处理该请求的开始或结束时不需要匹配实际大小

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

  • 即使这样,当您在代码中收到它时,该数字可能已经完全改变(例如,您的线程被安排为 100 毫秒,并且在此期间您收到 100.000 条新消息)。

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

如果您离不开,可以很容易地编写自己的邮箱实现,基于 akka.dispatch 包中的特征并将簿记代码插入到 enqueue() 和 dequeue() 中。然后,您可以使用向下转换(邪恶)或在 akka.actor.Extension(推荐)中跟踪您的邮箱,以从您的 actor 中访问统计数据并执行任何必要的操作。

但是等等:我是否提到过,用时间戳标记延迟关键(但频率不太高)的消息并在处理消息时对消息的寿命做出反应可能会更容易?

因此,总而言之:虽然仍然有办法获取邮箱大小,但您可能永远不会真正需要它。

如果您希望演员邮箱大小用于监控目的,请查看光弯遥测 or Kamon。另外,帕特里克·诺德沃尔 (Patrik Nordwall) 写了一篇gist当邮箱大小超过配置的限制时记录它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Akka:参与者当前邮箱大小或等待处理的消息数 的相关文章

随机推荐