Akka演员之间的长时间延迟

时间:2015-10-21 19:17:47

标签: java concurrency parallel-processing akka actor

从第一个演员发送第二个演员的消息到第二个演员的{{1}实际上用消息调用了方法。我可以找到什么样的东西来调试这个问题?

详细

ActorA的每个实例都使用onReceive为ActorB发送一条消息。我在ActorA中调用ActorRef.tell(Object, ActorRef)方法后立即收集毫秒时间戳(System.currentTimeMillis()),并在ActorB' s tell的开头获取另一个时间戳。这些时间戳之间的间隔始终为60秒或更长。具体而言,当绘制时间间隔时,此间隔遵循粗锯齿图案,范围从60秒到近120秒,如下图所示。

enter image description here

这些演员是系统数据流的早期,在ActorB之后还有其他几个演员。这种巨大的差距只发生在这两个特定的参与者之间,其他相邻参与者之间的差距通常小于一毫秒,偶尔几十毫秒。此外,在任何给定演员中花费的实际时间不会超过一秒钟。

通常,系统中的每个actor只将一条消息传递给另一个actor。其中一个演员(在ActorB之后)向一些不同的演员发送一条消息,并且一小部分(少于0.1%)的时间,某些演员将向同一后续演员发送多条消息(即多个将要求后续演员的实例)。发生这种情况时,多条消息的数量通常在十几个或更少的数量级。

这可以通过Akka的正常反应特性(明确地)解释吗?它是否表明工作分配方式或演员配置方式存在问题?有什么东西可以明确地阻止特定的演员旋转吗?我应该收集或查看哪些其他信息以了解其来源,或了解它是否确实存在问题?

1 个答案:

答案 0 :(得分:1)

您的线程池有限。如果您的Actors阻塞,它们仍占用线程池中的空间。如果您的线程池已饱和,则不会创建新线程。

您可能想要配置 core-pool-size-factorcore-pool-size-min,和 core-pool-size-max

如果您希望阻止某些操作,可以将它们包装在Future { blocking { ... } }中并注册回调。但是使用异步,非阻塞调用会更好。

相关问题