Akka演员阻止消息

时间:2014-10-07 19:04:52

标签: java concurrency akka actor

您好,因为我无法正确解决问题,这可能不是我问题的正确标题,但情况属实;

演员A创建演员B1,演员B1创建" n"负责执行任务的演员。 所以A是B1的父级,B1是父级,比如b1,b2,b3,......

在A中我安排了一个自动收报机,这样如果有新的B'创造。

Duration duration = Duration.create(10 sec.);
FiniteDuration interval = new FiniteDuration(duration.toMillis(), TimeUnit.MILLISECONDS);
ticker = getContext().system().scheduler().schedule(interval, interval, getSelf(), new Tick() { }, getContext().dispatcher(), getSelf());

在前端,我可以调整" b"的平行度数。任务。 例如,如果我将并行度设置为3,则B(1)创建3个actor,每个actor执行一些任务 如果一个演员,让我们说b(n),则完成而不是b(n + 1),等等。

问题是;

如果只有一个演员b(i = 1)是由演员" B'" (哪个B不重要)比股票真正滴答作响 每隔10秒钟,但是如果我将b的平行度增加到64 b(i = 64),那么代码就不会表现得很好。 等待相当长的时间,例如1分钟。然后连续6次打勾,好像有一个冲洗机制。

当我增加系统中的演员数量时,这不是我遇到的唯一问题。

我有一个api,以便用户向下面的演员发送订单

String path = ActorPaths.actorPathForPlan(plan);
ActorSelection actorSelection = runtimeInit.getSystem().actorSelection(path);
// ask
Timeout timeout = new Timeout(Duration.create(4*1000, TimeUnit.MILLISECONDS));
Future<Object> future = Patterns.ask(actorSelection, message, timeout);
// get result
return returnType.cast(Await.result(future, timeout.duration()));

当超过大约10个演员时,期货总是超时,但是当我调试代码时,我看到了消息 很久以后就被收回了。

所以,我想知道是什么阻止了我的Actor A接收消息。演员B&#39;可能会出现同样的问题。和它的孩子们 我还没有检查过,但如果我发现问题我相信我可以将解决方案应用于其他人。

感谢您的任何建议。

层次结构就像这样

http://i.stack.imgur.com/PRmwE.png

1 个答案:

答案 0 :(得分:3)

默认情况下,所有Akka actor都使用相同的执行器,限制为最多使用64个线程。来自http://doc.akka.io/docs/akka/snapshot/general/configuration.html

# This will be used if you have set "executor = "default-executor"".
      # If an ActorSystem is created with a given ExecutionContext, this
      # ExecutionContext will be used as the default executor for all
      # dispatchers in the ActorSystem configured with
      # executor = "default-executor". Note that "default-executor"
      # is the default value for executor, and therefore used if not
      # specified otherwise. If no ExecutionContext is given,
      # the executor configured in "fallback" will be used.
      default-executor {
        fallback = "fork-join-executor"
      }

      # This will be used if you have set "executor = "fork-join-executor""
      fork-join-executor {
        # Min number of threads to cap factor-based parallelism number to
        parallelism-min = 8

        # The parallelism factor is used to determine thread pool size using the
        # following formula: ceil(available processors * factor). Resulting size
        # is then bounded by the parallelism-min and parallelism-max values.
        parallelism-factor = 3.0

        # Max number of threads to cap factor-based parallelism number to
        parallelism-max = 64
      }

问题可能与阻止b * actor中的调用有关。 Akka从64个池中分配单独的线程来处理b * actors中的这些阻塞调用,并等待其中一个完成消息处理,以便能够处理A和B的消息。

请参阅http://doc.akka.io/docs/akka/snapshot/general/actor-systems.html中的“阻止需要谨慎管理”,了解如何解决此问题。