【问题标题】:how to properly set AKKA number of routee via configuration file如何通过配置文件正确设置 Akka 数量的 routee
【发布时间】:2018-06-17 03:58:01
【问题描述】:

我目前正在学习 AKKA,但在控制路由数量方面存在问题。我正在尝试使用集群感知路由器作为接待员来实现一个集群,其中简单的参与者作为 routee,所有这些都在我的本地运行以进行开发。假设我有一个 如下配置

deployment {
  /RouterA {
    router = round-robin-pool
    metrics-selector = mix
    nr-of-instances = 20
    routees.paths = ["/user/ActorA"]
    cluster {
      enabled = on
      max-nr-of-instances-per-node = 20
      allow-local-routees = on
    }
  }
}

然后我可以在调试日志中看到 20 个路由器

我将 RouterA 注册为集群接待员,如下所示

ActorRef someactor=system.actorOf(Props.create(Something.class),"ActorA");
ActorRef routerA=system.actorOf(FromConfig.getInstance().props(),"RouterA");
ClusterClientReceptionist.get(system).registerService(routerA);

Q1:我是否将特定路由器实例注册为接待员?还是其中的 20 个?是否可以/建议将 a/20 路由器注册为接待员?

Q2:为什么我看到 20 个路由器都使用同一个 ActorA(通过 this.hashCode() )实例?配置路由器(通过文件)的正确方法是什么,以便它将消息发送到 20 个路由之一,无论本地还是远程?还是我对创建 20 个路由的方式有误? (需要20个routee来平衡负载)

Q3 : 如果我使用以下配置,调试日志中似乎只有 1 个路由器,为什么?是因为最佳尺寸探索调整器吗?所以它丢弃 nr-of-instances = 20 ?如果是这样,我如何让路由器加速?

deployment {
  /RouterA {
    router = cluster-metrics-adaptive-group
    metrics-selector = mix
    nr-of-instances = 20
    routees.paths = ["/user/ActorA"]
    cluster {
      enabled = on
      max-nr-of-instances-per-node = 20
      allow-local-routees = on
    }
    optimal-size-exploring-resizer {
          enabled = on
          action-interval = 5s
          lower-bound = 10
          upper-bound = 50
          downsize-after-underutilized-for = 72h
    }
  }
}

谢谢

【问题讨论】:

    标签: akka akka-cluster


    【解决方案1】:

    首先需要给你一些概念,看来你理解错了。

    nr-of-instances = 20max-total-nr-of-instances = 20相同,见以下解释:

    总共将部署的最大路由数 在所有节点上。另请参阅 max-nr-of-instances-per-node 的描述。 出于向后兼容性的原因,nr-of-instances 与集群的 max-total-nr-of-instances 具有相同的目的 感知路由器和 nr-of-instances(如果由用户定义)需要 优先于 max-total-nr-of-instances。

    这意味着在你的集群中,你的路由器最多只会新的20 routees。但是它会新增多少个路由取决于其他 2 个参数:

    1)max-nr-of-instances-per-node = 20,解释如下:

    将在每个集群上部署的最大路由数 成员节点。 注意 max-total-nr-of-instances 定义了路由的总数,但是 不会超过每个节点的路由数量,即如果您 定义 max-total-nr-of-instances = 50 和 max-nr-of-instances-per-node = 2 它将为集群中的每个新成员部署 2 个路由,最多 25 名成员。

    2) 你拥有的集群成员的数量。

    这里,你的情况是:

    nr-of-cluster-node = 1

    max-nr-of-instances-per-node = 20

    所以总路由是nr-of-cluster-node * max-nr-of-instances-per-node = 20,即使你设置nr-of-instances = 100,路由仍然是20,因为没有足够的节点来托管你的路由。

    所以正确的代码如下:

    ActorRef routerA = system.actorOf(FromConfig.getInstance().props(Props.create(ActorA.class)), "routerA");
    ClusterClientReceptionist.get(system).registerService(routerA);
    

    上面的代码会为你创建一个router actor,并使用ActorA instance作为你的路由。然后,对于您的场景,将生成 20 个actor,当您向接待员发送消息时,消息将被发送到路由器,路由器将选择一个路由来处理消息(取决于路由器类型)。

    接下来解释你的问题:

    第一季度:

    使用代码,不是你想象的那样,它不会设置20个路由器,它只会为你设置一个路由器,详细见上面的解释。因此,接待员只注册了一台路由器。

    第二季度:

    我不认为你可以看到 20 个路由器,同时,我认为你也看不到 20 个路由。使用您的代码ActorRef someactor=system.actorOf(Props.create(Something.class), "ActorA");,您可以看到只创建了一个演员,而这不是由router actor 创建的。只有一个演员实例,您肯定会看到相同的演员哈希码。你的application.conf是对的,只是你的理解错了,你的代码错了。

    第三季度:

    同样,不是一台路由器,您看到的是一台路由器。这是因为使用代码ActorRef someactor=system.actorOf(Props.create(Something.class), "ActorA");,您已经自己创建了一个路由。

    而使用router = cluster-metrics-adaptive-group,这意味着router不会为你创建routee,它会使用已存在的routee,你只需将其设置为routees.paths = ["/user/ActorA"],这里你只需设置一个routee actor。

    【讨论】:

      猜你喜欢
      • 2015-01-24
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多