Akka-Cluster Aware Routers

Cluster Aware Routers

所有的routers都可以感知到集群中的成员节点,即部署新的routees或在集群中的节点上查找routees。当节点变得unreachable或离开集群时,该节点的routees将自动从router注销。当新节点加入集群时,根据配置将额外的routees添加到router。当一个节点在unreachable之后再次reachable时,也将想router添加routees。

如果启用了该功能,则Cluster Aware Routers将使用状态为WeaklyUp的成员。

有两种不同类型的Router。

  • Group – 使用actor selection将消息发送到指定路径的router。routees可以在群集中不同节点上运行的router之间共享。 这种类型的router的一个例子是在群集中的一些后端节点上运行的服务,并且由在群集中的前端节点上运行的routers使用。
  • Pool –  创建routees作为子actor并将其部署在远程节点上的router。每个router都有自己的routee实例。 例如,如果在有10个节点的群集中的3个节点上启动router,且如果router配置为对每个节点使用一个实例,则总共将有30个routee。 不同router创建的routee不会被router共享。 这种类型的router的一个例子是单个router协调作业并将实际工作委派给在集群中的其他节点上运行的routee。

1.Router with Group of Routees

在使用Group时,您必须启动集群成员节点上的routee actor。 这不是由router完成的。 一个组的配置看起来像这样:

注意:

在启动Actor系统时,应该尽早启动routee actors,因为一旦成员状态改变为“Up”,router就会尝试使用它们。

routees.paths中没有定义actor路径的地址信息,通过选择router将消息转发到actor中。使用ActorSelection将消息转发到routees,所以应该期望相同的传递语义。 通过指定使用角色,可以将routees查找限制为标记有特定角色集的成员节点。

max-total-nr-of-instances定义了集群中路由的总数。 默认情况下,max-total-nr-of-instances被设置为一个很高的值(10000),当节点加入集群时将导致新的routees添加到router中。 如果要限制routees总数,请将其设置为较低的值。

也可以在代码中定义相同类型的router:

请参阅configuration以了解设置的进一步说明。

Router Example with Group of Routees

让我们来看看如何在组路由中使用cluster aware router,即路由器发送到某路径的路由。

示例应用程序提供了一个服务来计算文本的统计信息。 当一些文本被发送到服务时,它将其分解成单词,并委托任务来计算每个单词中的字符数量,以分配给单独的工作者:a routee of a router。 每个单词的字符数被发送回聚合器,收集所有结果后计算每个单词的平均字符数。

Messages:

计算每个字中字符数的工作人员:

从用户接收文本并将其分解成文字,代表工作人员和聚合的服务:

注意,到目前为止,没有特定的群集,只是普通的Actor

所有节点启动StatsService和StatsWorker actors。 请记住,routees 是这种情况下的worker。 router的配置routees.paths :

这意味着用户可以将请求发送到任何节点上的StatsService,并且将在所有节点上使用StatsWorker。

运行Router示例和Group of Routes的最简单的方法就是运行 Akka Cluster Sample with Java和本教程。 它包含有关Router Example with Group of Routees 示例的说明。 此示例的源代码可以在Akka Samples Repository中找到。

2.Router with Pool of Remote Deployed Routees

当使用在集群成员节点上创建和部署Pool with routees时,Router的配置如下所示:

通过指定使用角色,可以将routee限制部署到标有特定角色集的成员节点。

max-total-nr-of-instances定义了集群中routees的总数,但是不会超过每个节点的routees数:max-nr-of-instances-per-node。 默认情况下,max-total-nr-of-instances被设置为一个高值(10000),当节点加入集群时将导致新的routees添加到router中。 如果要限制routee总数,请将其设置为较低的值。

也可以在代码中定义相同类型的router:

请参阅configuration以了解设置的进一步说明。

Router Example with Pool of Remote Deployed Routees

我们来看看如何在创建和部署工作人员的单个主节点上使用集群感知路由器。 为了跟踪一个单例master,我们使用cluster-tools模块中的Cluster Singleton。 ClusterSingletonManager在每个节点上启动:

我们还需要每个节点上的actor来跟踪当前单例master的存在位置,并将作业委托给StatsService。 这是由ClusterSingletonProxy提供的:

ClusterSingletonProxy从用户接收文本,并委托给当前的StatsService(单例master)。 它监听群集事件以在最早的节点上查找StatsService。

所有节点都启动ClusterSingletonProxy和ClusterSingletonManager。 router的配置如下:

使用Router Example with Pool of Remote Deployed Routees 最简单的方法,自己下载运行 Akka Cluster Sample with Java并参阅本教程。 它包含有关如何运行Router Example with Pool of Remote Deployed Routees的说明。 此示例的源代码可以在 Akka Samples Repository

知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注