【问题标题】:How to specify role at node level within Akka cluster?如何在 Akka 集群中指定节点级别的角色?
【发布时间】:2021-06-07 06:54:47
【问题描述】:

鉴于以下 appliction.conf :

akka {
  loglevel = debug
  actor {
    provider = cluster

    serialization-bindings {
      "sample.cluster.CborSerializable" = jackson-cbor
    }
  }
  remote {
    artery {
      canonical.hostname = "127.0.0.1"
      canonical.port = 0
    }
  }
  cluster {
roles= ["testrole1" , "testrole2"]
    seed-nodes = [
      "akka://ClusterSystem@127.0.0.1:25251",
      "akka://ClusterSystem@127.0.0.1:25252"]
    downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
  }
}

要区分我使用的 Actor 中的角色:

void register(Member member) {

if (member.hasRole("testrole1")) {
 //start actor a1
}
else if (member.hasRole("testrole2")) {
 //start actor a2
}
}

编辑自 src (https://doc.akka.io/docs/akka/current/cluster-usage.html)

要为节点启用角色,我使用以下配置:

在 application.conf 中,我为角色配置了数组,但这似乎是在集群级别而不是节点级别。换句话说,似乎不可能配置 application.conf 以指示 Akka 集群在节点 n1 上启动 actor a1 并在节点 n2 上启动 actor a2?是否应在 application.conf 中的 akka.cluster 级别指定注意细节?

对于每个节点,是否需要指定多个application.conf配置文件?

例如,testrole1 的 application.conf

akka {
  loglevel = debug
  actor {
    provider = cluster

    serialization-bindings {
      "sample.cluster.CborSerializable" = jackson-cbor
    }
  }
  remote {
    artery {
      canonical.hostname = "127.0.0.1"
      canonical.port = 0
    }
  }
  cluster {
roles= ["testrole1"]
    seed-nodes = [
      "akka://ClusterSystem@127.0.0.1:25251",
      "akka://ClusterSystem@127.0.0.1:25252"]
    downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
  }
}

testrole2 的 application.conf :

akka {
  loglevel = debug
  actor {
    provider = cluster

    serialization-bindings {
      "sample.cluster.CborSerializable" = jackson-cbor
    }
  }
  remote {
    artery {
      canonical.hostname = "127.0.0.1"
      canonical.port = 0
    }
  }
  cluster {
roles= ["testrole2"]
    seed-nodes = [
      "akka://ClusterSystem@127.0.0.1:25251",
      "akka://ClusterSystem@127.0.0.1:25252"]
    downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
  }
}

上面定义的每个application.conf之间的区别在于akka.cluster.roles的值要么是“testrole1"”要么是"testrole2"。

应如何配置 application.conf 以便指示 Akka 集群在节点 n1 上启动 actor a1 并在节点 n2 上启动 actor a2?节点详细信息是否应该在 application.conf 中的 akka.cluster 级别指定?

更新:

另一种选择是通过环境变量传递角色名称?我刚刚注意到这里明确说明了这一点:https://doc.akka.io/docs/akka/current/typed/cluster.html“节点角色在名为 akka.cluster.roles 的配置属性中定义,通常在启动脚本中定义为系统属性或环境变量。”在这种情况下,对所有节点使用相同的 application.conf 文件,但每个节点都使用一个环境变量。例如,更新的 appliction.conf(注意添加“ENV_VARIABLE”)

akka {
  loglevel = debug
  actor {
    provider = cluster

    serialization-bindings {
      "sample.cluster.CborSerializable" = jackson-cbor
    }
  }
  remote {
    artery {
      canonical.hostname = "127.0.0.1"
      canonical.port = 0
    }
  }
  cluster {
roles= ["ENV_VARIABLE"]
    seed-nodes = [
      "akka://ClusterSystem@127.0.0.1:25251",
      "akka://ClusterSystem@127.0.0.1:25252"]
    downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
  }
}

集群启动脚本通过ENV_VARIABLE参数确定每个节点的角色,这是一个可行的解决方案吗?

【问题讨论】:

    标签: java scala kubernetes akka akka-supervision


    【解决方案1】:

    如果您要为不同的节点分配不同的角色,这些节点不能使用相同的配置。实现此目的的最简单方法是通过 n1 在其 akka.cluster.roles 列表中包含 "testRole1" 和 n2 在其 akka.cluster.roles 列表中包含 "testRole2"。

    akka.cluster 配置中的所有内容都只是配置该节点以参与集群(它正在配置该节点上的集群组件)。集群节点间的一些设置必须相同(例如 SBR 设置),但 n1 上的设置不会影响 n2 上的设置。

    【讨论】:

    • 谢谢,从您的回答中,您是否建议使用多个 application.conf 配置文件?请查看问题更新。
    • 环境变量是使用相同的application.conf 文件解析为不同配置的一种方法(包含是另一种技术)。您应该检查 HOCON 文档以了解完成此操作的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2020-11-26
    • 2014-08-22
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多