如何在运行时定义种子节点

时间:2017-06-19 07:45:25

标签: scala akka akka-cluster

我有一个带有application.conf的akka​​集群,如下所示:

class Posts extends Component {
  state = { posts: [] };

  componentDidMount() {
    fetch(url).then(res => this.setState({ posts: res.json().posts });
  }

  render() {
    return ... 
  }
}

现在,种子节点是硬编码的。我想在这里配置一个参数:

 remote { // Remote configuration for this seed node
  enabled-transports = ["akka.remote.netty.tcp"]
  netty.tcp {
    hostname = ""
    port = 2555
  }
}
cluster {
  seed-nodes = [
    "akka.tcp://automation-akka-http@10.0.0.4:2555",
    "akka.tcp://automation-akka-http@10.0.0.5:2555"
  ] // Seed nodes of the cluster
  auto-down-unreachable-after = 10s
}

我知道我可以在sbt命令中定义这些参数以进行编译。但这无法解决我的问题,因为我只能在部署阶段拥有种子节点的IP。有没有办法在开始时定义这些参数。

1 个答案:

答案 0 :(得分:1)

Akka Cluster Documentation

中所述

您可以使用Cluster(system).joinSeedNodes以编程方式加入种子节点。

根据Akka API docs,它需要akka.actor.Address的序列,然后它将是您的种子节点地址。

所以这样的事情应该有效:

val seeds = Seq(Address("akka.tcp", "RemoteSystem1", "host1", 1234),
                Address("akka.tcp", "RemoteSystem2", "host2", 1234)

Cluster(system).joinSeedNodes(seeds)

根据Address API docs

的地方
  • “akka.tcp”= protocol
  • “RemoteSystem1”=远程演员系统的名称
  • “host1”=远程演员系统的主持人
  • 1234 =远程演员系统的端口

修改

GitHub

上创建了一个最小示例
val cluster = Cluster(context.system)

// Join the seed node with the given address
seedPort match {
  case Some(port) =>
    cluster.joinSeedNodes(immutable.Seq(Address("akka.tcp", "ClusterSystem", "127.0.0.1", port)))
  case _ =>
}

可以使用sbt“运行akkaPort [clusterPort]”运行。因此,最初使用两个相同的端口启动集群运行:

sbt "run 1337 1337"

然后使用不同的akka​​Port运行另一个节点:

sbt "run 1338 1337"

此节点将加入。

如果省略clusterPort参数,它将不会执行此行:

cluster.joinSeedNodes(immutable.Seq(Address("akka.tcp", "ClusterSystem", "127.0.0.1", port))) 

因此只使用application.conf文件中的种子节点。