Сканирование актеров Akka

У меня есть узел, на котором может быть запущено несколько экземпляров сервера (удаленный актер Akka). Я хотел бы, чтобы клиенты могли сканировать диапазон портов на заданном узле в поисках работающих серверов.

Я написал этот метод в своем клиентском актере:

  private def scanHost(serverHost: String) = {
    val initialPort = 36627
    val portsToScan = (initialPort until initialPort + 32).toList
    val tries = portsToScan map {
      port  ⇒ remote.actorFor("EnMAS-service", serverHost, port) ? Discovery
    }
    val replies = tries filter { future  ⇒ {
      try { 
        future.get match {
          case reply: DiscoveryReply  ⇒ true
          case _  ⇒ false
        }
      }
      catch { case _  ⇒ false }
    }}
    ClientManager.ScanResult(replies map {_.get.asInstanceOf[DiscoveryReply]})
  }

Мне интересно, есть ли более идиоматический способ сделать это? Я не мог найти много об этом, хотя я думаю, что этот вариант использования довольно распространен.


person Connor Doyle    schedule 23.11.2011    source источник


Ответы (1)


Похоже, вам нужен кластер. Пока не выйдет Akka 2.1 (со встроенной поддержкой кластеров), вы можете использовать что-то вроде ZooKeeper или JGroups или иным образом, чтобы узлы регистрировались при запуске и отменялись при выходе (или тайм-аут)

person Viktor Klang    schedule 23.11.2011
comment
Да, по сути, я настраиваю кластеры на лету, где каждый кластер имеет произвольный головной узел, который синхронизирует свои одноранговые узлы. Я надеялся остаться в рамках стандартных библиотек Scala и фреймворка Akka, чтобы избежать появления еще одной зависимости. Я должен быть охвачен супервизорами, которые в настоящее время встроены в Akka, но я с нетерпением жду предстоящей поддержки кластера. Спасибо за информацию. - person Connor Doyle; 23.11.2011
comment
Что ж, вы можете сделать это специально, имея узел рандеву, к которому вы подключаетесь и который отслеживает клиентов. Однако распределенное обнаружение ошибок далеко не тривиально, поэтому мы выпускаем кластеризацию в качестве основной функции для версии 2.1. - person Viktor Klang; 24.11.2011