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