【问题标题】:Akka actors are getting stoppedAkka 演员正在停止
【发布时间】:2019-01-01 20:51:23
【问题描述】:

我正在使用 akka actor 来实现一些 http 请求的并行处理。我已经使用RoundRobinPool 初始化了一组演员,例如:

ActorRef myActorPool = actorSystem.actorOf(new RoundRobinPool(200).props(Props.create(MyActor.class, args)), MyActor.class.getSimpleName());

它工作正常。但是在进程运行一段时间后,我收到以下错误

java.util.concurrent.CompletionException: akka.pattern.AskTimeoutException: Recipient[Actor[akka://web_server/user/MyActor#-769383443]] 已经被终止。 Sender[null] 发送了“com.data.model.Request”类型的消息。

所以我重写了postStop 方法,在那里添加了一条日志语句。

@Override
public void postStop() {
    log.warn("Actor is stopped");
}

现在,我可以在日志中看到演员正在停止。但我不确定它是针对哪个请求发生的。一旦池中的所有参与者都终止(200 是我设置的池大小),我会得到AskTimeoutException,如前所述。无论如何要调试演员被终止的原因吗?

编辑 1

在控制器中,我使用创建的演员池,如

CompletableFuture<Object> s = ask(myActorPool, request, 1000000000).toCompletableFuture();
return s.join();

actor 只处理一种消息。

@Override
public AbstractActor.Receive createReceive() {
    return receiveBuilder()
            .match(Request.class, this::process)
            .build();
}

private void process(Request request) {
    try {
        // code here
    } catch (Exception e) {
        log.error(e.getMessage(), e);
        getSender().tell(new akka.actor.Status.Failure(e), getSelf());
    }
}

【问题讨论】:

  • 如果您可以添加有用的代码片段。
  • 这就是你创建演员的方式。您实际上是如何使用演员的?
  • 查看代码似乎只有在出现异常时(在 catch 块中)才向发送者发送响应。您还需要在try 块中发送响应。
  • 我没有在try 块中添加代码,但它实际上向发件人发送了响应。
  • 我不知道它是否与此问题有关,但您正在阻止 s.join() 上的线程。根据您的项目设置/框架,您可能会用完可用线程,因此整个应用程序可能会运行缓慢,从而导致超时。

标签: java scala akka actor timeoutexception


【解决方案1】:

就您所描述的问题而言,您似乎是在 ask 调用中处理您的数据,并且花费的时间比 askTimeout 多,并且您遇到了错误。

您可以做的是增加 askTimeout 或在 ask 调用中减少处理。

您不应该在 ask 调用中执行 CPU 绑定操作,这会导致系统变慢。建议您应该在 ask 调用中执行 I/O 绑定操作。这样你就可以利用演员。

例如:

val x=x+1   // CPU bound operation should not do inside the ask call

您可以在更可取的 ask 调用中进行一些 db 调用。

【讨论】:

  • 我已经编辑了我的答案。默认超时非常高(1000000000)。即使我在 10-20 秒内得到响应,但我可以在日志中看到演员正在停止。
  • 据我所知,默认询问超时为 10 秒,而且您的响应速度非常慢,因为 10 到 20 秒对于后端处理来说太长了。
  • 但是我在 ask 调用中提到的超时时间远大于 10 秒,对。而且我在该方法中所做的操作也不受 CPU 限制。大多数操作只是与数据库相关的查询。
  • 你在更新一些可变变量吗?里面问?
猜你喜欢
  • 2015-05-06
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2020-08-20
  • 1970-01-01
  • 2017-03-18
  • 2014-07-11
相关资源
最近更新 更多