Как настроить игровое приложение с Akka для запуска в кластере - PullRequest
2 голосов
/ 29 июня 2019

У меня есть приложение PlayFramework (play-scala), которое я хочу запустить в кластере.Поэтому у меня может быть несколько Docker-контейнеров с этим образом приложения.Я не знаю их IP-адресов заранее, поскольку поставщик облачных услуг может запускать и останавливать их динамически, поэтому я не могу указать начальные узлы.Кроме того, все файлы application.conf должны быть одинаковыми для каждого экземпляра приложения?

Как настроить приложение воспроизведения, чтобы каждый экземпляр приложения мог обнаруживать и присоединяться к кластеру Akka?

Я смотрел: https://www.playframework.com/documentation/2.7.x/ScalaAkka#Akka-Cluster Кластер Akkaустановка с игровым каркасом https://github.com/lregnier/play-akka-cluster-aws

Нужно ли использовать Akka Cluster Bootstrap , поскольку я не могу указать начальные узлы?

Достаточно ли иметь следующее в файле application.conf (взято из Использование кластера :

akka {
  actor {
    provider = "cluster"
  }
  remote {
    log-remote-lifecycle-events = off
    netty.tcp {
      hostname = "127.0.0.1"
      port = 0
    }
  }

  cluster {
    seed-nodes = [
      "akka.tcp://ClusterSystem@127.0.0.1:2551",
      "akka.tcp://ClusterSystem@127.0.0.1:2552"]

    # auto downing is NOT safe for production deployments.
    # you may want to use it during development, read more about it in the docs.
    #
    # auto-down-unreachable-after = 10s
  }
}

Но без начальных узлов? Если да, то какобнаружить узел и присоединиться к кластеру?

1 Ответ

1 голос
/ 01 июля 2019

Учитывая требование, наилучшим вариантом может быть использование Akka Cluster Bootstrap. Для запуска служб на основе контейнеров service discovery с использованием AWS ECS или Kubernetes, вероятно, ближе к вашим потребностям.

Akka Cluster Bootstrap удовлетворяет вашу потребность в отсутствии предварительно назначенных начальных узлов с помощью автоматического механизма начальной загрузки кластера. Каждый из узлов исследует друг друга через свои открытые конечные точки HTTP, и если seed nodes не существует (т. Е. Не существует кластер), узел с «самым низким» адресом превращается в seed node, побуждая другие узлы присоединиться к вновь сформированному кластеру. , Подробнее см. Здесь Akka doc re: cluster bootstrap .

Как описано в документе Akka, Akka Cluster Bootstrap зависит от модулей Akka Discovery и Akka Management:

libraryDependencies ++= Seq(
  "com.lightbend.akka.management" %% "akka-management-cluster-bootstrap" % "1.0.1",
  "com.typesafe.akka" %% "akka-discovery" % "2.5.21"
)

Для service discovery using ECS присвойте aws-api-ecs или aws-api-ecs-async (для неблокирующего ввода-вывода) akka.discovery.method в application.conf, что может выглядеть примерно так:

akka {
  cluster {
    seed-nodes = []
    seed-nodes = ${?SEED_NODES}
  }
  # ...
  management {
    cluster.bootstrap {
      contact-point-discovery {
        required-contact-point-nr = 2
        required-contact-point-nr = ${?REQUIRED_CONTACT_POINTS}
      }
    }
    # ...
  }
  discovery {
    method = aws-api-ecs-async
    aws-api-ecs-async {
      cluster = "my-ecs-cluster"
    }
  }
}

Для service discovery using Kubernetes следует назначить akka.discovery.method kubernetes-api в application.conf, что может выглядеть следующим образом:

akka {
  cluster {
    seed-nodes = []
    seed-nodes = ${?SEED_NODES}
  }
  # ...
  management {
    cluster.bootstrap {
      contact-point-discovery {
        required-contact-point-nr = 2
        required-contact-point-nr = ${?REQUIRED_CONTACT_POINTS}
      }
    }
    # ...
  }
  discovery {
    method = kubernetes-api
    kubernetes-api {
      pod-namespace = "default"
      pod-namespace = ${?K8S_NAMESPACE}
      pod-label-selector = "app=akka-cluster"
      pod-label-selector = ${?K8S_SELECTOR}
      pod-port-name = "cluster-mgmt-port"
      pod-port-name = ${?K8S_MANAGEMENT_PORT}
    }
  }
}
...