【问题标题】:Akka Cluster aware Router unable to find routees [closed]Akka集群感知路由器无法找到路由[关闭]
【发布时间】:2013-10-22 17:29:16
【问题描述】:

这里贴一个小例子: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.

当我启动一台新的工作机器时,我可以看到它已加入集群,但发送到我的路由器的任何消息都会转发到死信。我对文档中的建议并不完全清楚,因为启动新工作人员应该更改集群成员,但无论我创建多少新工作人员,路由器仍然不会意识到他们。

如果我先启动一个worker节点,然后是dispatcher,那么worker就可以接收到消息了。

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

【问题讨论】:

    标签: akka akka-cluster


    【解决方案1】:

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

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

    我所做的唯一更改是设置 allow-local-routees = off。默认情况下,它是打开的,这意味着消息也将被路由到拥有路由器的同一节点。但这在您的示例中不起作用,因为您没有在调度程序节点上创建 clusterWorker。

    【讨论】:

      【解决方案2】:

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

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

      Ryan 的 whole series 帖子旨在分享我们对 Akka 尤其是集群的早期了解。希望对您有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多