385.5. ZooKeeper 启用的路由策略
ZooKeeper 允许非常简单且有效的领导选举功能。此组件在 RoutePolicy 中利用这个选择功能来控制路由的时间和方式。此策略通常在故障切换场景中使用,以控制基于 Camel 的服务器集群中路由相同的实例。一个非常常见的场景是一个简单的"Master-Slave"设置,其中有多个路由在集群中分发,但只有一个实例(master)之一应该一次运行。如果主设备失败,则应从可用的 slaves 选择一个新的 master,并且应启动此新 master 中的路由。
该策略在将涉及选举的 RoutePolicy 的所有实例中使用通用 znode 路径。每个策略将其 id 写入这个节点,Zookeeper 将根据它收到的顺序对写操作进行排序。然后,策略读取节点列表以查看其 id 的位置;此位置用于确定是否应启动路由。该策略在启动时配置有路由实例数,应在集群中启动,如果其在列表中的位置小于这个值,则其路由将启动。对于主从方案,路由配置有 1 个路由实例,只有列表中的第一个条目才会启动其路由。所有策略都会监视对列表的更新,如果应该启动其路由,则会重新计算它们。有关 Zookeeper 的领导选举功能的更多信息,请参阅 此页面。
以下示例将节点 /someapplication/somepolicy 用于选举机制,并设置为只启动节点列表中的 top '1' 条目,如选择 master:
ZooKeeperRoutePolicy policy = new ZooKeeperRoutePolicy("zookeeper:localhost:39913/someapp/somepolicy", 1);
from("direct:policy-controlled")
.routePolicy(policy)
.to("mock:controlled");
目前,组件中定义了 3 个策略,不同的 SLA:
-
ZooKeeperRoutePolicy -
CuratorLeaderRoutePolicy(自 2.19开始) -
MultiMasterCuratorLeaderRoutePolicy(since 2.19)
ZooKeeperRoutePolicy 支持多个活跃节点,但只有在 Camel 组件及其对应 Consumer 启动后才会启动激活,这会根据您的路由定义,您组件可能已经开始使用事件并生成 'Exchange's 的风险,然后策略可能无法激活该节点。
CuratorLeaderRoutePolicy 只支持一个活跃的节点,但它绑定到不同的 CamelContext 生命周期方法;此策略在启动任何路由或消费者之前启动,因此您可以确保在策略决定之前没有处理任何节点。
MultiMasterCuratorLeaderRoutePolicy 支持多个活跃节点,并绑定到与 CuratorLeaderRoutePolicy 相同的生命周期方法;此策略在启动任何路由或消费者之前启动,因此您可以确保在策略决定之前没有处理。