Учитывая требование, наилучшим вариантом может быть использование 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}
}
}
}