1

我有这个有趣的问题,我无法确定问题。

我有这个“简单”的 akka 应用程序。它的主要目标是检查数据库中的每个文档。我的主要参与者向与数据库通信的单个参与者请求行。检索到的每个文档都返回给我的主要参与者。分批将这些文档添加到由平衡调度程序管理的消息队列中。小工人会检查它们并对其进行分类。

几个小时后,通常在 2 到 4 小时之间,所有演员同时停止,最多间隔 5 秒。

我想知道你们中是否有人见过类似的东西。

有关信息:

  • 我使用 AkkA 2.2.0
  • 不使用询问消息,只告诉
  • 我不使用任何线程锁定方法,例如 Await
  • DeadLetters 是我知道一切都会关闭的原因

谢谢您的帮助


从 DeadLetters 看来,只有与我的平衡调度程序/我的循环路由器相关的演员才会停止。我会错过什么吗?

我的斯卡拉

val workers: ActorRef = context.system.actorOf(
  Props(new WorkerActor)
    .withRouter(FromConfig())
    .withDispatcher("balancing-dispatcher"),
  "round-robin"
)

我的配置代码

balancing-dispatcher {
  type = BalancingDispatcher
  executor = "fork-join-executor"
}

akka.actor.deployment {
  /round-robin {
    router = round-robin
    nr-of-instances = 50
    resizer {
      lower-bound = 10
      upper-bound = 100
    }
  }
}
4

1 回答 1

1

我会首先使用诸如 jconsole 或 jvisualvm 之类的分析工具来检查内存、GC 和/或 fork+join 问题。你有足够的堆分配吗?还要记录线程数和线程状态(出现减速时是否有线程被分叉或加入?)

可能是您需要在 Akka 的线程池中配置更多线程。或者您已达到 100 个实例的上限并且它们都处于忙碌状态。您可以对 DefaultResizer 实现进行子类化,以提供对调整大小活动的显式通知/日志记录,并将您的子类配置为调整大小。

于 2013-09-05T15:48:33.970 回答