Несколько систем akka на одном ПК

Как мы можем запустить несколько узлов 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.


person Abimaran Kugathasan    schedule 11.07.2013    source источник
comment
Если у каждой системной системы своя конфигурация с разными настройками, то должно работать   -  person 4lex1v    schedule 11.07.2013
comment
Для каждой системы субъектов на одном компьютере должен быть настроен уникальный порт.   -  person Patrik Nordwall    schedule 11.07.2013
comment
@PatrikNordwall: я так настроил, не работает, проверьте мой вопрос.   -  person Abimaran Kugathasan    schedule 11.07.2013
comment
Какую версию Акка вы используете?   -  person cmbaxter    schedule 11.07.2013
comment
@cmbaxter : akka-remote 2.0.2   -  person Abimaran Kugathasan    schedule 11.07.2013
comment
Вы уверены, что у вас правильный конфиг? Я просматриваю документы серии 2.0 для Akka Remoting, и конфигурация порта выглядит как akka.remote.netty.port. Если это свойство не установлено, по умолчанию оно будет равно 2552, и если оба ваших сервера делают это, то второй сервер не запустится. Дайте мне знать, если это сработает, и я опубликую в качестве ответа.   -  person cmbaxter    schedule 11.07.2013


Ответы (3)


Подход, который мы используем:

Создайте разные настройки в вашем 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)

Не забывайте, что имена систем должны отличаться

person 4lex1v    schedule 11.07.2013
comment
Я не мог понять вашу настройку, пожалуйста, уточните подробнее. - person Abimaran Kugathasan; 11.07.2013
comment
Это все настройки, необходимые для запуска новой ActorSystem. Какую версию Akka вы используете? - person 4lex1v; 11.07.2013

Если вы не хотите жестко кодировать информацию в свой application.conf, вы можете сделать это:

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

Затем используйте его как:

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))

Если вы используете 0 для порта, Akka назначит случайный номер порта этому ActorSystem.

person sourcedelica    schedule 11.07.2013
comment
Если вы не хотите жестко закодировать его в своей конфигурации, закодируйте его как код?! - person scravy; 09.12.2015
comment
Это просто пример. Значения могут прийти откуда угодно. Я сделал это более явным. - person sourcedelica; 10.12.2015

Проблема была в определении порта. Это должно быть похоже

remotelookup {
  include "common"

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

В противном случае akka возьмет порт по умолчанию.

person Abimaran Kugathasan    schedule 11.07.2013