如何在 Akka 集群中指定节点级别的角色?
How to specify role at node level within Akka cluster?
鉴于以下 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个配置文件?
例如,application.conf for testrole1
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"
}
}
application.conf 测试角色 2 :
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
参数确定每个节点的角色,这是可行的解决方案吗?
如果您要为不同的节点分配不同的角色,这些节点不能使用相同的配置。实现此目的的最简单方法是通过 n1 在其 akka.cluster.roles
列表中包含 "testRole1"
,而 n2 在其 akka.cluster.roles
列表中包含 "testRole2"
。
akka.cluster
配置中的所有内容仅配置该节点以参与集群(它在该节点上配置集群组件)。一些设置必须在集群的节点之间保持相同(例如 SBR 设置),但 n1 上的设置不会影响 n2 上的设置。
鉴于以下 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个配置文件?
例如,application.conf for testrole1
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"
}
}
application.conf 测试角色 2 :
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
参数确定每个节点的角色,这是可行的解决方案吗?
如果您要为不同的节点分配不同的角色,这些节点不能使用相同的配置。实现此目的的最简单方法是通过 n1 在其 akka.cluster.roles
列表中包含 "testRole1"
,而 n2 在其 akka.cluster.roles
列表中包含 "testRole2"
。
akka.cluster
配置中的所有内容仅配置该节点以参与集群(它在该节点上配置集群组件)。一些设置必须在集群的节点之间保持相同(例如 SBR 设置),但 n1 上的设置不会影响 n2 上的设置。