当前位置: 首页 > 知识库问答 >
问题:

Akka演员之间的长时间延迟

寇夜洛
2023-03-14

我经常看到两个参与者之间有很长的延迟(60+秒),从第一个参与者发送消息到第二个参与者,以及第二个参与者的onreceive方法随消息实际调用时。我可以寻找哪些类型的东西来调试这个问题?

ActorA的每个实例都使用ActorRef.tell(Object,ActorRef)为ActorB发送一条消息。在ActorA中调用tell方法并在ActorB的onReceive(Object)开始处获得另一个时间戳之后,我立即收集了一个毫秒时间戳(使用System.CurrentTimeMillis())。这些时间戳之间的间隔一致为60秒或更长。具体地说,当按时间绘制时,该间隔遵循从60秒到几乎120秒的粗糙锯齿模式,如下图所示。

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

通常,系统中的每个actor只向另一个actor传递单个消息。其中一个参与者(在ActorB之后)向几个不同的参与者中的每一个发送单个消息,并且在一个很小的百分比(小于0.1%)的时间中,某些参与者将向相同的后续参与者发送多个消息(即,将要求后续参与者的多个实例)。当发生这种情况时,多个消息的数量通常为十几个或更少。

这能解释(明确地)由正常的反应性质的Akka吗?它是否表明工作的分发方式或参与者的配置方式存在问题?有什么东西可以明确地阻止一个特定的行动者旋转吗?我还应该收集或查看哪些其他信息来了解这个问题的来源,或者了解它是否是一个问题?

共有1个答案

冀永寿
2023-03-14

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

您可能希望配置core-pool-size-factorcore-pool-size-mincore-pool-size-max

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

 类似资料:
  • 我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?

  • [04/27/2014 18:09:05.518][ReadScheduler-Akka.actor.Default-Dispatcher-3][Akka://ReadScheduler/User/Collector]从参与者[Akka://ReadScheduler/User/Executor#2127791644]到参与者[Akka://ReadScheduler/User/Collector

  • 我从这里得到上面的错误消息: 特别是从第二行。。进口是 akka版本是2.2.1,scala是2.10.2,我正在使用sbt 0.13来构建它。 编辑:我用 结果如下:

  • 我很难理解Akka中的演员,以及一个线索如何与一个演员相关联。 让我们以Fridge Actor和Person Actor向Fridge Actor引用发送GetFoodMessage为例。假设不变性受到尊重。 这些消息是在不同的线程中“同时”处理,还是在队列中一个接一个地处理? 线程产卵是否完全由库管理并从actor的概念中抽象出来? 参与者引用是参与者的实例吗? 当我阻止一个演员(和他的孩子)

  • 我们有一个应用程序接口实现在裸骨Scala Akka HTTP中--一对路由前面的大量计算(CPU和内存密集)。没有集群-所有运行在一个强壮的机器上。计算量相当大--一个独立请求可能需要60多秒才能完成。我们并不那么在意速度。没有阻塞IO,只是大量的CPU处理。 当我开始对它进行性能测试时,出现了一个有趣的模式:假设请求A1、A2、...、A10通过。它们会大量使用资源,结果Akka会为溢出的请求

  • java.util.concurrent.CompletionException:Akka.Pattern.AskTimeoutException:收件人[Actor[akka:/web_server/user/MyActor#-769383443]]已终止。发送者[null]发送了类型为“com.data.model.request”的消息。 所以我重写了方法,在那里添加了一个log语句。 现在