首页 > 解决方案 > 如何调用集群中不同节点上的actor?

问题描述

根据文档( https://getakka.net/articles/clustering/cluster-routing.html)和我阅读的各种教程和代码示例,这似乎是路由器发挥作用的地方。不过,似乎被忽略的是如何NodeB调用位于NodeA. 在微服务系统下,执行工作的“服务/参与者”可能完全位于另一个节点上。

所以看来我需要在集群中的每个节点上放置一个路由器。我有兴趣使用broadcast-pool基于池的路由器,根据文档,它们部署到他们的路由:

集群池路由器与组路由器的不同之处在于,它们将路由远程部署到目标节点上,而不是将消息路由到远程机器上可能存在或不存在的预定义参与者路径。

因此,复制基于池的路由器似乎也会复制跨节点的部署。

所以这似乎意味着您只需要一个基于池的路由器来避免这种部署重复?我想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我会使用它ActorSelection来获取路由器的句柄吗?我假设我需要定义路由器的完整路径才能做到这一点:akka.tcp://...

我想我的另一个选择是配置NodeB知道某些节点在哪里

  Context.ActorSelection("akka.tcp://MySystem@locationOfRouter:8000/user/deviceA").Tell(new MyMessage("UsefulInformation"));

我想NodeB已经需要知道在哪里连接到种子节点,所以在这种情况下,我将拥有完整路径,我可以在种子上定义路由器,然后使用参与者选择来处理这些路由器,这将需要对这些路径进行硬编码。我认为这种方法不太理想。

我也可能做错了事,也许这种方法会更好:Distributed Publish Subscribe in Cluster

https://getakka.net/articles/clustering/distributed-publish-subscribe.html

因为它特别指出:

如何在不知道它在哪个节点上运行的情况下向参与者发送消息?

这似乎有点像在虚空中大喊大叫并希望得到最好的结果,尤其是在需要回复的情况下,例如,调用一个会获取一些额外数据以返回给发送者的参与者。

标签: akka.netakka.net-cluster

解决方案


推荐阅读