根据文档(https://getakka.net/articles/clustering/cluster-routing.html)以及我阅读过的各种教程和代码示例,这似乎是路由器发挥作用的地方。似乎省略的是如何让NodeB
调用位于NodeA
的actor。在微服务系统下,"服务/演员"这项工作可能完全位于另一个节点上。
所以我似乎需要在集群中的每个节点上放置一个路由器。我有兴趣使用broadcast-pool
但使用基于池的路由器,根据文档,他们部署到他们的路由:
群集路由器与群组路由器的不同之处在于,它们将路由远程部署到目标节点上,而不是将消息路由到远程计算机上可能存在或可能不存在的预定义的actor路径。
因此,复制基于池的路由器似乎也会复制节点间的部署。
所以这似乎意味着你只想要一个基于池的路由器来避免这种部署重复?我想max-nr-of-instances-per-node
会限制它吗?
在我的情况下,我想使用角色来分配可用的地方:
akka {
actor{
provider = cluster
deployment {
/deviceA {
router = broadcast-pool
cluster {
enabled = on
allow-local-routees = off
use-role = deviceA
}
}
}
}
}
除此之外,如果我的actor在NodeB
上运行并希望调用位于另一个节点(微服务)上的另一个actor,如果NodeB
上没有定义路由器,我会使用{{1}获取路由器的句柄?我假设我需要完整的路径来定义路由器能够做到这一点:ActorSelection
我想我的另一个选择是配置akka.tcp://...
以了解某些节点的位置
NodeB
我认为 Context.ActorSelection("akka.tcp://MySystem@locationOfRouter:8000/user/deviceA").Tell(new MyMessage("UsefulInformation"));
已经需要知道连接到种子节点的位置,所以在这种情况下我会有完整的路径,我可以在种子上定义路由器,然后使用actor选择掌握这些路由器,这需要对这些路径进行硬编码。我认为这种方法不太可取。
我也可能做错了,也许这种做法会更好:NodeB
https://getakka.net/articles/clustering/distributed-publish-subscribe.html
因为它明确指出:
如何在不知道正在运行哪个节点的情况下向演员发送消息?
这似乎有点像喊到虚空并希望最好的,特别是如果某些事情需要回复,例如,调用一个演员来获取一些额外的数据以返回给发件人。