Akka Cluster aware Router无法找到路由

时间:2013-10-22 17:29:16

标签: akka akka-cluster

这里粘贴了一个小例子:http://lpaste.net/94385

我希望能够启动主Dispatcher机器作为我的集群的种子节点。 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.

当我启动一个新的工作机器时,我可以看到它已加入集群,但发送到我的路由器的任何消息都被转发给了电子邮件。我不完全清楚文档的建议,因为启动新工作者应该更改集群成员,但无论我创建了多少新工作者,路由器仍然没有意识到它们。

如果我先启动一个工作节点,然后是调度程序,工作人员就会收到这些消息。

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

2 个答案:

答案 0 :(得分:2)

通过将配置更改为以下内容,我能够让您的示例正常工作:

/clusterDispatcher/clusterRouter {
  router = adaptive
  metrics-selector = mix
  cluster {
    enabled = on
    routees-path = "/user/clusterWorker"
    allow-local-routees = off
  }
}

我做的唯一改变是设置allow-local-routees = off。默认情况下,它处于打开状态,这意味着消息也将路由到保存路由器的同一节点。但是这不适用于您的示例,因为您没有在调度程序节点上创建clusterWorker。

答案 1 :(得分:1)

听起来您正在使用分组群集感知路由器。看看pooled cluster aware routers。如果分组路由器期望路由已经存在于远程节点上,则池化路由器会在具有指定角色的节点上创建它们,因此如果目标节点在路由器之前出现就可以了。

我们使用池化群集感知路由器来管理工作节点池。有关示例和一些友好指针,请查看我们的工程师Ryan Tanner的this post(具体来说,请参阅“不要在群集中拆分Superversion”标题)。

来自Ryan的whole series帖子旨在分享我们对Akka的早期学习,尤其是聚类。希望它有用!