Java Akka-ActorRef.tell()传递消息需要几分钟

Java Akka-ActorRef.tell()传递消息需要几分钟,java,concurrency,akka,Java,Concurrency,Akka,我有两个演员。每个参与者都位于不同的actor系统中。第一个缓存第二个ActorRef。第一个演员做: actorRef.tell(msg, self()) 并向第二个参与者发送消息,第二个参与者执行一些处理并使用 getSender().tell(reply, self()) 问题:从第一个参与者到第二个参与者的初始讲述()有时需要1-3分钟(!)才能传递消息 除此之外,在Akka中没有其他消息发送,这意味着邮箱是空的——系统正在为单个请求提供服务 系统详细信息: 应用程序有500个预定的

我有两个演员。每个参与者都位于不同的actor系统中。第一个缓存第二个ActorRef。第一个演员做:

actorRef.tell(msg, self())
并向第二个参与者发送消息,第二个参与者执行一些处理并使用

getSender().tell(reply, self())
问题:从第一个参与者到第二个参与者的初始讲述()有时需要1-3分钟(!)才能传递消息

除此之外,在Akka中没有其他消息发送,这意味着邮箱是空的——系统正在为单个请求提供服务

系统详细信息:

应用程序有500个预定的参与者,他们每30秒(阻塞)轮询AmazonSQS并发出请求(SQS为空)。还有330名演员在我的剧本中什么都不做。所有参与者都配置了默认的Akka调度程序


Box是Amazon EC2实例,具有2个内核和8gb RAM。CPU和RAM利用率从太多线程切换上下文可能是此问题的根源。要修复此问题,添加了以下配置:

actor {
default-dispatcher {
executor = "fork-join-executor"
fork-join-executor
{ parallelism-min = 8 parallelism-factor = 12.0 parallelism-max = 64 task-peeking-mode = "FIFO" }
}
}

因此,我们将每个物理核心的线程数从6个增加到24个。24就足够让我们的应用程序顺利运行了。在回归测试期间没有观察到饥饿现象。

我会使用像
YourKit
这样的探查器或更简单的工具来进行线程转储,并了解您有多少线程,以及它们是否都被阻塞。如果没有可用资源,您的参与者将无法发送消息。另外,我不确定您的用例,但我建议您使用一种不需要阻塞线程的解决方案。