我正在努力了解Akka和Akka群集。
到目前为止,当我在两个不同的控制台中分别启动每个actor系统时(即在各自的jvm中运行每个actor),我已经能够创建两个actor系统并将它们形成一个集群。
配置看起来像这样:
akka {
actor {
provider = cluster
deployment {
/workRouter {
router = round-robin-group
routees.paths = ["/user/worker"]
cluster {
enabled = on
allow-local-routees = on
}
}
}
}
remote {
netty.tcp {
hostname = ${clustering.host-ip} // this is over riden in the non-seed cluster
port = ${clustering.host-port}
}
}
cluster {
seed-nodes = [
"akka.tcp://"${clustering.name}"@"${clustering.router-seed-ip}":"${clustering.router-seed-port}
]
}
}
# variables
clustering {
host-ip = "127.0.0.1"
host-ip = ${?HOST_IP}
host-port = 2551
host-port = ${?HOST_PORT}
router-seed-ip = "127.0.0.1"
router-seed-ip = ${?ROUTER_CLUSTER_SEED_IP}
router-seed-port = 2551
router-seed-port = ${?ROUTER_CLUSTER_SEED_PORT}
name = "ExperimentCluster"
}
基本上,种子节点在127.0.0.1:2551上运行,非种子节点在127.0.0.1:2553上运行
接下来,我想在docker容器中运行它们中的每一个,并使它们仍然组成集群。他们的actor系统正在运行,但非种子似乎无法加入种子节点
这是我启动种子节点的方式:
docker run -p=2551:2551 --rm seedroute:0.1.0-SNAPSHOT
这就是我启动非种子节点的方式:
docker run -p=2551:2551 --rm workerroute:0.1.0-SNAPSHOT
但是在非种子节点的日志中,我看到以下内容:
[WARN] [11/24/2019 09:48:54.993] [ExperimentCluster-akka.actor.default-dispatcher-4] [akka.cluster.Cluster(akka://ExperimentCluster)] Cluster Node [akka.tcp://[email protected]:2553] - Couldn't join seed nodes after [22] attempts, will try again. seed-nodes=[akka.tcp://[email protected]:2551]
当我在单独的JVM上运行节点时,情况并非如此,这表明事实与docker和网络有关。我以为可以通过-p
标志并公开端口,但是显然我还不了解有关网络方面的更多信息。
我还没有使用docker-compose或docker swarm。我将最终使用其中之一,但是由于这是一次学习练习,因此我想在逐步使用这些工具时弄清楚各个部分和基本原理。
所以有人知道如何使它正常工作吗?基本上是在docker容器中手动启动两个Akka节点,并使它们能够相互通信并形成集群。
您所描述的正是您使用Docker Compose的原因-因此每个容器都可以部署到网络中,使它们能够相互通信。
如果您不想这样做,当然可以使用--net=host
将容器暴露给主机网络,并让它们直接直接通信-但是,这抵消了容器联网的许多好处首先,保持网络隔离并仅桥接/暴露端口入口点的能力实际上是您需要外部可访问的。
另一种选择是,对于希望插入到网络中的每个容器,使用多个撰写文件,然后根据https://docs.docker.com/compose/networking/#use-a-pre-existing-network将这些文件加入现有的命名网络中。