4

我们如何在一台 PC 上运行多个 akka 节点?目前,我在我的application.conf文件中关注。对于每个系统,我添加了不同的端口号,但是,我不能启动多个实例。错误说,Address already in use failed to bind

application.conf文件

remotelookup {
  include "common"

  akka {
    remote.server.port = 2500
    cluster.nodename = "n1"
  }
}

更新:多个 akka 节点意味着,我有不同的独立服务器应用程序,它将使用 akka 与远程主节点通信。

4

3 回答 3

12

我们使用的方法是:

application.conf在您的每个系统中创建不同的设置:

systemOne {
  akka {
    remote {
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        hostname = ${public-hostname}
        port = 2552
      }
    }
  }
}

systemTwo {
  akka {
    remote {
      enabled-transports = ["akka.remote.netty.tcp"]
      netty.tcp {
        hostname = ${public-hostname}
        port = 2553
      }
    }
  }
}

Application.conf是默认配置文件,因此在您的设置模块中为您的系统添加配置:

object Configs {
  private val root = ConfigFactory.load()
  val one          = root.getConfig("systemOne")
  val two          = root.getConfig("systemTwo")
}

然后使用以下配置创建系统:

val one = ActorSystem("SystemName", one)
val two = ActorSystem("AnotherSystemName", two)

不要忘记系统名称必须不同

于 2013-07-11T08:09:26.180 回答
2

If you don't want to hardcode the info into your application.conf, you can do this:

def remoteConfig(hostname: String, port: Int, commonConfig: Config): Config = {
  val configStr = s"""
   |akka.remote.netty.hostname = $hostname
   |akka.remote.netty.port = $port
  """.stripMargin

  ConfigFactory.parseString(configStr).withFallback(commonConfig)
}

Then use it like:

val appConfig = ConfigFactory.load
val sys1 = ActorSystem("sys1", remoteConfig(args(0), args(1).toInt, appConfig))
val sys2 = ActorSystem("sys2", remoteConfig(args(0), args(2).toInt, appConfig))

If you use 0 for the port Akka will assign a random port # to that ActorSystem.

于 2013-07-11T18:24:29.937 回答
1

问题出在端口定义中。它应该像

remotelookup {
  include "common"

  akka {
    remote.netty.port = 2500
    cluster.nodename = "n1"
  }
}

否则,akka 将采用默认端口。

于 2013-07-11T14:24:13.463 回答