如何在Akka集群中指定节点级别的角色?

b1uwtaje  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(195)

给定以下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
}
}

从源文件编辑(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级别指定详细信息?
对于每个节点,是否需要指定多个应用程序.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应用程序会议:

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"
  }
}

上面定义的每个应用程序.conf之间的区别在于akka.cluster.roles的值是“testrole1"”还是“"testrole2"”。
如何配置application.conf,以便指示Akka群集在节点n1上启动执行元a1,在节点n2上启动执行元a2?是否应在application.conf中的akka.cluster级别指定节点详细信息?
更新:
另一种选择是通过环境变量传递rolename,我刚刚注意到这里明确地说明了这一点: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参数确定每个节点的角色,这是一个可行的解决方案吗?

xzlaal3s

xzlaal3s1#

如果要给不同的节点分配不同的角色,这些节点不能使用相同的配置,最简单的方法是让n1的akka.cluster.roles列表中包含"testRole1",让n2的akka.cluster.roles列表中包含"testRole2"
akka.cluster config中的所有内容都只是配置该节点以加入集群(它是在该节点上配置集群组件)。集群节点之间的一些设置必须相同(例如SBR设置),但n1上的设置不会影响n2上的设置。

相关问题