Akka群集感知路由器无法找到路由对象

Akka群集感知路由器无法找到路由对象,akka,akka-cluster,Akka,Akka Cluster,此处粘贴了一个小示例: 我希望能够启动一台主调度程序计算机作为集群的种子节点。Dispatcher有一个群集感知路由器,指向群集的工作进程。我希望能够根据需要启动工作机器,并让调度路由器自动意识到它们的存在,以便它可以开始向它们发送工作 问题是,如果我首先启动Dispatcher机器(因为它是种子节点),集群感知路由器就会启动,并且找不到任何路由对象(很公平,它们还没有启动)。文件提到: The routee actors should be started as early as possib

此处粘贴了一个小示例:

我希望能够启动一台主调度程序计算机作为集群的种子节点。Dispatcher有一个群集感知路由器,指向群集的工作进程。我希望能够根据需要启动工作机器,并让调度路由器自动意识到它们的存在,以便它可以开始向它们发送工作

问题是,如果我首先启动Dispatcher机器(因为它是种子节点),集群感知路由器就会启动,并且找不到任何路由对象(很公平,它们还没有启动)。文件提到:

The routee actors should be started as early as possible when starting the
actor system, because the router will try to use them as soon as the member
status is changed to 'Up'. If it is not available at that point it will be
removed from the router and it will only re-try when the cluster members are changed.
当我启动一台新的工作机器时,我可以看到它已加入集群,但发送到路由器的任何消息都会转发到死信。我不完全清楚文档中的建议,因为启动新工人应该会更改集群成员,但不管我创建了多少新工人,路由器仍然没有意识到这些成员

如果我先启动一个worker节点,然后启动dispatcher,那么worker可以很好地接收消息


总而言之:我想要一个集群感知路由器,它可以在集群中的第一个种子节点上启动。任何包含路由器路由对象的新节点在加入群集时都应可供路由器使用。

听起来像是在使用分组群集感知路由器。看一看。如果分组路由器期望路由对象已经存在于远程节点上,则池路由器会在具有指定角色的节点上创建路由对象,因此,如果目标节点出现在路由器之前,则没有问题

我们使用集群感知路由器来管理工作节点池。举个例子和一些友好的提示,请看一下我们的工程师Ryan Tanner(具体来说,请参阅“不要在集群中拆分超级版本”标题)


来自Ryan的帖子旨在分享我们对Akka的一些早期学习,尤其是集群。希望对你有帮助

通过将配置更改为以下方式,我可以让您的示例正常工作:

/clusterDispatcher/clusterRouter {
  router = adaptive
  metrics-selector = mix
  cluster {
    enabled = on
    routees-path = "/user/clusterWorker"
    allow-local-routees = off
  }
}
我所做的唯一更改是将allow local routees=off设置为“允许本地路由”。默认情况下,它处于启用状态,这意味着消息也将路由到承载路由器的同一节点。但这在您的示例中不起作用,因为您没有在dispatcher节点上创建clusterWorker