我在以下图中显示了一个演员系统。
Master
|
|--Monitor
|
|--Supervisor
|
|--Device #1
|--Device #2
|-- ...
|--Device #N
大师演员开始监视器演员和主管演员。
监视器演员发出一条消息,告诉自己每30秒检查一次设备清单。对于库存中存在的每个设备,它向主管演员发送消息以注册设备。
主管演员从监视器演员接收消息以注册设备时启动设备演员。
该代码可在github上找到。
在单个JVM实例中,一切都很好,但是当涉及聚类模式时,我开始感到困惑。
正如我所期望的,通过以下配置,先前的演员树应在群集机中透明地运行。所有参与者都应在整个集群上创建,我不应该关心创建参与者的机器。
实例#1:
akka {
actor {
provider = "cluster"
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 2551
}
}
cluster {
seed-nodes = [
"akka.tcp://example@127.0.0.1:2551",
]
}
}
实例#2:
akka {
actor {
provider = "cluster"
}
remote {
log-remote-lifecycle-events = off
netty.tcp {
hostname = "127.0.0.1"
port = 2552
}
}
cluster {
seed-nodes = [
"akka.tcp://example@127.0.0.1:2551",
]
}
}
我期望的:
Master (On node 1)
|
|--Monitor (On node 2)
|
|--Supervisor (On node 2)
|
|--Device #1 (On node 1)
|--Device #2 (On node 1)
|-- ...
|--Device #N (On node 2)
但是,它最终在集群中运行了两个相同的演员树:每个节点分别运行一个演员树,如以下图所示:
Node 1 | Node2
|
Master | Master
| | |
|--Monitor | |--Monitor
| | |
|--Supervisor | |--Supervisor
| | |
|--Device #1 | |--Device #1
|--Device #2 | |--Device #2
|-- ... | |-- ...
|--Device #N | |--Device #N
我还试图在集群中以单身演员的身份运行大师演员,但最终在开始的节点上运行了一个演员树。
所以,我的问题是,我如何通过调用context.actorOf(DeviceActor.props(deviceId))
来在整个集群中创建一个演员,而无需小心地设计参与者树,然后用cluster singleton和cluster sharding?
您所描述的是Akka群集的确切定义。
当您需要在集群中的几个节点上分发演员并希望能够使用其逻辑标识符与它们交互时,群集成分很有用,但是不必关心群集中的物理位置,这也可能会改变随着时间的流逝。
设置它非常简单,尤其是如果您已经有一个群集。监视器将是一个群集单例,因此群集上只有一个活着,每个设备都是由设备ID标识的 Entity 。